1. 程式人生 > >MongoDB資料庫複製集

MongoDB資料庫複製集

一、複製集概述;

二、複製集原理;

三、案例:搭建Mongodb實現應用複製集;

一、複製集概述:

組成:

Mongodb複製集(副本集replica set)由一組Mongod例項(程序)組成,包含一個Primary節點和多個Secondary節點,Mongodb Driver(客戶端)的所有資料都寫入Primary,Secondary通過oplog來同步Primary的資料,保證主節點和從節點資料的一致性,複製集在完成主從複製的基礎上,通過心跳機制,一旦primary節點出現宕機,則觸發選舉一個新的主節點,剩下的secondary節點指向新的primary,時間應該在10-30s內完成感知primary節點故障,實現高可用資料庫叢集;

特點:

  主是唯一的,但不是固定的;

  由大多資料原則保證資料的一致性;

  從庫無法寫入(預設情況下,不使用驅動連線時,也是不能查詢的);

  相對於傳統的主從結構,複製集可以自動容災;

二、複製集原理:

角色(按是否儲存資料劃分):

  Primary:主節點,由選舉產生,負責客戶端的寫操作,產生oplog日誌檔案;

  Secondary:從節點,負責客戶端的讀操作,提供資料的備份和故障的切換;

  Arbiter:仲裁節點,只參與選舉的投票,不會成為primary,也不向Primary同步資料,若部署了一個2個節點的複製集,1個Primary,1個Secondary,任意節點宕機,複製集將不能提供服務了(無法選出Primary),這時可以給複製集新增一個Arbiter節點,即使有節點宕機,仍能選出Primary;

角色(按型別區分):

  Standard(標準):這種是常規節點,它儲存一份完整的資料副本,參與投票選舉,有可能成為主節點;

  Passive(被動):儲存完整的資料副本,參與投票,不能成為活躍節點。

  Arbiter(投票):仲裁節點只參與投票,不接收復制的資料,也不能成為活躍節點。

注:每個參與節點(非仲裁者)有個優先權(0-1000),優先權(priority)為0則是被動的,不能成為活躍節點,優先權不為0的,按照由大到小選出活躍節點,優先值一樣的則看誰的資料比較新;

注:Mongodb 3.0裡,複製整合員最多50個,參與Primary選舉投票的成員最多7個;

選舉:

  每個節點通過優先順序定義出節點的型別(標準、被動、投票);

  標準節點通過對比自身資料進行選舉出peimary節點或者secondary節點;

影響選舉的因素:

  1.心跳檢測:複製集內成員每隔兩秒向其他成員傳送心跳檢測資訊,若10秒內無響應,則標記其為不可用;

  2.連線:在多個節點中,最少保證兩個節點為活躍狀態,如果叢集中共三個節點,掛掉兩個節點,那麼剩餘的節點無論狀態是primary還是處於選舉過程中,都會直接被降權為secondary;

觸發選舉的情況:

  1.初始化狀態  2.從節點們無法與主節點進行通訊    3.主節點辭職

主節點辭職的情況:

  1.在接收到replSetStepDown命令後;

  2.在現有的環境中,其他secondary節點的資料落後於本身10s內,且擁有更高優先順序;

  3.當主節點無法與群集中多數節點通訊;

注:當主節點辭職後,主節點將關閉自身所有的連線,避免出現客戶端在從節點進行寫入操作;

三、案例:搭建Mongodb實現應用複製集;

案例拓撲:

異常處理:  

  當Primary宕機時,如果有資料未同步到Secondary,當Primary重新加入時,如果新的Primary上已經發生了寫操作,則舊Primary需要回滾部分操作,以保證資料集與新的Primary一致。舊Primary將回滾的資料寫到單獨的rollback目錄下,資料庫管理員可根據需要使用mongorestore進行恢復。

案例環境:

系統

主機名

IP地址

所需軟體

Centos 7.4

mongodb.benet.com

192.168.100.101

mongodb-linux-x86_64-rhel70-3.6.3.tgz

實驗步驟:

  • 安裝mongodb;
  • 建立並啟動四個例項;
  • 配置例項;
  • 建立複製集並新增節點;
  • 模擬Primary節點出現故障,檢視角色切換情況;
  • 手動切換Primary角色;
  • 指定節點的優先順序,驗證角色重選情況;
  • 將標準節點統統停掉,被動節點也不會成為主節點;
  • 查詢複製集狀態以及檢視oplog日誌檔案的大小;
  • 部署使用者認證登入(金鑰對)的複製集;
  • 安裝mongodb;

下載mongodb軟體包;

[[email protected] ~]# tar zxvf mongodb-linux-x86_64-rhel70-3.6.3.tgz

[[email protected] ~]# mv mongodb-linux-x86_64-rhel70-3.6.3 /usr/local/mongodb         

[[email protected] ~]# echo "export PATH=/usr/local/mongodb/bin:\$PATH" >>/etc/profile

[[email protected] ~]# source /etc/profile

[[email protected] ~]# ulimit -n 25000

[[email protected] ~]# ulimit -u 25000

[[email protected] ~]# echo 0 >/proc/sys/vm/zone_reclaim_mode 

[[email protected] ~]# sysctl -w vm.zone_reclaim_mode=0

[[email protected] ~]# echo never >/sys/kernel/mm/transparent_hugepage/enabled

[[email protected] ~]# echo never >/sys/kernel/mm/transparent_hugepage/defrag

  • 建立並啟動四個例項;

[[email protected] ~]# cd /usr/local/mongodb/bin/

[[email protected] bin]# mkdir {../mongodb1,../mongodb2,../mongodb3,../mongodb4}

[[email protected] bin]# mkdir ../logs

[[email protected] bin]# touch ../logs/mongodb{1..4}.log

[[email protected] bin]# chmod 777 ../logs/mongodb*

[[email protected] bin]# cat <<END >>/usr/local/mongodb/bin/mongodb1.conf

bind_ip=192.168.100.101

port=27017

dbpath=/usr/local/mongodb/mongodb1/

logpath=/usr/local/mongodb/logs/mongodb1.log

logappend=true

fork=true

maxConns=5000

replSet=haha

#replication name

END

[[email protected] bin]# cat <<END >>/usr/local/mongodb/bin/mongodb2.conf

bind_ip=192.168.100.101

port=27018

dbpath=/usr/local/mongodb/mongodb2/

logpath=/usr/local/mongodb/logs/mongodb2.log

logappend=true

fork=true

maxConns=5000

replSet=haha

END

[[email protected] bin]# cat <<END >>/usr/local/mongodb/bin/mongodb3.conf

bind_ip=192.168.100.101

port=27019

dbpath=/usr/local/mongodb/mongodb3/

logpath=/usr/local/mongodb/logs/mongodb3.log

logappend=true

fork=true

maxConns=5000

replSet=haha

END

[[email protected] bin]# cat <<END >>/usr/local/mongodb/bin/mongodb4.conf

bind_ip=192.168.100.101

port=27020

dbpath=/usr/local/mongodb/mongodb4/

logpath=/usr/local/mongodb/logs/mongodb4.log

logappend=true

fork=true

maxConns=5000

replSet=haha

END

[[email protected] bin]# cd

[[email protected] ~]# mongod -f  /usr/local/mongodb/bin/mongodb1.conf

[[email protected] ~]# mongod -f  /usr/local/mongodb/bin/mongodb2.conf

[[email protected] ~]# mongod -f  /usr/local/mongodb/bin/mongodb3.conf

[[email protected] ~]# mongod -f  /usr/local/mongodb/bin/mongodb4.conf

[[email protected] ~]# netstat -utpln |grep mongod

tcp        0      0 192.168.100.101:27019   0.0.0.0:*               LISTEN      2271/mongod         

tcp        0      0 192.168.100.101:27020   0.0.0.0:*               LISTEN      15260/mongod        

tcp        0      0 192.168.100.101:27017   0.0.0.0:*               LISTEN      2440/mongod         

tcp        0      0 192.168.100.101:27018   0.0.0.0:*               LISTEN      1412/mongod  

[[email protected] ~]# echo -e "/usr/local/mongodb/bin/mongod -f  /usr/local/mongodb/bin/mongodb1.conf \n/usr/local/mongodb/bin/mongod -f  /usr/local/mongodb/bin/mongodb2.conf\n/usr/local/mongodb/bin/mongod -f  /usr/local/mongodb/bin/mongodb3.conf\n/usr/local/mongodb/bin/mongod -f  /usr/local/mongodb/bin/mongodb4.conf">>/etc/rc.local

[[email protected] ~]# chmod +x /etc/rc.local

[[email protected] ~]# cat <<END >>/etc/init.d/mongodb

#!/bin/bash

INSTANCE=\$1

ACTION=\$2

case "\$ACTION" in

'start')

/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf;;

'stop')

/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf --shutdown;;

'restart')

/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf --shutdown

/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/"\$INSTANCE".conf;;

esac

END

[[email protected] ~]# chmod +x /etc/init.d/mongodb

[[email protected] ~]# /etc/init.d/mongodb mongodb1 stop

killing process with pid: 1301

[[email protected] ~]# /etc/init.d/mongodb mongodb1 start

about to fork child process, waiting until server is ready for connections.

forked process: 1457

child process started successfully, parent exiting

[[email protected] ~]# mongo --port 27017 --host 192.168.100.101

  • 配置例項;

[[email protected] ~]# mongo --port 27017 --host 192.168.100.101

> show dbs

2018-04-19T04:34:35.871+0800 E QUERY    [thread1] Error: listDatabases failed:{

"ok" : 0,

"errmsg" : "not master and slaveOk=false",

"code" : 13435,

"codeName" : "NotMasterNoSlaveOk"

} :

[email protected]/mongo/shell/utils.js:25:13

[email protected]/mongo/shell/mongo.js:65:1

[email protected]/mongo/shell/utils.js:816:19

[email protected]/mongo/shell/utils.js:706:15

@(shellhelp2):1:1

> rs.status()

{

"info" : "run rs.initiate(...) if not yet done for the set",

"ok" : 0,

"errmsg" : "no replset config has been received",

"code" : 94,

"codeName" : "NotYetInitialized"

}

> rs.isMaster() ##檢視複製集節點

{

"ismaster" : false,

"secondary" : false,

"info" : "Does not have a valid replica set config",

"isreplicaset" : true,

"maxBsonObjectSize" : 16777216,

"maxMessageSizeBytes" : 48000000,

"maxWriteBatchSize" : 100000,

"localTime" : ISODate("2018-04-18T20:36:31.698Z"),

"minWireVersion" : 0,

"maxWireVersion" : 6,

"readOnly" : false,

"ok" : 1

}

> exit

[[email protected] ~]# mongo --port 27018 --host 192.168.100.101

> show dbs

2018-04-19T04:34:56.884+0800 E QUERY    [thread1] Error: listDatabases failed:{

"ok" : 0,

"errmsg" : "not master and slaveOk=false",

"code" : 13435,

"codeName" : "NotMasterNoSlaveOk"

} :

[email protected]/mongo/shell/utils.js:25:13

[email protected]/mongo/shell/mongo.js:65:1

[email protected]/mongo/shell/utils.js:816:19

[email protected]/mongo/shell/utils.js:706:15

@(shellhelp2):1:1

> exit

  • 建立複製集並新增節點;

[[email protected] ~]# mongo --port 27017 --host 192.168.100.101

>cfg={"_id":"haha","members":[{"_id":0,"host":"192.168.100.101:27017"},{"_id":1,"host":"192.168.100.101:27018"},{"_id":2,"host":"192.168.100.101:27019"}]} ##新增節點

{

"_id" : "haha",

"members" : [

{

"_id" : 0,

"host" : "192.168.100.101:27017"

},

{

"_id" : 1,

"host" : "192.168.100.101:27018"

},

{

"_id" : 2,

"host" : "192.168.100.101:27019"

}

]

}

> rs.initiate(cfg) ##初始化節點

{

"ok" : 1,

"operationTime" : Timestamp(1524083843, 1),

"$clusterTime" : {

"clusterTime" : Timestamp(1524083843, 1),

"signature" : {

"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

"keyId" : NumberLong(0)

}

}

}

haha:OTHER>

haha:PRIMARY> 

haha:PRIMARY> rs.status()

{

"set" : "haha",

"date" : ISODate("2018-04-18T20:37:54.095Z"),

"myState" : 1,

"term" : NumberLong(1),

"heartbeatIntervalMillis" : NumberLong(2000),

"optimes" : {

"lastCommittedOpTime" : {

"ts" : Timestamp(1524083855, 5),

"t" : NumberLong(1)

},

"readConcernMajorityOpTime" : {

"ts" : Timestamp(1524083855, 5),

"t" : NumberLong(1)

},

"appliedOpTime" : {

"ts" : Timestamp(1524083855, 5),

"t" : NumberLong(1)

},

"durableOpTime" : {

"ts" : Timestamp(1524083855, 5),

"t" : NumberLong(1)

}

},

"members" : [

{

"_id" : 0,

"name" : "192.168.100.101:27017",

"health" : 1,

"state" : 1,

"stateStr" : "PRIMARY",

"uptime" : 329,

"optime" : {

"ts" : Timestamp(1524083855, 5),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-18T20:37:35Z"),

"infoMessage" : "could not find member to sync from",

"electionTime" : Timestamp(1524083854, 1),

"electionDate" : ISODate("2018-04-18T20:37:34Z"),

"configVersion" : 1,

"self" : true

},

{

"_id" : 1,

"name" : "192.168.100.101:27018",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 30,

"optime" : {

"ts" : Timestamp(1524083855, 5),

"t" : NumberLong(1)

},

"optimeDurable" : {

"ts" : Timestamp(1524083855, 5),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-18T20:37:35Z"),

"optimeDurableDate" : ISODate("2018-04-18T20:37:35Z"),

"lastHeartbeat" : ISODate("2018-04-18T20:37:54.043Z"),

"lastHeartbeatRecv" : ISODate("2018-04-18T20:37:52.499Z"),

"pingMs" : NumberLong(0),

"syncingTo" : "192.168.100.101:27017",

"configVersion" : 1

},

{

"_id" : 2,

"name" : "192.168.100.101:27019",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 30,

"optime" : {

"ts" : Timestamp(1524083855, 5),

"t" : NumberLong(1)

},

"optimeDurable" : {

"ts" : Timestamp(1524083855, 5),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-18T20:37:35Z"),

"optimeDurableDate" : ISODate("2018-04-18T20:37:35Z"),

"lastHeartbeat" : ISODate("2018-04-18T20:37:54.043Z"),

"lastHeartbeatRecv" : ISODate("2018-04-18T20:37:52.500Z"),

"pingMs" : NumberLong(0),

"syncingTo" : "192.168.100.101:27017",

"configVersion" : 1

}

],

"ok" : 1,

"operationTime" : Timestamp(1524083855, 5),

"$clusterTime" : {

"clusterTime" : Timestamp(1524083855, 5),

"signature" : {

"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

"keyId" : NumberLong(0)

}

}

}

haha:PRIMARY> rs.addArb("192.168.100.101:27020") ##新增仲裁節點

{

"ok" : 1,

"operationTime" : Timestamp(1524083905, 1),

"$clusterTime" : {

"clusterTime" : Timestamp(1524083905, 1),

"signature" : {

"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

"keyId" : NumberLong(0)

}

}

}

haha:PRIMARY> rs.status()

{

"set" : "haha",

"date" : ISODate("2018-04-18T20:38:41.468Z"),

"myState" : 1,

"term" : NumberLong(1),

"heartbeatIntervalMillis" : NumberLong(2000),

"optimes" : {

"lastCommittedOpTime" : {

"ts" : Timestamp(1524083915, 1),

"t" : NumberLong(1)

},

"readConcernMajorityOpTime" : {

"ts" : Timestamp(1524083915, 1),

"t" : NumberLong(1)

},

"appliedOpTime" : {

"ts" : Timestamp(1524083915, 1),

"t" : NumberLong(1)

},

"durableOpTime" : {

"ts" : Timestamp(1524083915, 1),

"t" : NumberLong(1)

}

},

"members" : [

{

"_id" : 0,

"name" : "192.168.100.101:27017",

"health" : 1,

"state" : 1,

"stateStr" : "PRIMARY",

"uptime" : 376,

"optime" : {

"ts" : Timestamp(1524083915, 1),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-18T20:38:35Z"),

"infoMessage" : "could not find member to sync from",

"electionTime" : Timestamp(1524083854, 1),

"electionDate" : ISODate("2018-04-18T20:37:34Z"),

"configVersion" : 2,

"self" : true

},

{

"_id" : 1,

"name" : "192.168.100.101:27018",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 78,

"optime" : {

"ts" : Timestamp(1524083905, 1),

"t" : NumberLong(1)

},

"optimeDurable" : {

"ts" : Timestamp(1524083905, 1),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-18T20:38:25Z"),

"optimeDurableDate" : ISODate("2018-04-18T20:38:25Z"),

"lastHeartbeat" : ISODate("2018-04-18T20:38:41.134Z"),

"lastHeartbeatRecv" : ISODate("2018-04-18T20:38:40.134Z"),

"pingMs" : NumberLong(0),

"configVersion" : 2

},

{

"_id" : 2,

"name" : "192.168.100.101:27019",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 78,

"optime" : {

"ts" : Timestamp(1524083905, 1),

"t" : NumberLong(1)

},

"optimeDurable" : {

"ts" : Timestamp(1524083905, 1),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-18T20:38:25Z"),

"optimeDurableDate" : ISODate("2018-04-18T20:38:25Z"),

"lastHeartbeat" : ISODate("2018-04-18T20:38:41.134Z"),

"lastHeartbeatRecv" : ISODate("2018-04-18T20:38:40.136Z"),

"pingMs" : NumberLong(0),

"configVersion" : 2

},

{

"_id" : 3,

"name" : "192.168.100.101:27020",

"health" : 1,

"state" : 7,

"stateStr" : "ARBITER",

"uptime" : 16,

"lastHeartbeat" : ISODate("2018-04-18T20:38:41.137Z"),

"lastHeartbeatRecv" : ISODate("2018-04-18T20:38:40.140Z"),

"pingMs" : NumberLong(0),

"configVersion" : 2

}

],

"ok" : 1,

"operationTime" : Timestamp(1524083915, 1),

"$clusterTime" : {

"clusterTime" : Timestamp(1524083915, 1),

"signature" : {

"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

"keyId" : NumberLong(0)

}

}

}

注:rs.add()和rs.remove()命令分別用於新增和刪除標準節點

haha:PRIMARY> show dbs

admin   0.000GB

config  0.000GB

local   0.000GB

haha:PRIMARY> use cloud

switched to db cloud

haha:PRIMARY> db.users.insert({"id":"1","name":"xiaoming"})

WriteResult({ "nInserted" : 1 })

haha:PRIMARY> db.users.find()

{ "_id" : ObjectId("5ad7b245f6308759d4605b5c"), "id" : "1", "name" : "xiaoming" }

haha:PRIMARY> show dbs

admin   0.000GB

cloud   0.000GB

config  0.000GB

local   0.000GB

haha:PRIMARY> exit

[[email protected] ~]# mongo --port 27018 --host 192.168.100.101

haha:SECONDARY> rs.status()

{

"set" : "haha",

"date" : ISODate("2018-04-18T20:50:50.975Z"),

"myState" : 2,

"term" : NumberLong(1),

"syncingTo" : "192.168.100.101:27017",

"heartbeatIntervalMillis" : NumberLong(2000),

"optimes" : {

"lastCommittedOpTime" : {

"ts" : Timestamp(1524084645, 1),

"t" : NumberLong(1)

},

"readConcernMajorityOpTime" : {

"ts" : Timestamp(1524084645, 1),

"t" : NumberLong(1)

},

"appliedOpTime" : {

"ts" : Timestamp(1524084645, 1),

"t" : NumberLong(1)

},

"durableOpTime" : {

"ts" : Timestamp(1524084645, 1),

"t" : NumberLong(1)

}

},

"members" : [

{

"_id" : 0,

"name" : "192.168.100.101:27017",

"health" : 1,

"state" : 1,

"stateStr" : "PRIMARY",

"uptime" : 805,

"optime" : {

"ts" : Timestamp(1524084645, 1),

"t" : NumberLong(1)

},

"optimeDurable" : {

"ts" : Timestamp(1524084645, 1),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-18T20:50:45Z"),

"optimeDurableDate" : ISODate("2018-04-18T20:50:45Z"),

"lastHeartbeat" : ISODate("2018-04-18T20:50:49.966Z"),

"lastHeartbeatRecv" : ISODate("2018-04-18T20:50:49.997Z"),

"pingMs" : NumberLong(0),

"electionTime" : Timestamp(1524083854, 1),

"electionDate" : ISODate("2018-04-18T20:37:34Z"),

"configVersion" : 2

},

{

"_id" : 1,

"name" : "192.168.100.101:27018",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 1497,

"optime" : {

"ts" : Timestamp(1524084645, 1),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-18T20:50:45Z"),

"syncingTo" : "192.168.100.101:27017",

"configVersion" : 2,

"self" : true

},

{

"_id" : 2,

"name" : "192.168.100.101:27019",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 805,

"optime" : {

"ts" : Timestamp(1524084645, 1),

"t" : NumberLong(1)

},

"optimeDurable" : {

"ts" : Timestamp(1524084645, 1),

"t" : NumberLong(1)

},

"optimeDate" : ISODate("2018-04-18T20:50:45Z"),

"optimeDurableDate" : ISODate("2018-04-18T20:50:45Z"),

"lastHeartbeat" : ISODate("2018-04-18T20:50:49.811Z"),

"lastHeartbeatRecv" : ISODate("2018-04-18T20:50:49.965Z"),

"pingMs" : NumberLong(0),

"syncingTo" : "192.168.100.101:27017",

"configVersion" : 2

},

{

"_id" : 3,

"name" : "192.168.100.101:27020",

"health" : 1,

"state" : 7,

"stateStr" : "ARBITER",

"uptime" : 745,

"lastHeartbeat" : ISODate("2018-04-18T20:50:49.966Z"),

"lastHeartbeatRecv" : ISODate("2018-04-18T20:50:50.378Z"),

"pingMs" : NumberLong(0),

"configVersion" : 2

}

],

"ok" : 1,

"operationTime" : Timestamp(1524084645, 1),

"$clusterTime" : {

"clusterTime" : Timestamp(1524084645, 1),

"signature" : {

"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

"keyId" : NumberLong(0)

}

}

}

haha:SECONDARY> show dbs ##secondary節點預設無法讀取,可以通過以下方式或者驅動方式實現

2018-04-19T04:52:42.813+0800 E QUERY    [thread1] Error: listDatabases failed:{

"operationTime" : Timestamp(1524084755, 1),

"ok" : 0,

"errmsg" : "not master and slaveOk=false",

"code" : 13435,

"codeName" : "NotMasterNoSlaveOk",

"$clusterTime" : {

"clusterTime" : Timestamp(1524084755, 1),

"signature" : {

"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

"keyId" : NumberLong(0)

}

}

} :

[email protected]/mongo/shell/utils.js:25:13

[email protected]/mongo/shell/mongo.js:65:1

[email protected]/mongo/shell/utils.js:816:19

[email protected]/mongo/shell/utils.js:706:15

@(shellhelp2):1:1

haha:SECONDARY> db.getMongo().setSlaveOk();

haha:SECONDARY> show dbs

admin   0.000GB

cloud   0.000GB

config  0.000GB

local   0.000GB

haha:SECONDARY> use cloud

switched to db cloud

haha:SECONDARY> db.users.insert({"id":"2","name":"xiaohong"}) ##secondary節點無法寫入

WriteResult({ "writeError" : { "code" : 10107, "errmsg" : "not master" } })

haha:SECONDARY> db.users.find()

{ "_id" : ObjectId("5ad7b245f6308759d4605b5c"), "id" : "1", "name" : "xiaoming" }

haha:SECONDARY> exit

  • 模擬Primary節點出現故障,檢視角色切換情況;

[[email protected] ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf --shutdown

killing process with pid: 1457

[[email protected] ~]# mongo --port 27018 --host 192.168.100.101

haha:SECONDARY> rs.status()

{

"set" : "haha",

"date" : ISODate("2018-04-18T21:16:22.623Z"),

"myState" : 2,

"term" : NumberLong(2),

"syncingTo" : "192.168.100.101:27019",

"heartbeatIntervalMillis" : NumberLong(2000),

"optimes" : {

"lastCommittedOpTime" : {

"ts" : Timestamp(1524086155, 1),

"t" : NumberLong(1)

},

"readConcernMajorityOpTime" : {

"ts" : Timestamp(1524086155, 1),

"t" : NumberLong(1)

},

"appliedOpTime" : {

"ts" : Timestamp(1524086174, 1),

"t" : NumberLong(2)

},

"durableOpTime" : {

"ts" : Timestamp(1524086174, 1),

"t" : NumberLong(2)

}

},

"members" : [

{

"_id" : 0,

"name" : "192.168.100.101:27017",

"health" : 0,

"state" : 8,

"stateStr" : "(not reachable/healthy)",

"uptime" : 0,

"optime" : {

"ts" : Timestamp(0, 0),

"t" : NumberLong(-1)

},

"optimeDurable" : {

"ts" : Timestamp(0, 0),

"t" : NumberLong(-1)

},

"optimeDate" : ISODate("1970-01-01T00:00:00Z"),

"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),

"lastHeartbeat" : ISODate("2018-04-18T21:16:19.030Z"),

"lastHeartbeatRecv" : ISODate("2018-04-18T21:16:03.344Z"),

"pingMs" : NumberLong(0),

"lastHeartbeatMessage" : "Connection refused",

"configVersion" : -1

},

{

"_id" : 1,

"name" : "192.168.100.101:27018",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 3029,

"optime" : {

"ts" : Timestamp(1524086174, 1),

"t" : NumberLong(2)

},

"optimeDate" : ISODate("2018-04-18T21:16:14Z"),

"syncingTo" : "192.168.100.101:27019",

"infoMessage" : "syncing from: 192.168.100.101:27019",

"configVersion" : 2,

"self" : true

},

{

"_id" : 2,

"name" : "192.168.100.101:27019",

"health" : 1,

"state" : 1,

"stateStr" : "PRIMARY",

"uptime" : 2337,

"optime" : {

"ts" : Timestamp(1524086174, 1),

"t" : NumberLong(2)

},

"optimeDurable" : {

"ts" : Timestamp(1524086174, 1),

"t" : NumberLong(2)

},

"optimeDate" : ISODate("2018-04-18T21:16:14Z"),

"optimeDurableDate" : ISODate("2018-04-18T21:16:14Z"),

"lastHeartbeat" : ISODate("2018-04-18T21:16:19.030Z"),

"lastHeartbeatRecv" : ISODate("2018-04-18T21:16:21.575Z"),

"pingMs" : NumberLong(0),

"electionTime" : Timestamp(1524086173, 1),

"electionDate" : ISODate("2018-04-18T21:16:13Z"),

"configVersion" : 2

},

{

"_id" : 3,

"name" : "192.168.100.101:27020",

"health" : 1,

"state" : 7,

"stateStr" : "ARBITER",

"uptime" : 2277,

"lastHeartbeat" : ISODate("2018-04-18T21:16:19.030Z"),

"lastHeartbeatRecv" : ISODate("2018-04-18T21:16:20.894Z"),

"pingMs" : NumberLong(0),

"configVersion" : 2

}

],

"ok" : 1,

"operationTime" : Timestamp(1524086174, 1),

"$clusterTime" : {

"clusterTime" : Timestamp(1524086174, 1),

"signature" : {

"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

"keyId" : NumberLong(0)

}

}

}

haha:SECONDARY> exit

[[email protected] ~]# mongo --port 27019 --host 192.168.100.101

haha:PRIMARY> exit

[[email protected] ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf

  • 手動切換Primary角色;

[[email protected] ~]# mongo --port 27019 --host 192.168.100.101

haha:PRIMARY> rs.stepDown(60,30)

haha:SECONDARY> exit

[[email protected] ~]# mongo --port 27018 --host 192.168.100.101

haha:PRIMARY> exit

  • 指定節點的優先順序,驗證角色重選情況;

[[email protected] ~]# mongo --port 27018 --host 192.168.100.101

haha:PRIMARY> cfg={"_id":"haha","members":[{"_id":0,"host":"192.168.100.101:27017","priority":100},{"_id":1,"host":"192.168.100.101:27018","priority":100},{"_id":2,"host":"192.168.100.101:27019","priority":10}]}

{

"_id" : "haha",

"members" : [

{

"_id" : 0,

"host" : "192.168.100.101:27017",

"priority" : 100

},

{

"_id" : 1,

"host" : "192.168.100.101:27018",

"priority" : 100

},

{

"_id" : 2,

"host" : "192.168.100.101:27019",

"priority" : 10

}

]

}

haha:PRIMARY> rs.reconfig(cfg)

{

"ok" : 1,

"operationTime" : Timestamp(1524086716, 1),

"$clusterTime" : {

"clusterTime" : Timestamp(1524086716, 1),

"signature" : {

"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

"keyId" : NumberLong(0)

}

}

}

haha:PRIMARY> rs.isMaster()

{

"hosts" : [

"192.168.100.101:27017",

"192.168.100.101:27018",

"192.168.100.101:27019"

],

"setName" : "haha",

"setVersion" : 3,

"ismaster" : true,

"secondary" : false,

"primary" : "192.168.100.101:27018",

"me" : "192.168.100.101:27018",

"electionId" : ObjectId("7fffffff0000000000000003"),

"lastWrite" : {

"opTime" : {

"ts" : Timestamp(1524086733, 1),

"t" : NumberLong(3)

},

"lastWriteDate" : ISODate("2018-04-18T21:25:33Z"),

"majorityOpTime" : {

"ts" : Timestamp(1524086733, 1),

"t" : NumberLong(3)

},

"majorityWriteDate" : ISODate("2018-04-18T21:25:33Z")

},

"maxBsonObjectSize" : 16777216,

"maxMessageSizeBytes" : 48000000,

"maxWriteBatchSize" : 100000,

"localTime" : ISODate("2018-04-18T21:25:42.122Z"),

"logicalSessionTimeoutMinutes" : 30,

"minWireVersion" : 0,

"maxWireVersion" : 6,

"readOnly" : false,

"ok" : 1,

"operationTime" : Timestamp(1524086733, 1),

"$clusterTime" : {

"clusterTime" : Timestamp(1524086733, 1),

"signature" : {

"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

"keyId" : NumberLong(0)

}

}

}

haha:PRIMARY> exit

[[email protected] ~]# mongod -f /usr/local/mongodb/bin/mongodb2.conf --shutdown

[[email protected] ~]# mongo --port 27017 --host 192.168.100.101

haha:PRIMARY> exit

  • 將標準節點統統停掉,被動節點也不會成為主節點;

[[email protected] ~]# mongod -f /usr/local/mongodb/bin/mongodb1.conf --shutdown

[[email protected] ~]# mongo --port 27019 --host 192.168.100.101

haha:SECONDARY> rs.status()

{

"set" : "haha",

"date" : ISODate("2018-04-18T21:29:42.973Z"),

"myState" : 2,

"term" : NumberLong(5),

"heartbeatIntervalMillis" : NumberLong(2000),

"optimes" : {

"lastCommittedOpTime" : {

"ts" : Timestamp(1524086961, 1),

"t" : NumberLong(5)

},

"readConcernMajorityOpTime" : {

"ts" : Timestamp(1524086961, 1),

"t" : NumberLong(5)

},

"appliedOpTime" : {

"ts" : Timestamp(1524086961, 1),

"t" : NumberLong(5)

相關推薦

MongoDB資料庫複製

一、複製集概述; 二、複製集原理; 三、案例:搭建Mongodb實現應用複製集; 一、複製集概述: 組成: Mongodb複製集(副本集replica set)由一組Mongod例項(程序)組成,包含一個Primary節點和多個Secondary節點,Mon

MongoDB】windows平臺搭建Mongo資料庫複製(類似叢集)(一)

Replica  Sets(複製集)是在mongodDB1.6版本開始新增的功能,它可以實現故障自動切換和自動修復功能成員節點的功能,各個DB之間的資料完全一致,大大降低了單點故障的風險。  【】 以上圖示是三個節點的Replica Set架構。該圖來源於紅丸編寫的《Mo

MongoDB配置複製和分片!!!

首先在確保你的電腦安裝過mongodb和把mongodb的bin目錄寫到path裡面並且成功執行過的情況下來操作如下步驟 複製集: 1同一個資料夾下面寫入新建三個資料夾如下圖 類似與這種,然後再每個檔案下新建立兩個檔案(nodex對應datax和logx)和一個win的可執行檔

MongoDB 主從複製搭建

一、Mongodb複製集簡介 什麼是複製集? 複製集(Replica Sets)是額外的資料副本,是跨多個伺服器同步資料的過程,複製集提供了冗餘並增加了資料可用性,通過複製集可以對硬體故障和中斷的服務進行恢復。 MongoDB複製集原理: mongodb

mongoDB複製2----同步機制(工作原理,oplog詳解,初始化同步的過程

                       一、複製集是怎麼工作的 1-1.複製集工作原理     Mongodb複製集由一組Mongod例項(程序)組成,包含一個Primary節點和多個Secondary節點,Mongodb Driver(客戶端)的所有資料都寫入Pr

MongoDB複製

MongoDB之複製集篇    發表評論   A+ 所屬分類:D

MongoDB資料庫遷移(複製叢集遷移)

資料庫(複製集)遷移 @(MongoDB)[複製集|遷移|] 前言: 有時候由於業務或者其他因素的原因,我們需要將生產環境(複製集)中的資料庫遷移到新伺服器上,也有可能是異地機房,且宕機時間不允許太長;下面針對這個需求我們做一下測試。我認為

部署MongoDB複製(副本

環境 作業系統:Ubuntu 18.04 MongoDB: 4.0.3 伺服器 首先部署3臺伺服器,1臺主節點 + 2臺從節點 3臺伺服器的內容ip分別是: 10.140.0.5 (主節點)

MongoDB複製與Raft協議異同點分析

此文已由作者溫正湖授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 一、日誌複製流程: a、raft leader節點在接收client請求後,先將請求寫到日誌中,再將日誌通過AppendEntries RPC傳送到follow上。如果收到了大多數follow的確認

單機Mongo複製安裝配置(資料庫版本:4.x)

    官方文件: https://docs.mongodb.com/manual/tutorial/deploy-replica-set-with-keyfile-access-control/#deploy-repl-set-with-auth 一、建立fileKey,祕鑰檔案

Ubuntu 18.04下部署MongoDB複製(副本

環境 作業系統: 18.04 MongoDB: 4.0.3   伺服器 首先部署3臺伺服器,1臺主節點 + 2臺從節點 3臺伺服器的內容ip分別是: 10.140.0.5 (主節點) 10.140.0.6 (從節點01)

認識MongoDB複製

​ 從這一篇開始,我們要踏上MongoDB進階之路啦,想想還有點小開心呢。一筐豬鎮樓。 ​ 引入複製集 我們先來想一個場景,如果本地專案使用MongoDB,都是下載,安裝,連線一條龍服務。這實際也就是單點模式,那如果我們專案要上線了,這個時候還是一個數據庫,就可能出問題。比如我們寫了個淘寶(噓,假裝是

Windows搭建MongoDB複製

上篇,我們已經知道了什麼是MongoDB的複製集,不知道的可以檢視上篇哦,傳送門來了。 光說不練,假把式,咱來自己搭建一個複製集。先下載安裝哦,不知道的檢視上篇哦,https://blog.csdn.net/qq_33774822/article/details/83585156。 咱

MongoDB主從複製和副本

  MongoDB有主從複製和副本集兩種主從複製模式,主從複製最大的問題就是無法自動故障轉移,MongoDB副本集解決了主從模式無法自動故障轉義的特點,因此是複製的首選。對於簡單的主從複製無法自動故障轉移的缺陷,各個資料庫都在改進,MySQL推出的MGR,Redis的哨兵,Mongodb的複製集。

mongodb基礎學習8-複製

  今天來簡單學習一下複製集(replication),什麼是複製集呢,類似於mysql的主從複製吧   簡單來說就是有多個mongodb的例項,多個例項有相同的內容,其中一臺用於讀寫,其它用於備份,當用於讀寫的機器例項出現故障,用於備份的機器例項可以代替出故障的機器,從而保證資料庫的正常使用。   

mongodb基礎學習11-複製和分片結合使用

  實際的使用中複製集和分片是結合使用的,即一個分片由一個複製集構成,多個分片儲存資料庫的資料   呼叫指令碼啟動兩個複製集   啟動configsvr的節點   啟動mongos   增加分片,這次要加上覆制集的id,節點為複製集的主節點   下面來看一下效果   對資料庫啟

mongodb複製Replica Set使用簡介

MongoDB高可用 對於MongoDB,可以支援使用單機模式提供服務,但是在實際的生產環境中,單機模式將面臨很大的風險,一旦這個資料庫服務出現問題,就會導致線上的服務出現錯誤甚至崩潰。因此,在實際生產環境下,需要對MongoDB做相應的主備處理,提高資料庫服務的可用性。 對於提高可用性,一些博文裡提到了

MongoDB DBA 實踐5-----複製叢集的資料同步和故障轉移

(1)複製集叢集的資料同步 1》主節點資料庫test,在其中goods集合中加入一個文件。 2》在副節點中檢視 注意:SECONDARY是不允許讀寫的,要使用rs.slaveOk()獲得讀寫許可權       (2)故障轉移 1》故障1:副節點宕機

MongoDB 4.0 複製 replica set 搭建

MongoDB replica set : A replica set in MongoDB is a group of mongod processes that maintain the same data set. Replica sets provide re

MongoDB複製搭建

最近在學習mongodb,看文件時看到複製集這塊覺得挺有意思,於是便動手搭建了一下mongodb複製集 mongodb的複製至少需要兩個節點。其中一個是主節點,負責處理客戶端請求,其餘的都是從節點,負責