Tính sẵn sàng cao là yếu tố bắt buộc khi bạn chạy các dịch vụ quan trọng trong môi trường sản xuất của mình. Nó có thể đạt được bằng cách loại bỏ tất cả các điểm lỗi đơn lẻ, bao gồm cả tầng cơ sở dữ liệu. Vì vậy, bạn có thể tưởng tượng sự ngạc nhiên của chúng tôi mỗi khi chúng tôi bắt đầu thiết lập với nhiều máy chủ web / ứng dụng đều đánh vào một phiên bản cơ sở dữ liệu duy nhất.
Dịch vụ sẵn có cao trong MongoDB có thể đạt được thông qua nhân rộng. Thuật ngữ tập hợp bản sao mô tả một thiết lập trong đó nhiều quy trình MongoDB chạy và duy trì cùng một dữ liệu. Trong blog này, chúng ta sẽ thảo luận về cách triển khai Máy chủ Percona cho MongoDB để đạt được tính khả dụng cao.
Triển khai Máy chủ Percona cho MongoDB
Chúng ta cần ít nhất 3 nút để có tính khả dụng cao, một tập hợp bản sao sẽ bao gồm 1 nút chính và 2 nút phụ. Bạn có thể sử dụng 2 nút, 1 nút chính và 1 nút phụ, nhưng bạn vẫn cần một trọng tài viên làm nút thứ ba. Trọng tài viên là một nút MongoDB không sao chép và lưu trữ dữ liệu, nhưng tham gia vào quá trình bầu cử của Chính mới khi chuyển đổi dự phòng xảy ra.
Trong ví dụ này, chúng tôi đang chạy 3 môi trường ảo với CentOS Linux phiên bản 7.3 làm hệ điều hành và sẽ sử dụng Máy chủ Percona cho MongoDB phiên bản 4.2 để cài đặt. Địa chỉ IP như sau:
- mongo-node8:10.10.10.17
- mongo-node9:10.10.10.18
- mongo-node10:10.10.10.19
Trước khi chúng tôi bắt đầu cài đặt, hãy đảm bảo rằng tất cả các nút đã được định cấu hình trong tệp / etc / hosts trên mỗi nút.
[[email protected] ~]# cat /etc/hosts
127.0.0.1 mongo-node9 mongo-node9
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.10.17 mongo-node8
10.10.10.18 mongo-node9
10.10.10.19 mongo-node10
Sau đó, chúng ta cần định cấu hình Kho lưu trữ Percona trên mỗi nút. Sau đó, kích hoạt kho lưu trữ cho psmdb42 như hình dưới đây:
[[email protected] ~]# percona-release setup psmdb42
* Disabling all Percona Repositories
* Enabling the Percona Server for MongoDB 4.2 repository
* Enabling the Percona Tools repository
<*> All done!
Và sau đó tiếp tục cài đặt Máy chủ Percona cho gói MongoDB:
[[email protected] ~]# yum install percona-server-mongodb*
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.mirror.angkasa.id
* extras: centos.mirror.angkasa.id
* updates: centos.mirror.angkasa.id
Resolving Dependencies
--> Running transaction check
---> Package percona-server-mongodb.x86_64 0:4.2.9-10.el7 will be installed
--> Processing Dependency: cyrus-sasl-gssapi for package: percona-server-mongodb-4.2.9-10.el7.x86_64
--> Processing Dependency: numactl for package: percona-server-mongodb-4.2.9-10.el7.x86_64
---> Package percona-server-mongodb-debuginfo.x86_64 0:4.2.9-10.el7 will be installed
---> Package percona-server-mongodb-mongos.x86_64 0:4.2.9-10.el7 will be installed
--> Processing Dependency: libcrypto.so.10(OPENSSL_1.0.2)(64bit) for package: percona-server-mongodb-mongos-4.2.9-10.el7.x86_64
---> Package percona-server-mongodb-server.x86_64 0:4.2.9-10.el7 will be installed
---> Package percona-server-mongodb-shell.x86_64 0:4.2.9-10.el7 will be installed
---> Package percona-server-mongodb-tools.x86_64 0:4.2.9-10.el7 will be installed
--> Running transaction check
---> Package cyrus-sasl-gssapi.x86_64 0:2.1.26-23.el7 will be installed
--> Processing Dependency: cyrus-sasl-lib(x86-64) = 2.1.26-23.el7 for package: cyrus-sasl-gssapi-2.1.26-23.el7.x86_64
---> Package numactl.x86_64 0:2.0.12-5.el7 will be installed
---> Package openssl-libs.x86_64 1:1.0.1e-60.el7_3.1 will be updated
--> Processing Dependency: openssl-libs(x86-64) = 1:1.0.1e-60.el7_3.1 for package: 1:openssl-1.0.1e-60.el7_3.1.x86_64
---> Package openssl-libs.x86_64 1:1.0.2k-19.el7 will be an update
--> Running transaction check
---> Package cyrus-sasl-lib.x86_64 0:2.1.26-20.el7_2 will be updated
---> Package cyrus-sasl-lib.x86_64 0:2.1.26-23.el7 will be an update
---> Package openssl.x86_64 1:1.0.1e-60.el7_3.1 will be updated
---> Package openssl.x86_64 1:1.0.2k-19.el7 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
================================================================
Package Arch Version Repository
Size
================================================================
Installing:
percona-server-mongodb x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
4.9 k
percona-server-mongodb-debuginfo
x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
885 M
percona-server-mongodb-mongos
x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
10 M
percona-server-mongodb-server
x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
22 M
percona-server-mongodb-shell x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
12 M
percona-server-mongodb-tools x86_64 4.2.9-10.el7 psmdb-42-release-x86_64
30 M
Installing for dependencies:
cyrus-sasl-gssapi x86_64 2.1.26-23.el7 base 41 k
numactl x86_64 2.0.12-5.el7 base 66 k
Updating for dependencies:
cyrus-sasl-lib x86_64 2.1.26-23.el7 base 155 k
openssl x86_64 1:1.0.2k-19.el7 base 493 k
openssl-libs x86_64 1:1.0.2k-19.el7 base 1.2 M
Transaction Summary
================================================================
Install 6 Packages (+2 Dependent packages)
Upgrade ( 3 Dependent packages)
Total download size: 960 M
Is this ok [y/d/N]:
. . . .
Installed:
percona-server-mongodb.x86_64 0:4.2.9-10.el7
percona-server-mongodb-debuginfo.x86_64 0:4.2.9-10.el7
percona-server-mongodb-mongos.x86_64 0:4.2.9-10.el7
percona-server-mongodb-server.x86_64 0:4.2.9-10.el7
percona-server-mongodb-shell.x86_64 0:4.2.9-10.el7
percona-server-mongodb-tools.x86_64 0:4.2.9-10.el7
Dependency Installed:
cyrus-sasl-gssapi.x86_64 0:2.1.26-23.el7
numactl.x86_64 0:2.0.12-5.el7
Dependency Updated:
cyrus-sasl-lib.x86_64 0:2.1.26-23.el7
openssl.x86_64 1:1.0.2k-19.el7
openssl-libs.x86_64 1:1.0.2k-19.el7
Lặp lại cài đặt trên các nút khác. Sau khi cài đặt xong, vui lòng thay đổi cấu hình bindIP trên /etc/mongod.conf từ Địa chỉ IP localhost thành tất cả Địa chỉ IP riêng như hình dưới đây:
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
Bạn cũng có thể hạn chế Địa chỉ IP trên tham số bindIP vì lý do bảo mật, chỉ cần thêm địa chỉ IP với dấu chấm phẩy làm dấu phân tách.
Đảm bảo chúng ta có thể kết nối vào phiên bản MongoDB giữa ba nút như ví dụ minh họa bên dưới:
[[email protected] ~]# mongo --host 10.10.10.19 --port 27017
Percona Server for MongoDB shell version v4.2.9-10
connecting to: mongodb://10.10.10.19:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("99afee8f-a194-4d0a-963a-6dfdc17f5bee") }
Percona Server for MongoDB server version: v4.2.9-10
Server has startup warnings:
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten]
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten] ** You can use percona-server-mongodb-enable-auth.sh to fix it.
2020-10-30T04:38:46.244+0000 I CONTROL [initandlisten]
Bước tiếp theo là định cấu hình tập bản sao trong MongoDB. Chúng ta cần chỉnh sửa tệp /etc/mongod.conf và bỏ ghi chú phần nhân bản và thêm tham số replSetName như hình dưới đây:
replication:
replSetName: "my-mongodb-rs"
Chúng tôi sử dụng tên tập hợp bản sao my-mongodb-rs trong cài đặt này. Sau khi cấu hình sao chép được thêm, hãy khởi động lại dịch vụ mongodb.
$ service mongod restart
Lặp lại cấu hình trên các nút khác.
Sau khi hoàn tất, chúng ta cần khởi tạo bản sao ở một trong các nút. Kết nối với mongodb và chạy lệnh rs.initiate () như hình dưới đây:
> rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "mongo-node8:27017",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604036305, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604036305, 1)
}
my-mongodb-rs:OTHER>
my-mongodb-rs:PRIMARY>
Như chúng ta có thể thấy trong các nút, nút đầu tiên mà chúng ta bắt đầu sao chép sẽ trở thành một nút CHÍNH. Chúng ta cần thêm phần còn lại của các nút để tham gia nhân rộng.
Thêm các nút khác bằng lệnh rs.add () trên các nút CHÍNH như bên dưới:
my-mongodb-rs:PRIMARY> rs.add("mongo-node9:27017");
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604037158, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604037158, 1)
}
my-mongodb-rs:PRIMARY> rs.add("mongo-node10:27017");
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604037170, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604037170, 1)
}
Một tùy chọn khác để bắt đầu Tập hợp bản sao bằng lệnh khởi chạy () là chuyển thông tin địa chỉ IP của nút cho tất cả các nút như được hiển thị bên dưới:
rs.initiate( {
_id: "my-mongodb-rs",
members: [
{ _id: 0, host: "mongo-node8:27017" },
{ _id: 1, host: "mongo-node9:27017" },
{ _id: 2, host: "mongo-node10:27017" }
] })
Chúng tôi có thể kiểm tra cụm tập hợp bản sao hiện tại bằng cách sử dụng lệnh rs.status () trên bất kỳ nút cụm nào:
my-mongodb-rs:PRIMARY> rs.status()
{
"set" : "my-mongodb-rs",
"date" : ISODate("2020-10-30T06:27:41.693Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"readConcernMajorityWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
"appliedOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
"lastDurableWallTime" : ISODate("2020-10-30T06:27:28.305Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1604039245, 1),
"lastStableCheckpointTimestamp" : Timestamp(1604039245, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2020-10-30T05:38:25.155Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1604036305, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 1,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"newTermStartDate" : ISODate("2020-10-30T05:38:25.171Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2020-10-30T05:38:25.180Z")
},
"members" : [
{
"_id" : 0,
"name" : "mongo-node8:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3014,
"optime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-10-30T06:27:28Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1604036305, 2),
"electionDate" : ISODate("2020-10-30T05:38:25Z"),
"configVersion" : 7,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "mongo-node9:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 226,
"optime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-10-30T06:27:28Z"),
"optimeDurableDate" : ISODate("2020-10-30T06:27:28Z"),
"lastHeartbeat" : ISODate("2020-10-30T06:27:40.520Z"),
"lastHeartbeatRecv" : ISODate("2020-10-30T06:27:40.519Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "mongo-node8:27017",
"syncSourceHost" : "mongo-node8:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 7
},
{
"_id" : 2,
"name" : "mongo-node10:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 201,
"optime" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1604039248, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-10-30T06:27:28Z"),
"optimeDurableDate" : ISODate("2020-10-30T06:27:28Z"),
"lastHeartbeat" : ISODate("2020-10-30T06:27:40.520Z"),
"lastHeartbeatRecv" : ISODate("2020-10-30T06:27:40.688Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "mongo-node8:27017",
"syncSourceHost" : "mongo-node8:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 7
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1604039248, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1604039248, 1)
}
Triển khai Máy chủ Percona cho MongoDB bằng ClusterControl
ClusterControl hỗ trợ triển khai Máy chủ Percona cho MongoDB. Các phiên bản được hỗ trợ bao gồm 3.4, 3.6, 4.0 và 4.2. Việc triển khai rất đơn giản, bạn chỉ cần vào Deploy và chọn tab MongoDB Replicaset như hình dưới đây:
Điền người dùng SSH, mật khẩu, cổng và tên cụm. ClusterControl yêu cầu bạn thiết lập SSH không mật khẩu giữa nút bộ điều khiển và nút cơ sở dữ liệu đích trước khi cài đặt. Sau khi điền đầy đủ thông tin, hãy nhấp vào Tiếp tục. Sẽ có một trang khác như hình bên dưới:
Chọn Percona làm Nhà cung cấp, chọn Phiên bản bạn muốn cài đặt. Nếu bạn có một thư mục dữ liệu MongoDB tùy chỉnh, bạn cần chỉ định nó. Đặt người dùng và mật khẩu quản trị viên cho MongoDB của bạn. Nếu bạn muốn sử dụng một cổng khác thay vì sử dụng mặc định (re. 27017), bạn có thể thay đổi nó thành một số cổng khác. Bước cuối cùng là điền địa chỉ IP của nút cơ sở dữ liệu mục tiêu của bạn vào hộp tổ hợp Thêm nút.
Sau khi hoàn tất, chỉ cần nhấp vào nút Triển khai. Nó sẽ kích hoạt một công việc để triển khai một cụm MongoDB như được hiển thị bên dưới:
Sau khi triển khai xong, bạn có thể xem trang Tổng quan mà bạn đã có 3 phiên bản Máy chủ Percona cho MongoDB đang hoạt động.
Chế độ xem cấu trúc liên kết bên dưới cho thấy rằng bạn có 1 nút Chính và 2 nút phụ: