Chức năng replica set trong MongoDB (P2)

Replica Set là Gì?

Replica Set là một tập hợp các máy chủ MongoDB được cấu hình để làm việc cùng nhau và duy trì một bản sao đồng bộ của dữ liệu. Nó giúp cung cấp tính năng sao lưu, khôi phục và chịu lỗi.

Giải Thích Các Thuật Ngữ Quan Trọng:

  • Replica Set (myReplicaSet): Tên của replica set. Đặt tên này theo ý muốn của bạn.
  • Members: Danh sách các thành viên (máy chủ) trong replica set. Mỗi thành viên có một ID và địa chỉ host.
  • Primary Node: Một trong các máy chủ chịu trách nhiệm chính cho việc đọc và ghi dữ liệu.
  • Secondary Node: Các máy chủ khác trong replica set, sao chép dữ liệu từ primary node và có thể đảm nhiệm chức năng đọc.
  • Arbiter: Một thành viên đặc biệt chỉ chịu trách nhiệm trong quá trình bầu chọn giữa các primary và secondary nodes.
  • rs.initiate(): Lệnh để khởi tạo replica set.
  • rs.status(): Lệnh để kiểm tra trạng thái của replica set.

Cấu hình

Start máy chủ

Zsh
mongod --port 27017 --dbpath /path/to/data/db1 --replSet myReplicaSet
mongod --port 27018 --dbpath /path/to/data/db2 --replSet myReplicaSet
mongod --port 27019 --dbpath /path/to/data/db3 --replSet myReplicaSet

Connect tới máy chủ

Zsh
mongo --host localhost:27017

Khởi tạo replica set

YAML
rs.initiate(
   {
      _id: "myReplicaSet",
      members: [
         { _id: 0, host: "localhost:27017" },
         { _id: 1, host: "localhost:27018" },
         { _id: 2, host: "localhost:27019" }
      ]
   }
)

# Or

rs.add("localhost:27018")
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1703576990, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1703576990, 1)
}

rs.add("localhost:27019")
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1703577014, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1703577014, 1)
}

Kiểm Tra Trạng Thái Replica Set

Zsh
rs.status()

{
	"set" : "myReplicaSet",
	"date" : ISODate("2023-12-26T07:51:22.433Z"),
	"myState" : 1,
	"term" : NumberLong(6),
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"majorityVoteCount" : 2,
	"writeMajorityCount" : 2,
	"votingMembersCount" : 3,
	"writableVotingMembersCount" : 3,
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1703577081, 1),
			"t" : NumberLong(6)
		},
		"lastCommittedWallTime" : ISODate("2023-12-26T07:51:21.974Z"),
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1703577081, 1),
			"t" : NumberLong(6)
		},
		"appliedOpTime" : {
			"ts" : Timestamp(1703577081, 1),
			"t" : NumberLong(6)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1703577081, 1),
			"t" : NumberLong(6)
		},
		"lastAppliedWallTime" : ISODate("2023-12-26T07:51:21.974Z"),
		"lastDurableWallTime" : ISODate("2023-12-26T07:51:21.974Z")
	},
	"lastStableRecoveryTimestamp" : Timestamp(1703577061, 1),
	"electionCandidateMetrics" : {
		"lastElectionReason" : "electionTimeout",
		"lastElectionDate" : ISODate("2023-12-26T07:42:21.741Z"),
		"electionTerm" : NumberLong(6),
		"lastCommittedOpTimeAtElection" : {
			"ts" : Timestamp(0, 0),
			"t" : NumberLong(-1)
		},
		"lastSeenOpTimeAtElection" : {
			"ts" : Timestamp(1703576189, 1),
			"t" : NumberLong(5)
		},
		"numVotesNeeded" : 2,
		"priorityAtElection" : 1,
		"electionTimeoutMillis" : NumberLong(10000),
		"numCatchUpOps" : NumberLong(0),
		"newTermStartDate" : ISODate("2023-12-26T07:42:21.788Z"),
		"wMajorityWriteAvailabilityDate" : ISODate("2023-12-26T07:42:22.347Z")
	},
	"members" : [
		{
			"_id" : 2,
			"name" : "localhost:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 553,
			"optime" : {
				"ts" : Timestamp(1703577081, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2023-12-26T07:51:21Z"),
			"lastAppliedWallTime" : ISODate("2023-12-26T07:51:21.974Z"),
			"lastDurableWallTime" : ISODate("2023-12-26T07:51:21.974Z"),
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1703576541, 1),
			"electionDate" : ISODate("2023-12-26T07:42:21Z"),
			"configVersion" : 17,
			"configTerm" : 6,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 3,
			"name" : "localhost:27018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 88,
			"optime" : {
				"ts" : Timestamp(1703577071, 1),
				"t" : NumberLong(6)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1703577071, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2023-12-26T07:51:11Z"),
			"optimeDurableDate" : ISODate("2023-12-26T07:51:11Z"),
			"lastAppliedWallTime" : ISODate("2023-12-26T07:51:21.974Z"),
			"lastDurableWallTime" : ISODate("2023-12-26T07:51:21.974Z"),
			"lastHeartbeat" : ISODate("2023-12-26T07:51:20.928Z"),
			"lastHeartbeatRecv" : ISODate("2023-12-26T07:51:20.928Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncSourceHost" : "localhost:27017",
			"syncSourceId" : 2,
			"infoMessage" : "",
			"configVersion" : 17,
			"configTerm" : 6
		},
		{
			"_id" : 4,
			"name" : "localhost:27019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 65,
			"optime" : {
				"ts" : Timestamp(1703577071, 1),
				"t" : NumberLong(6)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1703577071, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2023-12-26T07:51:11Z"),
			"optimeDurableDate" : ISODate("2023-12-26T07:51:11Z"),
			"lastAppliedWallTime" : ISODate("2023-12-26T07:51:21.974Z"),
			"lastDurableWallTime" : ISODate("2023-12-26T07:51:21.974Z"),
			"lastHeartbeat" : ISODate("2023-12-26T07:51:20.929Z"),
			"lastHeartbeatRecv" : ISODate("2023-12-26T07:51:20.981Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncSourceHost" : "localhost:27018",
			"syncSourceId" : 3,
			"infoMessage" : "",
			"configVersion" : 17,
			"configTerm" : 6
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1703577081, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1703577081, 1)
}

Kết luận

Replica Set trong MongoDB là một tính năng quan trọng giúp tăng cường khả năng chịu lỗi và khả năng mở rộng của hệ thống cơ sở dữ liệu. Bằng cách cấu hình và sử dụng đúng cách, chúng ta có thể đạt được sự ổn định và hiệu suất cao. Hãy tận dụng sức mạnh của Replica Set để xây dựng hệ thống MongoDB mạnh mẽ và linh hoạt.

Cảm ơn mọi người đã đọc.

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *