由三個(gè)節(jié)點(diǎn)組成的 復(fù)制集 為網(wǎng)絡(luò)故障或是其他的系統(tǒng)故障提供了足夠的冗余。該復(fù)制集也有足夠的分布式讀操作的能力。復(fù)制集應(yīng)該保持奇數(shù)個(gè)節(jié)點(diǎn),這也就保證了 選舉 可以正常的進(jìn)行
創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)薛城,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
用3臺(tái)已有的 mongod 實(shí)例來部署一個(gè)由三個(gè)節(jié)點(diǎn)組成的 復(fù)制集
192.168.1.3 hadoop1.abc.com hadoop1
192.168.1.4 hadoop2.abc.com hadoop2
192.168.1.5 hadoop3.abc.com hadoop3
在生產(chǎn)環(huán)境中,我們應(yīng)該將每個(gè)節(jié)點(diǎn)部署在獨(dú)立的機(jī)器上,并使用標(biāo)準(zhǔn)的MongoDB端口 27017 。使用 bind_ip 參數(shù)來限制訪問MongoDB的應(yīng)用程序的地址。
若使用了異地分布式架構(gòu)的復(fù)制集,請(qǐng)確保多數(shù) mongod 實(shí)例節(jié)點(diǎn)位于主數(shù)據(jù)中心中。
確保各個(gè)節(jié)點(diǎn)之間可以正常通訊,且各個(gè)客戶端都處于安全的可信的網(wǎng)絡(luò)環(huán)境中??梢钥紤]以下事項(xiàng):
建立虛擬的專用網(wǎng)絡(luò)。確保各個(gè)節(jié)點(diǎn)之間的流量是在本地網(wǎng)絡(luò)范圍內(nèi)路由的。(Establish a virtual private network. Ensure that your network topology routes all traffic between members within a single site over the local area network.)
配置連接限制來防止未知的客戶端連接到復(fù)制集。
配置網(wǎng)絡(luò)設(shè)置和防火墻規(guī)則來對(duì)將MongoDB的端口僅開放給應(yīng)用程序,來讓應(yīng)用程序發(fā)的進(jìn)出數(shù)據(jù)包可以與MongoDB正常交流。
最后請(qǐng)確保復(fù)制集各節(jié)點(diǎn)可以互相通過DNS或是主機(jī)名解析。我們需要配置DNS域名或是設(shè)置 /etc/hosts 文件來配置。
這里實(shí)驗(yàn),是關(guān)閉防火墻,并把selinux設(shè)置成setenforce 0
系統(tǒng)環(huán)境如下:
[root@hadoop2 data]# cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m [root@hadoop2 data]# uname -r 2.6.32-431.el6.x86_64
配置文件選項(xiàng):
port = 27017
bind_ip =
dbpath =
fore = true
replSet = testrs0
rest = true
1、建立每個(gè)節(jié)點(diǎn)都建立據(jù)據(jù)目錄
[root@hadoop1 ~]# mkidr -pv /mongodb/data/ [root@hadoop1 ~]# chown mongod.mongod /mongodb/data/
2
在每個(gè)節(jié)點(diǎn)上啟動(dòng) mongod 并通過制定 replSet 參數(shù)來指定其復(fù)制集名,并可以指定其他需要的參數(shù)
[root@hadoop1 ~]# vim /etc/mongod.conf //添加如下 #Replica Set replSet = testrs0 或者 [root@hadoop1 ~]# mongod --replSet "testrs0"
確保每個(gè)節(jié)點(diǎn)都有相同復(fù)制集名稱
[root@hadoop1 ~]# scp /etc/mongod.conf root@hadoop2:/etc/;scp /etc/mongod.conf root@hadoop2:/etc/;
注意了,如果解決啟動(dòng)mongod 時(shí),出現(xiàn)addr already in use錯(cuò)誤,原因啟動(dòng)端口被占用
[root@hadoop1 data]# mongod 2015-07-29T19:15:51.728+0800 E NETWORK [initandlisten] listen(): bind() failed errno:98 Address already in use for socket: 0.0.0.0:27017 2015-07-29T19:15:51.728+0800 E NETWORK [initandlisten] addr already in use 2015-07-29T19:15:51.729+0800 I STORAGE [initandlisten] exception in initAndListen: 29 Data directory /data/db not found., terminating 2015-07-29T19:15:51.729+0800 I CONTROL [initandlisten] dbexit: rc: 100
把端口找出來,kill掉
[root@hadoop1 ~]# netstat -anp|more unix 2 [ ACC ] STREAM LISTENING 15588 2174/mongod /tmp/mongodb-27017.sock
[root@hadoop1 ~]# kill 2174 [root@hadoop1 ~]# /etc/init.d/mongod start Starting mongod: [確定]
[root@hadoop1 ~]# mongo
//使用rs.initiate()命令,MongoDB將初始化一個(gè)由當(dāng)前節(jié)點(diǎn)構(gòu)成、擁有默認(rèn)配置的復(fù)制集。
> rs.initiate() { "info2" : "no configuration explicitly specified -- making one", "me" : "hadoop1.abc.com:27017", "info" : "try querying local.system.replset to see current configuration", "ok" : 0, "errmsg" : "already initialized", "code" : 23 } > rs.status() { "state" : 10, "stateStr" : "REMOVED", "uptime" : 38, "optime" : Timestamp(1438168698, 1), "optimeDate" : ISODate("2015-07-29T11:18:18Z"), "ok" : 0, "errmsg" : "Our replica set config is invalid or we are not a member of it", "code" : 93 }
查看日志 文件
2015-07-29T20:00:45.433+0800 W NETWORK [ReplicationExecutor] Failed to connect to 192.168.1.3:27017, reason: errno:111 Connection refused
2015-07-29T20:00:45.433+0800 W REPL [ReplicationExecutor] Locally stored replica set configuration does not have a valid entry for the current node; waiting for reconfig or remote heartbeat; Got "NodeNotFound No host described in new configuration 1 for replica set testrs0 maps to this node" while validating { _id: "testrs0", version: 1, members: [ { _id: 0, host: "hadoop1.abc.com:27017", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 } ], settings: { chainingAllowed: true, heartbeatTimeoutSecs: 10, getLastErrorModes: {}, getLastErrorDefaults: { w: 1, wtimeout: 0 } } }
2015-07-29T20:00:45.433+0800 I REPL [ReplicationExecutor] New replica set config in use: { _id: "testrs0", version: 1, members: [ { _id: 0, host: "hadoop1.abc.com:27017", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 } ], settings: { chainingAllowed: true, heartbeatTimeoutSecs: 10, getLastErrorModes: {}, getLastErrorDefaults: { w: 1, wtimeout: 0 } } }
2015-07-29T20:00:45.433+0800 I REPL [ReplicationExecutor] This node is not a member of the config
2015-07-29T20:00:45.433+0800 I REPL [ReplicationExecutor] transition to REMOVED
2015-07-29T20:00:45.433+0800 I REPL [ReplicationExecutor] Starting replication applier threads
2015-07-29T20:00:49.067+0800 I NETWORK [initandlisten] connection accepted from 127.0.0.1:58852 #1 (1 connection now open)
2015-07-29T20:01:17.436+0800 I COMMAND [conn1] replSet info initiate : no configuration specified. Using a default configuration for the set
2015-07-29T20:01:17.436+0800 I COMMAND [conn1] replSet created this configuration for initiation : { _id: "testrs0", version: 1, members: [ { _id: 0, host: "hadoop1.abc.com:27017" } ] }
2015-07-29T20:01:17.436+0800 I REPL [conn1] replSetInitiate admin command received from client
[root@hadoop1 ~]# service mongod stop Stopping mongod: [確定] You have new mail in /var/spool/mail/root [root@hadoop1 ~]# vim /etc/mongod.conf #開啟了 bind 127.0.0.1 把本地限制訪問了 #bind 127.0.0.1 [root@hadoop1 data]# service mongod start Starting mongod: [確定] > rs.initiate() { "info2" : "no configuration explicitly specified -- making one", "me" : "hadoop1.abc.com:27017", "info" : "try querying local.system.replset to see current configuration", "ok" : 0, "errmsg" : "already initialized", "code" : 23 testrs0:PRIMARY> rs.status() { "set" : "testrs0", "date" : ISODate("2015-07-29T12:13:27.839Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "hadoop1.abc.com:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 232, "optime" : Timestamp(1438168698, 1), "optimeDate" : ISODate("2015-07-29T11:18:18Z"), "electionTime" : Timestamp(1438171776, 1), "electionDate" : ISODate("2015-07-29T12:09:36Z"), "configVersion" : 1, "self" : true } ], "ok" : 1 }
5、將其他的節(jié)點(diǎn)加入復(fù)制集。
通過 rs.add() 來將剩下的節(jié)點(diǎn)加入復(fù)制集。
testrs0:PRIMARY> rs.add("192.168.1.4:27017") { "ok" : 1 } testrs0:PRIMARY> rs.status() { "set" : "testrs0", "date" : ISODate("2015-07-30T02:09:45.871Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "hadoop1.abc.com:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 50410, "optime" : Timestamp(1438222179, 1), "optimeDate" : ISODate("2015-07-30T02:09:39Z"), "electionTime" : Timestamp(1438171776, 1), "electionDate" : ISODate("2015-07-29T12:09:36Z"), "configVersion" : 2, "self" : true }, { "_id" : 1, "name" : "192.168.1.4:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 6, "optime" : Timestamp(1438222179, 1), "optimeDate" : ISODate("2015-07-30T02:09:39Z"), "lastHeartbeat" : ISODate("2015-07-30T02:09:45.081Z"), "lastHeartbeatRecv" : ISODate("2015-07-30T02:09:45.183Z"), "pingMs" : 1, "configVersion" : 2 } ], "ok" : 1 }
testrs0:PRIMARY> rs.add("192.168.1.5:27017") { "ok" : 1 } testrs0:PRIMARY> rs.status() { "set" : "testrs0", "date" : ISODate("2015-07-30T02:28:52.382Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "hadoop1.abc.com:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 51557, "optime" : Timestamp(1438223187, 1), "optimeDate" : ISODate("2015-07-30T02:26:27Z"), "electionTime" : Timestamp(1438171776, 1), "electionDate" : ISODate("2015-07-29T12:09:36Z"), "configVersion" : 3, "self" : true }, { "_id" : 1, "name" : "192.168.1.4:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 1153, "optime" : Timestamp(1438223187, 1), "optimeDate" : ISODate("2015-07-30T02:26:27Z"), "lastHeartbeat" : ISODate("2015-07-30T02:28:52.337Z"), "lastHeartbeatRecv" : ISODate("2015-07-30T02:28:50.438Z"), "pingMs" : 0, "syncingTo" : "hadoop1.abc.com:27017", "configVersion" : 3 }, { "_id" : 2, "name" : "192.168.1.5:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 13, "optime" : Timestamp(1438223187, 1), "optimeDate" : ISODate("2015-07-30T02:26:27Z"), "lastHeartbeat" : ISODate("2015-07-30T02:28:50.437Z"), "lastHeartbeatRecv" : ISODate("2015-07-30T02:28:50.478Z"), "pingMs" : 1, "configVersion" : 3 } ], "ok" : 1 } testrs0:PRIMARY> rs.isMaster() { "setName" : "testrs0", "setVersion" : 3, "ismaster" : true, "secondary" : false, "hosts" : [ "hadoop1.abc.com:27017", "192.168.1.4:27017", "192.168.1.5:27017" ], "primary" : "hadoop1.abc.com:27017", "me" : "hadoop1.abc.com:27017", "electionId" : ObjectId("55b8c280790a6c1f967f6147"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2015-07-30T02:30:18Z"), "maxWireVersion" : 3, "minWireVersion" : 0, "ok" : 1 }
其他節(jié)點(diǎn)hadoop2驗(yàn)證一下
testrs0:SECONDARY> rs.isMaster() { "setName" : "testrs0", "setVersion" : 3, "ismaster" : false, "secondary" : true, "hosts" : [ "hadoop1.abc.com:27017", "192.168.1.4:27017", "192.168.1.5:27017" ], "primary" : "hadoop1.abc.com:27017", "me" : "192.168.1.4:27017", "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2015-07-30T02:32:43.546Z"), "maxWireVersion" : 3, "minWireVersion" : 0, "ok" : 1 }
6、在主節(jié)點(diǎn)上創(chuàng)建數(shù)據(jù),從節(jié)點(diǎn)是否獲取到
testrs0:PRIMARY> use testdb switched to db testdb testrs0:PRIMARY> db.testcoll.insert({Name: "test",Age: 50,Gender: "F"}) WriteResult({ "nInserted" : 1 }) testrs0:PRIMARY> db.testcoll.find() { "_id" : ObjectId("55b9945b92ad0ab98483695e"), "Name" : "test", "Age" : 60, "Gender" : "F" } { "_id" : ObjectId("55b994ce92ad0ab98483695f"), "Name" : "test", "Age" : 50, "Gender" : "F" }
在從節(jié)點(diǎn)上查詢,是不可以直接查詢,要使用一個(gè)命令rs.slave()把自己提升為從節(jié)點(diǎn)
testrs0:SECONDARY> rs.slaveOk() testrs0:SECONDARY> use testdb; switched to db testdb testrs0:SECONDARY> db.testcoll.find() { "_id" : ObjectId("55b9945b92ad0ab98483695e"), "Name" : "test", "Age" : 60, "Gender" : "F" } { "_id" : ObjectId("55b994ce92ad0ab98483695f"), "Name" : "test", "Age" : 50, "Gender" : "F" }
7、讓主節(jié)點(diǎn)hadoop1掛掉
[root@hadoop1 data]# service mongod stop Stopping mongod:
在hadoop3驗(yàn)證一下
testrs0:PRIMARY> rs.status() { "set" : "testrs0", "date" : ISODate("2015-07-30T04:36:19.677Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "hadoop1.abc.com:27017", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : Timestamp(0, 0), "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2015-07-30T04:36:19.503Z"), "lastHeartbeatRecv" : ISODate("2015-07-30T04:33:18.147Z"), "pingMs" : 0, "lastHeartbeatMessage" : "Failed attempt to connect to hadoop1.abc.com:27017; couldn't connect to server hadoop1.abc.com:27017 (192.168.1.3), connection attempt failed", "configVersion" : -1 }, { "_id" : 1, "name" : "192.168.1.4:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 7661, "optime" : Timestamp(1438225614, 1), "optimeDate" : ISODate("2015-07-30T03:06:54Z"), "lastHeartbeat" : ISODate("2015-07-30T04:36:19.335Z"), "lastHeartbeatRecv" : ISODate("2015-07-30T04:36:19.348Z"), "pingMs" : 0, "configVersion" : 3 }, { "_id" : 2, "name" : "192.168.1.5:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 7664, "optime" : Timestamp(1438225614, 1), "optimeDate" : ISODate("2015-07-30T03:06:54Z"), "electionTime" : Timestamp(1438230801, 1), "electionDate" : ISODate("2015-07-30T04:33:21Z"), "configVersion" : 3, "self" : true } ], "ok" : 1 } testrs0:PRIMARY> db.isMaster() { "setName" : "testrs0", "setVersion" : 3, "ismaster" : true, "secondary" : false, "hosts" : [ "hadoop1.abc.com:27017", "192.168.1.4:27017", "192.168.1.5:27017" ], "primary" : "192.168.1.5:27017", "me" : "192.168.1.5:27017", "electionId" : ObjectId("55b9a91100e446910c89a0a3"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2015-07-30T04:37:33.090Z"), "maxWireVersion" : 3, "minWireVersion" : 0, "ok" : 1 } testrs0:PRIMARY> db.testcoll.insert ({Name: "tom",Age: 45,Gender: "G"}) WriteResult({ "nInserted" : 1 })
回到hadoop2查看一下數(shù)據(jù)
testrs0:SECONDARY> db.testcoll.find() { "_id" : ObjectId("55b9942d92ad0ab98483695c"), "Name" : "test", "Age" : 60, "Gender" : "F" } { "_id" : ObjectId("55b9944892ad0ab98483695d"), "Name" : "test", "Age" : 60, "Gender" : "F" } { "_id" : ObjectId("55b9945b92ad0ab98483695e"), "Name" : "test", "Age" : 60, "Gender" : "F" } { "_id" : ObjectId("55b994ce92ad0ab98483695f"), "Name" : "test", "Age" : 50, "Gender" : "F" } { "_id" : ObjectId("55b9aa714b575261aff42f25"), "Name" : "tom", "Age" : 45, "Gender" : "G" }
讓hadoop1上線
[root@hadoop1 data]# service mongod start Starting mongod:
再驗(yàn)證一下狀態(tài),但不能奪回主動(dòng)權(quán),除非讓它優(yōu)先級(jí)高一點(diǎn)。
這種場景下,它自動(dòng)成為從的了
testrs0:SECONDARY> rs.status() { "set" : "testrs0", "date" : ISODate("2015-07-30T04:44:16.534Z"), "myState" : 2, "syncingTo" : "192.168.1.4:27017", "members" : [ { "_id" : 0, "name" : "hadoop1.abc.com:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 165, "optime" : Timestamp(1438231153, 1), "optimeDate" : ISODate("2015-07-30T04:39:13Z"), "syncingTo" : "192.168.1.4:27017", "configVersion" : 3, "self" : true }, { "_id" : 1, "name" : "192.168.1.4:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 164, "optime" : Timestamp(1438231153, 1), "optimeDate" : ISODate("2015-07-30T04:39:13Z"), "lastHeartbeat" : ISODate("2015-07-30T04:44:16.199Z"), "lastHeartbeatRecv" : ISODate("2015-07-30T04:44:15.824Z"), "pingMs" : 0, "syncingTo" : "192.168.1.5:27017", "configVersion" : 3 }, { "_id" : 2, "name" : "192.168.1.5:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 164, "optime" : Timestamp(1438231153, 1), "optimeDate" : ISODate("2015-07-30T04:39:13Z"), "lastHeartbeat" : ISODate("2015-07-30T04:44:16.185Z"), "lastHeartbeatRecv" : ISODate("2015-07-30T04:44:14.902Z"), "pingMs" : 0, "electionTime" : Timestamp(1438230801, 1), "electionDate" : ISODate("2015-07-30T04:33:21Z"), "configVersion" : 3 } ], "ok" : 1 } testrs0:SECONDARY> rs.slaveOk() testrs0:SECONDARY> db.testcoll.find() testrs0:SECONDARY> use testdb switched to db testdb testrs0:SECONDARY> db.testcoll.find() { "_id" : ObjectId("55b9942d92ad0ab98483695c"), "Name" : "test", "Age" : 60, "Gender" : "F" } { "_id" : ObjectId("55b9944892ad0ab98483695d"), "Name" : "test", "Age" : 60, "Gender" : "F" } { "_id" : ObjectId("55b9945b92ad0ab98483695e"), "Name" : "test", "Age" : 60, "Gender" : "F" } { "_id" : ObjectId("55b994ce92ad0ab98483695f"), "Name" : "test", "Age" : 50, "Gender" : "F" } { "_id" : ObjectId("55b9aa714b575261aff42f25"), "Name" : "tom", "Age" : 45, "Gender" : "G" }
7、定義優(yōu)先級(jí)
使用 rs.conf() 來查看 復(fù)制集配置對(duì)象 :
testrs0:SECONDARY> rs.conf() { "_id" : "testrs0", "version" : 3, "members" : [ { "_id" : 0, "host" : "hadoop1.abc.com:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 1, "host" : "192.168.1.4:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 2, "host" : "192.168.1.5:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatTimeoutSecs" : 10, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } }
在hadoop3的主節(jié)點(diǎn)把hadoop1的優(yōu)先級(jí)定義為2,讓它成為主節(jié)點(diǎn)
將復(fù)制集配置對(duì)象復(fù)制給一個(gè)變量(如 mycfg )。然后通過該變量對(duì)該節(jié)點(diǎn)設(shè)置優(yōu)先級(jí)。然后通過 rs.reconfig() 來更新復(fù)制集配置。
注意,設(shè)置優(yōu)先級(jí)用這個(gè)命令mycfg.members[數(shù)組中第幾個(gè)節(jié)點(diǎn)].priority = 2
testrs0:PRIMARY> rs.conf() { "_id" : "testrs0", "version" : 3, "members" : [ { "_id" : 0, "host" : "hadoop1.abc.com:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 1, "host" : "192.168.1.4:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 2, "host" : "192.168.1.5:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatTimeoutSecs" : 10, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } } testrs0:PRIMARY> mycfg=rs.conf() { "_id" : "testrs0", "version" : 3, "members" : [ { "_id" : 0, "host" : "hadoop1.abc.com:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 1, "host" : "192.168.1.4:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 2, "host" : "192.168.1.5:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatTimeoutSecs" : 10, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } } testrs0:PRIMARY> mycfg.members[0].priority = 2 2 testrs0:PRIMARY> rs.reconfig(mycfg) { "ok" : 1 } testrs0:PRIMARY> 2015-07-30T14:34:44.437+0800 I NETWORK DBClientCursor::init call() failed 2015-07-30T14:34:44.439+0800 I NETWORK trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed 2015-07-30T14:34:44.452+0800 I NETWORK reconnect 127.0.0.1:27017 (127.0.0.1) ok testrs0:SECONDARY>
在hadoop1上查看,并停掉hadoop1的服務(wù)
testrs0:PRIMARY> rs.status() { "set" : "testrs0", "date" : ISODate("2015-07-30T06:51:11.952Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "hadoop1.abc.com:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 7780, "optime" : Timestamp(1438238074, 1), "optimeDate" : ISODate("2015-07-30T06:34:34Z"), "electionTime" : Timestamp(1438238079, 1), "electionDate" : ISODate("2015-07-30T06:34:39Z"), "configVersion" : 4, "self" : true }, { "_id" : 1, "name" : "192.168.1.4:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 7780, "optime" : Timestamp(1438238074, 1), "optimeDate" : ISODate("2015-07-30T06:34:34Z"), "lastHeartbeat" : ISODate("2015-07-30T06:51:11.072Z"), "lastHeartbeatRecv" : ISODate("2015-07-30T06:51:11.375Z"), "pingMs" : 0, "configVersion" : 4 }, { "_id" : 2, "name" : "192.168.1.5:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 7780, "optime" : Timestamp(1438238074, 1), "optimeDate" : ISODate("2015-07-30T06:34:34Z"), "lastHeartbeat" : ISODate("2015-07-30T06:51:11.779Z"), "lastHeartbeatRecv" : ISODate("2015-07-30T06:51:10.299Z"), "pingMs" : 0, "configVersion" : 4 } ], "ok" : 1 } testrs0:PRIMARY> quit() You have new mail in /var/spool/mail/root [root@hadoop1 ~]# service mongo stop mongo: 未被識(shí)別的服務(wù) [root@hadoop1 ~]# service mongod stop Stopping mongod:
在hadoop3查看,兩個(gè)節(jié)點(diǎn)還是會(huì)自動(dòng)選舉主節(jié)點(diǎn)的
testrs0:PRIMARY> rs.status() { "set" : "testrs0", "date" : ISODate("2015-07-30T06:55:18.238Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "hadoop1.abc.com:27017", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : Timestamp(0, 0), "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2015-07-30T06:55:16.275Z"), "lastHeartbeatRecv" : ISODate("2015-07-30T06:51:44.879Z"), "pingMs" : 5, "lastHeartbeatMessage" : "Failed attempt to connect to hadoop1.abc.com:27017; couldn't connect to server hadoop1.abc.com:27017 (192.168.1.3), connection attempt failed", "configVersion" : -1 }, { "_id" : 1, "name" : "192.168.1.4:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 16000, "optime" : Timestamp(1438238074, 1), "optimeDate" : ISODate("2015-07-30T06:34:34Z"), "lastHeartbeat" : ISODate("2015-07-30T06:55:17.988Z"), "lastHeartbeatRecv" : ISODate("2015-07-30T06:55:17.988Z"), "pingMs" : 1, "lastHeartbeatMessage" : "could not find member to sync from", "configVersion" : 4 }, { "_id" : 2, "name" : "192.168.1.5:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 16003, "optime" : Timestamp(1438238074, 1), "optimeDate" : ISODate("2015-07-30T06:34:34Z"), "electionTime" : Timestamp(1438239108, 1), "electionDate" : ISODate("2015-07-30T06:51:48Z"), "configVersion" : 4, "self" : true } ], "ok" : 1 }
把hadoop1服務(wù)啟動(dòng),因?yàn)閮?yōu)先級(jí)設(shè)為2,故推舉它為主節(jié)點(diǎn)
testrs0:PRIMARY> rs.i rs.initiate( rs.isMaster( testrs0:PRIMARY> rs.isMaster() { "setName" : "testrs0", "setVersion" : 4, "ismaster" : true, "secondary" : false, "hosts" : [ "hadoop1.abc.com:27017", "192.168.1.4:27017", "192.168.1.5:27017" ], "primary" : "hadoop1.abc.com:27017", "me" : "hadoop1.abc.com:27017", "electionId" : ObjectId("55b9ca84ddeeac6a93355c18"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2015-07-30T06:56:28.472Z"), "maxWireVersion" : 3, "minWireVersion" : 0, "ok" : 1 }
8、觸發(fā)重新選舉
優(yōu)先級(jí)為0的節(jié)點(diǎn),無權(quán)觸發(fā);僅參與選舉
使用的命令rs.addArb()
9、多端口復(fù)制集
應(yīng)用程序需要連接多個(gè)復(fù)制集,那么每個(gè)復(fù)制集需要有不同的名字
1)為每個(gè)節(jié)點(diǎn)建立必要的數(shù)據(jù)文件夾:
[root@hadoop1 ~]# mkdir -pv /srv/mongodb/rs0-0 /srv/mongodb/rs0-1 /srv/mongodb/rs0-2 mkdir: 已創(chuàng)建目錄 "/srv/mongodb" mkdir: 已創(chuàng)建目錄 "/srv/mongodb/rs0-0" mkdir: 已創(chuàng)建目錄 "/srv/mongodb/rs0-1" mkdir: 已創(chuàng)建目錄 "/srv/mongodb/rs0-2" You have new mail in /var/spool/mail/root
2)啟動(dòng)mongod實(shí)例
第一個(gè)節(jié)點(diǎn)
[root@hadoop1 rs0-0]# mongod --port 27018 --dbpath /srv/mongodb/rs0-0 --replSet rs0 --smallfiles --oplogSize 128 &
第二個(gè)節(jié)點(diǎn)
[root@hadoop1 ~]# mongod --port 27019 --dbpath /srv/mongodb/rs0-1 --replSet rs0 --smallfiles --oplogSize 128 &
第三個(gè)節(jié)點(diǎn)
[root@hadoop1 ~]# mongod --port 27020 --dbpath /srv/mongodb/rs0-2 --replSet rs0 --smallfiles --oplogSize 128 &
驗(yàn)證
[root@hadoop1 ~]# netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:27019 0.0.0.0:* LISTEN 15718/mongod tcp 0 0 0.0.0.0:27020 0.0.0.0:* LISTEN 15785/mongod tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1081/rpcbind tcp 0 0 0.0.0.0:28017 0.0.0.0:* LISTEN 14221/mongod tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1285/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1157/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1361/master tcp 0 0 0.0.0.0:44378 0.0.0.0:* LISTEN 1099/rpc.statd tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 14221/mongod tcp 0 0 0.0.0.0:27018 0.0.0.0:* LISTEN 15640/mongod tcp 0 0 :::111 :::* LISTEN 1081/rpcbind tcp 0 0 :::22 :::* LISTEN 1285/sshd tcp 0 0 ::1:631 :::* LISTEN 1157/cupsd tcp 0 0 ::1:25 :::* LISTEN 1361/master tcp 0 0 :::48510 :::* LISTEN 1099/rpc.statd
3)指明所需連接的端口,來通過 mongo 命令連接到某個(gè) mongod 實(shí)例
[root@hadoop1 mongodb]# mongo --port 27018 MongoDB shell version: 3.0.5 connecting to: 127.0.0.1:27018/test 2015-07-30T16:26:01.442+0800 I NETWORK [initandlisten] connection accepted from 127.0.0.1:54185 #1 (1 connection now open) Server has startup warnings: 2015-07-30T16:19:14.667+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 2015-07-30T16:19:14.667+0800 I CONTROL [initandlisten] 2015-07-30T16:19:14.668+0800 I CONTROL [initandlisten] 2015-07-30T16:19:14.668+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 2015-07-30T16:19:14.668+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2015-07-30T16:19:14.668+0800 I CONTROL [initandlisten] 2015-07-30T16:19:14.668+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 2015-07-30T16:19:14.668+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never' 2015-07-30T16:19:14.668+0800 I CONTROL [initandlisten] >
最后關(guān)于
由四個(gè)節(jié)點(diǎn)組成的異地分布復(fù)制集有以下兩個(gè)需要注意的:
一個(gè)節(jié)點(diǎn)(如``hadoop4.abc.net``) 必須是一個(gè) arbiter。這個(gè)節(jié)點(diǎn)可以在服務(wù)的任何機(jī)器上運(yùn)行,或者在其他的MongoDB機(jī)器上運(yùn)行。
我們需要決定如何分配節(jié)點(diǎn)。下列有3種架構(gòu)類型:
在大多數(shù)情況下,由于第一種架構(gòu)的易用性,我們更推薦第一種架構(gòu)。
3個(gè)節(jié)點(diǎn)在Site A中,一個(gè) 優(yōu)先級(jí)為0的節(jié)點(diǎn) 在Site B中,與此同時(shí)Site A中還要有個(gè)投票節(jié)點(diǎn)。
兩個(gè)節(jié)點(diǎn)在Site A,兩個(gè) 優(yōu)先級(jí)為0的節(jié)點(diǎn) 在Site B ,同時(shí)一個(gè)投票節(jié)點(diǎn)在Site A。
兩個(gè)節(jié)點(diǎn)在Site A,一個(gè)優(yōu)先級(jí)為0的節(jié)點(diǎn)在Site B,一個(gè)優(yōu)先級(jí)為0的節(jié)點(diǎn)在Site C,同時(shí)一個(gè)投票節(jié)點(diǎn)在Site A。
在大多數(shù)情況下,由于第一種架構(gòu)的易用性,更推薦第一種架構(gòu)。
復(fù)制集參考
Replication Methods in the mongo Shell 命令 描述 rs.add() 為復(fù)制集新增節(jié)點(diǎn)。 rs.addArb() 為復(fù)制集新增一個(gè) arbiter rs.conf() 返回復(fù)制集配置信息 rs.freeze() 防止當(dāng)前節(jié)點(diǎn)在一段時(shí)間內(nèi)選舉成為主節(jié)點(diǎn)。 rs.help() 返回 replica set 的命令幫助 rs.initiate() 初始化一個(gè)新的復(fù)制集。 rs.printReplicationInfo() 以主節(jié)點(diǎn)的視角返回復(fù)制的狀態(tài)報(bào)告。 rs.printSlaveReplicationInfo() 以從節(jié)點(diǎn)的視角返回復(fù)制狀態(tài)報(bào)告。 rs.reconfig() 通過重新應(yīng)用復(fù)制集配置來為復(fù)制集更新配置。 rs.remove() 從復(fù)制集中移除一個(gè)節(jié)點(diǎn)。 rs.slaveOk() 為當(dāng)前的連接設(shè)置 slaveOk 。不推薦使用。使用 readPref() 和 Mongo.setReadPref() 來設(shè)置 read preference 。 rs.status() 返回復(fù)制集狀態(tài)信息。 rs.stepDown() 讓當(dāng)前的 primary 變?yōu)閺墓?jié)點(diǎn)并觸發(fā) election 。 rs.syncFrom() 設(shè)置復(fù)制集節(jié)點(diǎn)從哪個(gè)節(jié)點(diǎn)處同步數(shù)據(jù),將會(huì)覆蓋默認(rèn)選取邏輯。
復(fù)制集數(shù)據(jù)庫命令
命令 描述 replSetFreeze 防止當(dāng)前節(jié)點(diǎn)在一段時(shí)間內(nèi)選舉成為主節(jié)點(diǎn)。 replSetGetStatus 返回復(fù)制集的狀態(tài)報(bào)告。 replSetInitiate 初始化一個(gè)新的復(fù)制集。 replSetMaintenance 開啟活關(guān)閉維護(hù)模式,維護(hù)模式將使 secondary 進(jìn)入 RECOVERING 狀態(tài)。 replSetReconfig 為已存在的復(fù)制集應(yīng)用新的配置。 replSetStepDown 強(qiáng)制當(dāng)前的 primary *降職*變?yōu)?nbsp;secondary ,并觸發(fā)選舉。 replSetSyncFrom 覆蓋默認(rèn)的復(fù)制來源選取邏輯。 resync 強(qiáng)制 mongod 重新從 master 進(jìn)行初始化復(fù)制。僅在主-從模式。 applyOps 內(nèi)部命令應(yīng)用 oplog 在現(xiàn)在的數(shù)據(jù)集上。 isMaster 返回該節(jié)點(diǎn)的角色信息,包括是否為主節(jié)點(diǎn)。 getoptime 內(nèi)部命令,返回optime。
網(wǎng)站欄目:mongodb復(fù)制集部署
標(biāo)題鏈接:http://aaarwkj.com/article48/pcdjep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、標(biāo)簽優(yōu)化、網(wǎng)站內(nèi)鏈、自適應(yīng)網(wǎng)站、網(wǎng)站改版、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)