BÀI VIẾT

Hướng dẫn cấu hình Replica Set cho MongoDB trên Ubuntu 22.04 LTS

349
author Nguyễn Ngọc Đang - 2022-07-13 15:21:39 (GMT+7)

Giới thiệu

Replica set trong MongoDB là một nhóm các mongod processes để duy trì cùng một cơ sở dữ liệu. Replica set cung cấp khả năng dự phòng và tính sẵn sàng cao.

Replication cung cấp tính dự phòng và nâng cao tính khả dụng của mongoDB. Với nhiều bản sao chép trên nhiều database server khác nhau, replication nâng cao mức độ chịu lỗi chống lại việc mất dữ liệu trên single database.

Trong một số trường hợp, replication có thể cải thiện khả năng đọc dữ liệu vì client có thể đọc dữ liệu trên nhiều database server khác nhau. Duy trì các bản sao dữ liệu làm tăng tính cục bộ và khả dụng của dữ liệu.

Các replica set cũng có thể duy trì cho các mục đích như khôi phục dữ liệu, sao lưu.

Điều kiện tiên quyết

Để hoàn thành hướng dẫn này, chúng ta sẽ cần:

Trong hướng dẫn này sẽ sử dụng 3 máy chủ lần lượt có IP và hostname như sau:

  • 10.123.11.36 mongodb0.replset.member
  • 10.123.12.165 mongodb1.replset.member
  • 10.123.12.186 mongodb2.replset.member

Trong đó chúng ta cấu hình replica set với 3 node (1primary và 2 slave) với 10.123.11.36 là primary và 10.123.12.165 và 10.123.12.186 lần lượt là slave 1 và slave 2.

Cấu hình phân giải DNS

Trước tiên, chúng ta sẽ cần thiết lập phân giải DNS trên mỗi máy chủ để chúng có thể giao tiếp với nhau bằng tên máy chủ.

Tiến hành sửa file /etc/hosts trên mỗi node và thêm các dòng sau:

bash (root)
vi /ets/hosts

Thêm các dòng sau:

/etc/hosts
10.123.11.36 mongodb0.replset.member
10.123.12.165 mongodb1.replset.member
10.123.12.186 mongodb2.replset.member

Lưu và đóng file.

Chúng ta có thể tiến hành bước tiếp theo.

Cấu hình node primary

Bước này thực hiện bằng cách chỉnh sửa file cấu hình của MongoDB /etc/mongod.conf của node primary.

Tìm phần network interfaces trong file /etc/mongod.conf

/etc/mongod.conf
. . .
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1
. . .

Thêm dấu , vào dòng bindIp bằng tên máy chủ như sau:

/etc/mongod.conf
. . .
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,mongodb0.replset.member
. . .

Tiếp theo, tìm dòng #replication: ở cuối file. Bỏ ghi chú dòng này bằng cách bỏ dấu thăng (#). Sau đó, thêm một replSetName, theo sau là tên mà MongoDB sẽ sử dụng để xác định tập hợp bản sao:

/etc/mongod.conf
. . .
replication:
  replSetName: "replica0"
. . . 

Trong ví dụ này, replSetName giá trị của chỉ thị là "replica0". Chúng ta có thể cung cấp bất kỳ tên nào chúng ta muốn ở đây.

