NoSQLデータベースのケースコンバット--MongoDBデータベースの高可用性ソリューション--MongoDBレプリケーションセット(マスタースレーブレプリケーション)

序文

この環境は、mongodb-enterprise-4.2.8学習環境を構築するためのCentos 7.8システムに基づいています。
具体的な構築については、mongodb-enterprise-4.2.8環境構築を参照してください。

MongoDBレプリケーションは、データを複数のサーバーに同期するプロセスです。レプリケーションセットは、データの冗長バックアップを提供し、データの可用性を向上させ、通常はデータのセキュリティを確保します。レプリケーションセットを使用すると、技術者はハードウェア障害やサービスの中断からデータを回復できます。


1. MongoDBレプリカセットとは何ですか?

レプリカセットとは

  • データセキュリティを確保する
  • データの冗長性とバックアップ
  • 高いデータ可用性(24 * 7)
  • 災害からの回復
  • メンテナンス(バックアップ、インデックスの再作成、圧縮など)のダウンタイムはありません
  • 分散読み取りデータ
  • レプリカセットは、アプリケーション層に対して透過的です(エンドユーザーに対して)

MongoDBレプリカセットの動作原理

  • 1. mongodbのレプリケーションセットには、少なくとも2つのノードが必要です。それらの1つは、クライアント要求の処理を担当するマスターノードであり、残りは、マスターノード上のデータのコピーを担当するスレーブノードです。
  • 2. mongodbの各ノードの一般的な選点法は、1つのマスターと1つのスレーブ、1つのマスターと複数のスレーブです。
  • 3.マスターノードはすべての操作oplogを記録し、スレーブノードは定期的にマスターノードをポーリングしてこれらの操作を取得し、スレーブノードのデータの一貫性を確保するために独自のデータコピーでこれらの操作を実行します。マスターノードで

2.MongoDBレプリカセットアーキテクチャの設計

ここに画像の説明を挿入
MongoDBレプリカセットの機能

  • Nノードクラスター
  • 任意のノードをマスターノードとして使用できます
  • すべての書き込み操作はマスターノード上で行われます
  • 自動フェイルオーバー
  • 自動回復

3、MongoDBレプリケーションセットの実際のケース

1.MongoDBレプリカセットのデプロイ

環境への備え

役割 ホスト ip mongodbバージョン
主人 node01 192.168.5.11 mongodb-enterprise-4.2.8
slave1 node02 192.168.5.12 mongodb-enterprise-4.2.8
slave2 node03 192.168.5.13 mongodb-enterprise-4.2.8

MongoDB構成ファイルを変更する

# 所有节点修改
--- node01
[root@node01 ~]# vim /etc/mongod.conf
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.5.11
replication:
  oplogSizeMB: 1024
  replSetName: myRs
[root@node01 ~]# systemctl restart mongod

--- node02
[root@node02 ~]# vim /etc/mongod.conf
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.5.12
replication:
  oplogSizeMB: 1024
  replSetName: myRs
[root@node02 ~]# systemctl restart mongod
  
--- node03
[root@node03 ~]# vim /etc/mongod.conf
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.5.13
replication:
  oplogSizeMB: 1024
  replSetName: myRs
[root@node03 ~]# systemctl restart mongod

マスターノードを構成する

# 登录MongoDB
[root@node01 ~]# mongo
MongoDB shell version v4.2.8

# 查看ReplSet状态
MongoDB Enterprise > rs.status()
{
    
    
	"operationTime" : Timestamp(0, 0),
	"ok" : 0,
	"errmsg" : "no replset config has been received",
	"code" : 94,
	"codeName" : "NotYetInitialized",
	"$clusterTime" : {
    
    
		"clusterTime" : Timestamp(0, 0),
		"signature" : {
    
    
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

# 初始化ReplSet复制集
MongoDB Enterprise > rs.initiate({
    
    _id:'myRS',members:[{
    
    _id:1,host:'192.168.5.11:27017'}]})
{
    
    
	"ok" : 1,
	"$clusterTime" : {
    
    
		"clusterTime" : Timestamp(1613533287, 1),
		"signature" : {
    
    
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1613533287, 1)
}

ReplSetのステータスを再度確認し
ここに画像の説明を挿入
て、マスターにスレーブノードを追加します

MongoDB Enterprise myRS:PRIMARY> rs.add('192.168.5.12:27017','192.168.5.13:27017')
{
    
    
	"ok" : 1,
	"$clusterTime" : {
    
    
		"clusterTime" : Timestamp(1613534429, 1),
		"signature" : {
    
    
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1613534429, 1)
}

ReplSetステータスの表示
ここに画像の説明を挿入

マスターノードは、マスタースレーブ同期をテストするためにデータを挿入します

主な挿入データ

# 插入数据
MongoDB Enterprise myRS:PRIMARY> use test
switched to db test

MongoDB Enterprise myRS:PRIMARY> for(var i =0; i <4; i ++){
    
    db.user.insert({
    
    userName:'my'+i,age:i})}
WriteResult({
    
     "nInserted" : 1 })

# 查看数据
MongoDB Enterprise myRS:PRIMARY> db.user.find()
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15a"), "userName" : "my0", "age" : 0 }
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15b"), "userName" : "my1", "age" : 1 }
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15c"), "userName" : "my2", "age" : 2 }
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15d"), "userName" : "my3", "age" : 3 }

slave01ビュー
ここに画像の説明を挿入

slave02ビュー
ここに画像の説明を挿入
MongoDBレプリケーションセットが成功しました!!!

2.マスター障害をシミュレートして、フェイルオーバーと障害回復を実現します

マスターノードのシャットダウンをシミュレートする

MongoDB Enterprise myRS:PRIMARY> use admin
switched to db admin
MongoDB Enterprise myRS:PRIMARY> db.shutdownServer()
2021-02-17T12:30:51.021+0800 I  NETWORK  [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer
server should be down...
2021-02-17T12:30:51.038+0800 I  NETWORK  [js] trying reconnect to 127.0.0.1:27017 failed
2021-02-17T12:30:51.038+0800 I  NETWORK  [js] reconnect 127.0.0.1:27017 failed failed 
2021-02-17T12:30:51.042+0800 I  NETWORK  [js] trying reconnect to 127.0.0.1:27017 failed
2021-02-17T12:30:51.042+0800 I  NETWORK  [js] reconnect 127.0.0.1:27017 failed failed 
MongoDB Enterprise > 

node03ビュー

node02をマスター
ここに画像の説明を挿入
node02に切り替えて、3つのレコードを表示および挿入します

[root@node02 ~]# mongo
MongoDB shell version v4.2.8
MongoDB Enterprise myRS:PRIMARY> use test
switched to db test
MongoDB Enterprise myRS:PRIMARY> for(var i =4; i <7; i ++){
    
    db.user.insert({
    
    userName:'my'+i,age:i})}
WriteResult({
    
     "nInserted" : 1 })
MongoDB Enterprise myRS:PRIMARY> db.user.find()
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15a"), "userName" : "my0", "age" : 0 }
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15b"), "userName" : "my1", "age" : 1 }
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15c"), "userName" : "my2", "age" : 2 }
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15d"), "userName" : "my3", "age" : 3 }
{
    
     "_id" : ObjectId("602c9d4a2db6914f63068e15"), "userName" : "my4", "age" : 4 }
{
    
     "_id" : ObjectId("602c9d4a2db6914f63068e16"), "userName" : "my5", "age" : 5 }
{
    
     "_id" : ObjectId("602c9d4a2db6914f63068e17"), "userName" : "my6", "age" : 6 }

node03ビュー
ここに画像の説明を挿入
開始マスター

[root@node01 ~]# systemctl start mongod
[root@node01 ~]# systemctl is-active mongod
active

node03マスタースレーブステータスの表示

node01がsalve状態に
ここに画像の説明を挿入
切り替わりnode02が3つのデータを再度挿入します

MongoDB Enterprise myRS:PRIMARY> use test
switched to db test
MongoDB Enterprise myRS:PRIMARY> for(var i =7; i <10; i ++){
    
    db.user.insert({
    
    userName:'my'+i,age:i})}
WriteResult({
    
     "nInserted" : 1 })
MongoDB Enterprise myRS:PRIMARY> db.user.find()
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15a"), "userName" : "my0", "age" : 0 }
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15b"), "userName" : "my1", "age" : 1 }
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15c"), "userName" : "my2", "age" : 2 }
{
    
     "_id" : ObjectId("602c98c21b314e8e6e90e15d"), "userName" : "my3", "age" : 3 }
{
    
     "_id" : ObjectId("602c9d4a2db6914f63068e15"), "userName" : "my4", "age" : 4 }
{
    
     "_id" : ObjectId("602c9d4a2db6914f63068e16"), "userName" : "my5", "age" : 5 }
{
    
     "_id" : ObjectId("602c9d4a2db6914f63068e17"), "userName" : "my6", "age" : 6 }
{
    
     "_id" : ObjectId("602c9f71912509e6bd44076c"), "userName" : "my7", "age" : 7 }
{
    
     "_id" : ObjectId("602c9f71912509e6bd44076d"), "userName" : "my8", "age" : 8 }
{
    
     "_id" : ObjectId("602c9f71912509e6bd44076e"), "userName" : "my9", "age" : 9 }

node01データを表示
ここに画像の説明を挿入

node03データを表示
ここに画像の説明を挿入

フェイルオーバー、障害回復成功しました!

おすすめ

転載: blog.csdn.net/XY0918ZWQ/article/details/113831893