Lưu ý: Có hai khoảng trắng trước replSetName và tên được đặt trong dấu ngoặc kép (").

Lưu và đóng file. Như vậy chúng ta đã cấu hình node primary tiếp theo tiến hành cấu hình node slave.

Cấu hình node slave

Tiếp theo, chúng ta sẽ cần phải cấu hình 2 node Slave MongoDB .

Bước này thực hiện bằng cách chỉnh sửa file cấu hình của MongoDB /etc/mongod.conf của node Slave 1.

Tìm phần network interfaces trong file /etc/mongod.conf

/etc/mongod.conf
. . .
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1
. . .

Thêm dấu , vào dòng bindIp bằng tên máy chủ như sau:

/etc/mongod.conf
. . .
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,mongodb1.replset.member
. . .

Tiếp theo, tìm dòng #replication: ở cuối file. Bỏ ghi chú dòng này bằng cách bỏ dấu thăng (#). Sau đó, thêm một replSetName, theo sau là tên mà MongoDB sẽ sử dụng để xác định tập hợp bản sao:

/etc/mongod.conf
. . .
replication:
  replSetName: "replica0"
. . . 

Trong ví dụ này, replSetName giá trị của chỉ thị là "replica0".

Lưu ý: Có hai khoảng trắng trước replSetName và tên được đặt trong dấu ngoặc kép (").

Lưu và đóng file. Như vậy chúng ta đã cấu hình node Slave 1 thành công tiếp theo tiến hành cấu hình node Slave 2.

Bước này thực hiện bằng cách chỉnh sửa file cấu hình của MongoDB /etc/mongod.conf của node Slave 2.

Tìm phần network interfaces trong file /etc/mongod.conf

/etc/mongod.conf
. . .
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1
. . .

Thêm dấu , vào dòng bindIp bằng tên máy chủ như sau:

/etc/mongod.conf
. . .
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,mongodb2.replset.member
. . .

Tiếp theo, tìm dòng #replication: ở cuối file. Bỏ ghi chú dòng này bằng cách bỏ dấu thăng (#). Sau đó, thêm một replSetName, theo sau là tên mà MongoDB sẽ sử dụng để xác định tập hợp bản sao:

/etc/mongod.conf
. . .
replication:
  replSetName: "replica0"
. . . 

Trong ví dụ này, replSetName giá trị của chỉ thị là "replica0".

Lưu ý: Có hai khoảng trắng trước replSetName và tên được đặt trong dấu ngoặc kép (").

Lưu và đóng file. Như vậy chúng ta đã cấu hình node Slave 2 thành công.

Tại thời điểm này, tất cả các node đã được cấu hình.

Khởi động lại dịch vụ MongoDB trên tất cả các node

Tiếp theo, bạn sẽ cần khởi động lại dịch vụ MongoDB trên tất cả các node lần lượt.

Trên node primary, khởi động lại dịch vụ MongoDB bằng lệnh sau:

bash (root)
systemctl restart mongod

Trên Slave 1, khởi động lại dịch vụ MongoDB bằng lệnh sau:

bash (root)
systemctl restart mongod

Trên Slave 2, khởi động lại dịch vụ MongoDB bằng lệnh sau:

bash (root)
systemctl restart mongod

Thiết lập Replica Set

Tiếp theo, chúng ta sẽ cấu hình replicate trên node primary và các node slave.

Trên node primary, kết nối với Mongo bằng người dùng quản trị:

bash (root)
mongo -u 123host -p --authenticationDatabase admin

Tiếp theo, khởi tạo tập hợp bản sao bằng lệnh sau:

bash (root)
> rs.initiate()

Kết quả trả về như sau:

Kết quả
{
    "info2" : "no configuration specified. Using a default configuration for the set",
    "me" : "mongodb0.replset.member:27017",
    "ok" : 1
}

Tiếp theo, thêm node Slave 1 làm thành viên bằng lệnh sau:

Thực thi lệnh sau:

bash (root)
replica0:SECONDARY> rs.add("mongodb1.replset.member")

Thu được kết quả:

Kết quả
{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1657616895, 1),
        "signature" : {
            "hash" : BinData(0,"WDrhuhAVIodlMnUfMQrWBXjCBgI="),
            "keyId" : NumberLong("7119410177228406790")
        }
    },
    "operationTime" : Timestamp(1657616895, 1)
}

Tiếp theo, thêm node Slave 2 làm thành viên bằng lệnh sau:

bash (root)
replica0:PRIMARY> rs.add("mongodb2.replset.member")

Kết quả như sau:

Kết quả
{
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1657616913, 1),
        "signature" : {
            "hash" : BinData(0,"bgQsDCY3lo26s7C+8we0B28Q2ZU="),
            "keyId" : NumberLong("7119410177228406790")
        }
    },
    "operationTime" : Timestamp(1657616913, 1)
}

Chúng ta cũng có thể kiểm tra trạng thái của tất cả các node bằng lệnh sau;

bash (root)
replica0:PRIMARY> rs.status()

Kết quả như sau:

Kết quả
{
    "set" : "replica0",
    "date" : ISODate("2022-07-12T09:08:54.094Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "majorityVoteCount" : 2,
    "writeMajorityCount" : 2,
    "votingMembersCount" : 3,
    "writableVotingMembersCount" : 3,
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1657616917, 1),
            "t" : NumberLong(1)
        },
        "lastCommittedWallTime" : ISODate("2022-07-12T09:08:37.945Z"),
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1657616917, 1),
            "t" : NumberLong(1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1657616917, 1),
            "t" : NumberLong(1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1657616917, 1),
            "t" : NumberLong(1)
        },
        "lastAppliedWallTime" : ISODate("2022-07-12T09:08:37.945Z"),
        "lastDurableWallTime" : ISODate("2022-07-12T09:08:37.945Z")
    },
    "lastStableRecoveryTimestamp" : Timestamp(1657616913, 1),
    "electionCandidateMetrics" : {
        "lastElectionReason" : "electionTimeout",
        "lastElectionDate" : ISODate("2022-07-12T09:07:34.375Z"),
        "electionTerm" : NumberLong(1),
        "lastCommittedOpTimeAtElection" : {
            "ts" : Timestamp(1657616854, 1),
            "t" : NumberLong(-1)
        },
        "lastSeenOpTimeAtElection" : {
            "ts" : Timestamp(1657616854, 1),
            "t" : NumberLong(-1)
        },
        "numVotesNeeded" : 1,
        "priorityAtElection" : 1,
        "electionTimeoutMillis" : NumberLong(10000),
        "newTermStartDate" : ISODate("2022-07-12T09:07:34.401Z"),
        "wMajorityWriteAvailabilityDate" : ISODate("2022-07-12T09:07:34.413Z")
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "mongodb0.replset.member:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 108,
            "optime" : {
                "ts" : Timestamp(1657616917, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2022-07-12T09:08:37Z"),
            "lastAppliedWallTime" : ISODate("2022-07-12T09:08:37.945Z"),
            "lastDurableWallTime" : ISODate("2022-07-12T09:08:37.945Z"),
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "Could not find member to sync from",
            "electionTime" : Timestamp(1657616854, 2),
            "electionDate" : ISODate("2022-07-12T09:07:34Z"),
            "configVersion" : 5,
            "configTerm" : 1,
            "self" : true,
            "lastHeartbeatMessage" : ""
        },
        {
            "_id" : 1,
            "name" : "mongodb1.replset.member:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 38,
            "optime" : {
                "ts" : Timestamp(1657616917, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1657616917, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2022-07-12T09:08:37Z"),
            "optimeDurableDate" : ISODate("2022-07-12T09:08:37Z"),
            "lastAppliedWallTime" : ISODate("2022-07-12T09:08:37.945Z"),
            "lastDurableWallTime" : ISODate("2022-07-12T09:08:37.945Z"),
            "lastHeartbeat" : ISODate("2022-07-12T09:08:53.960Z"),
            "lastHeartbeatRecv" : ISODate("2022-07-12T09:08:53.978Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncSourceHost" : "mongodb0.replset.member:27017",
            "syncSourceId" : 0,
            "infoMessage" : "",
            "configVersion" : 5,
            "configTerm" : 1
        },
        {
            "_id" : 2,
            "name" : "mongodb2.replset.member:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 20,
            "optime" : {
                "ts" : Timestamp(1657616917, 1),
                "t" : NumberLong(1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1657616917, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2022-07-12T09:08:37Z"),
            "optimeDurableDate" : ISODate("2022-07-12T09:08:37Z"),
            "lastAppliedWallTime" : ISODate("2022-07-12T09:08:37.945Z"),
            "lastDurableWallTime" : ISODate("2022-07-12T09:08:37.945Z"),
            "lastHeartbeat" : ISODate("2022-07-12T09:08:53.958Z"),
            "lastHeartbeatRecv" : ISODate("2022-07-12T09:08:52.972Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncSourceHost" : "mongodb1.replset.member:27017",
            "syncSourceId" : 1,
            "infoMessage" : "",
            "configVersion" : 5,
            "configTerm" : 1
        }
    ],
    "ok" : 1,
    "$clusterTime" : {
        "clusterTime" : Timestamp(1657616917, 1),
        "signature" : {
            "hash" : BinData(0,"5aFVC6b+kGvrgwtEf/rGMPRyepM="),
            "keyId" : NumberLong("7119410177228406790")
        }
    },
    "operationTime" : Timestamp(1657616917, 1)
}

Như vậy chúng ta đã tạo thành công Replica Set cho MongoDB trên Ubuntu 22.04 LTS.

Thử nghiệm Replica Set

Bản sao được cấu hình trên node chính. Bây giờ, chúng ta thực hiện kiểm tra xem bản sao có hoạt động hay không.

Trên node primary, tạo cơ sở dữ liệu và thêm một số giá trị.

Tiến hành kết nối mongo Shell bằng lệnh sau:

bash (root)
mongo -u 123host -p --authenticationDatabase admin

Tạo cơ sở dữ liệu và thêm một số giá trị.

bash (root)
replica0:PRIMARY> use 123hostDB
switched to db 123hostDB
replica0:PRIMARY> for (var i = 0; i <= 10; i++) db.example123HOST.insert( { x : i } )

Đầu ra:

Kết quả
WriteResult({ "nInserted" : 1 })

Kiểm tra cơ sở dữ liệu của bạn bằng lệnh sau:

bash (root)
replica0:PRIMARY> show dbs

Đầu ra:

Kết quả
123hostDB  0.000GB
admin      0.000GB
config     0.000GB
local      0.000GB

Sau đó thực hiện node Slave 1, kết nối với Mongo shell bằng lệnh sau:

bash (root)
mongo -u 123host -p --authenticationDatabase admin

Sau khi kết nối, hãy chạy lệnh sau để bật các hoạt động đọc thành viên phụ trên cơ sở kết nối:

bash (root)
replica0:SECONDARY> db.getMongo().setSecondaryOk()

Tiếp theo, thay đổi cơ sở dữ liệu thành 123hostDB:

bash (root)
replica0:SECONDARY> use 123hostDB

Kết quả:

Kết quả
switched to db 123hostDB

Tiếp theo, chạy lệnh sau để hiển thị tất cả các tài liệu:

Nếu bản sao đang hoạt động, chúng ta sẽ thấy danh sách các tài liệu mẫu mà chúng ta đã tạo trên node primary.

Kết quả
replica0:SECONDARY> db.example123HOST.find()
{ "_id" : ObjectId("62cd3a6b0fb28a85641994c5"), "x" : 0 }
{ "_id" : ObjectId("62cd3a6b0fb28a85641994c6"), "x" : 1 }
{ "_id" : ObjectId("62cd3a6b0fb28a85641994c7"), "x" : 2 }
{ "_id" : ObjectId("62cd3a6c0fb28a85641994c8"), "x" : 3 }
{ "_id" : ObjectId("62cd3a6c0fb28a85641994c9"), "x" : 4 }
{ "_id" : ObjectId("62cd3a6c0fb28a85641994ca"), "x" : 5 }
{ "_id" : ObjectId("62cd3a6c0fb28a85641994cb"), "x" : 6 }
{ "_id" : ObjectId("62cd3a6c0fb28a85641994cc"), "x" : 7 }
{ "_id" : ObjectId("62cd3a6c0fb28a85641994cd"), "x" : 8 }
{ "_id" : ObjectId("62cd3a6c0fb28a85641994ce"), "x" : 9 }
{ "_id" : ObjectId("62cd3a6c0fb28a85641994cf"), "x" : 10 }
{ "_id" : ObjectId("62cd3ac50fb28a85641994d0"), "x" : 0 }
{ "_id" : ObjectId("62cd3ac60fb28a85641994d1"), "x" : 1 }
{ "_id" : ObjectId("62cd3ac60fb28a85641994d2"), "x" : 2 }
{ "_id" : ObjectId("62cd3ac60fb28a85641994d3"), "x" : 3 }
{ "_id" : ObjectId("62cd3ac60fb28a85641994d4"), "x" : 4 }
{ "_id" : ObjectId("62cd3ac60fb28a85641994d5"), "x" : 5 }
{ "_id" : ObjectId("62cd3ac60fb28a85641994d6"), "x" : 6 }
{ "_id" : ObjectId("62cd3ac60fb28a85641994d7"), "x" : 7 }
{ "_id" : ObjectId("62cd3ac60fb28a85641994d8"), "x" : 8 }

Lời Kết

Như vậy chúng ta đã cấu hình Replica Set cho MongoDB trên Ubuntu 22.04 LTS chúc các bạn thành công.


Bạn có làm được theo hướng dẫn này không?

Bài liên quan

Hướng dẫn thiết lập bảo mật máy chủ MongoDB
Hướng dẫn thiết lập bảo mật máy chủ MongoDB
Hướng dẫn cấu hình sao lưu tự động MongoDB lên Google Drive
Hướng dẫn cấu hình sao lưu tự động MongoDB lên Google Drive
Hướng dẫn cài đặt MongoDB trên Ubuntu 22.04 LTS
Hướng dẫn cài đặt MongoDB trên Ubuntu 22.04 LTS

Cloud VPS tại 123HOST

Hiệu năng, ổn định và bảo mật

Cloud VPS giá rẻ

Thuê Server Riêng

Chi phí thấp, cấu hình cao

Thuê Server Riêng
Thông tin tác giả
Bình luận

Tính năng đang được phát triển

Đang tải bình luận