一、節點類型
standard:常規節點,它存儲一份完整的數據副本,參與選舉投票,有可能成爲活躍節點。
passive:存儲了完整的數據副本,參與投票,不能成爲活躍節點。
arbiter:仲裁節點,只參與投票,不接收復制的數據,也不能成爲活躍節點。
二、主從複製的集羣還是有兩點區別的。
配置228啓動文件:
配置227啓動文件:
配置結束後,重啓服務
瀏覽器從節點關鍵信息查看:
<1>: 該集羣沒有特定的主數據庫。
<2>: 如果哪個主數據庫宕機了,集羣中就會推選出一個從屬數據庫作爲主數據庫頂上,這就具備了自動故障恢復功能
注:
1、不需要像mysql一樣複製完整數據過去,叢庫啓動會制動複製主庫完整數據。
2、叢庫自動配置爲只讀。
3、mongodb第一次啓動時間較長,需要注意等待。
4、管理命令多數都要在admin庫中執行use admin
三、創建副本集
1. 環境說明:
ip:192.168.1.228 (初始計劃設定其爲master)
ip:192.168.1.227 (初始計劃設定其爲slave)
ip:192.168.1.229 (初始計劃設定其爲arbiter ,即仲裁服務器)
2. 爲副本集取名weijh
配置229啓動文件:
dbpath=/usr/data/mongodb/data/db
port=27017
logpath=/usr/data/mongodb/log/mongodb.log
logappend=true
journal=true
fork=true
replSet=weijh/192.168.1.228
配置228啓動文件:
dbpath=/usr/data/mongodb/data/db
port=27017
logpath=/usr/data/mongodb/log/mongodb.log
logappend=true
journal=true
fork=true
replSet=weijh/192.168.1.229
配置227啓動文件:
dbpath=/usr/data/mongodb/data/db
port=27017
logpath=/usr/data/mongodb/log/mongodb.log
logappend=true
journal=true
fork=true
replSet=weijh/192.168.1.228
配置結束後,重啓服務
3、 在瀏覽器打開鏈接
看到我們需要初始化節點
4、初始化節點
我們連接到其中一個節點上,並使用replSetInitiate命令進行初始化。此命令需要一個配置對象,指定設定的每個成員的名字。
在228節點上進行初始化(隨便連接一下哪個服務器都行,不過一定要進入admin集合)
1)執行命令:
出現錯誤:
2)清除數據庫下所有新創建的數據庫信息
3)再次執行命令
5、查看狀態:
瀏覽器主節點查看:
09:57:02 [ReplSetHealthPollTask] replSet info 192.168.1.229:27017 is up
09:57:02 [ReplSetHealthPollTask] replSet member 192.168.1.229:27017 STARTUP2
09:57:02 [rs Manager] replSet info electSelf 1
09:57:02 [rs Manager] replSet PRIMARY
09:57:04 [initandlisten] connection accepted from 192.168.1.229:46257 #7
09:57:04 [initandlisten] connection accepted from 192.168.1.229:46258 #8
09:57:04 [conn8] end connection 192.168.1.229:46258
09:57:04 [initandlisten] connection accepted from 192.168.1.229:46259 #9
09:57:04 [conn9] end connection 192.168.1.229:46259
09:57:04 [ReplSetHealthPollTask] replSet member 192.168.1.229:27017 RECOVERING
09:57:04 [conn7] end connection 192.168.1.229:46257
09:57:05 [initandlisten] connection accepted from 192.168.1.229:46260 #10
09:57:06 [ReplSetHealthPollTask] replSet member 192.168.1.229:27017 SECONDARY
09:57:06 [slaveTracking] building new index on { _id: 1 } for local.slaves
瀏覽器從節點關鍵信息查看:
09:57:03 [ReplSetHealthPollTask] replSet member 192.168.1.228:27017 PRIMARY
09:57:04 [replica set sync] ******
09:57:04 [replica set sync] replSet initial sync pending
09:57:04 [replica set sync] replSet syncing to: 192.168.1.228:27017
09:57:04 [replica set sync] building new index on { _id: 1 } for local.me
09:57:04 [dur] lsn set 139505
09:57:04 [replica set sync] done for 0 records 0.045secs
09:57:04 [replica set sync] replSet initial sync drop all databases
09:57:04 [replica set sync] dropAllDatabasesExceptLocal 1
09:57:04 [replica set sync] replSet initial sync clone all databases
09:57:04 [replica set sync] replSet initial sync cloning db: admin
09:57:04 [replica set sync] replauthenticate: no user in local.system.users to use for authentication
replSet initial sync query minValid
09:57:04 [replica set sync] replSet initial sync initial oplog application
09:57:04 [replica set sync] replSet initial sync finishing up
09:57:04 [replica set sync] replSet set minValid=52575ae3:1
09:57:04 [replica set sync] building new index on { _id: 1 } for local.replset.minvalid
09:57:04 [replica set sync] done for 0 records 0secs
09:57:04 [replica set sync] replSet initial sync done
09:57:05 [replica set sync] replSet SECONDARY
rs.status()
6、添加仲裁節點
我們在admin集合中使用rs.addArb()追加即可
rs.addArb("192.168.1.227")
查看狀態:
該仲裁節點不參與數據的複製,只是參與投票選擇主節點而已
在該節點爲not reachable/healthy的狀態下是起不到投票主節點的作用的。刪除227服務琪上的db文件,重啓
在該節點爲not reachable/healthy的狀態下是起不到投票主節點的作用的。刪除227服務琪上的db文件,重啓
查看狀態:
添加仲裁節點成功
7、在主節點添加數據:
從節點查看數據信息
在從節點228上可以同步到主節點的數據信息,但無法查看
8、228主幾點宕掉,查看229狀態
可以看到229 從secondary變味primary了
9、啓動228,但是228不再爲primary了,而爲secondary了
10、首先這是正常的,因爲SECONDARY是不允許讀寫的, 在寫多讀少的應用中,使用Replica Sets來實現讀寫分離。通過在連接時指定或者在主庫指定slaveOk,由Secondary來分擔讀的壓力,Primary只承擔寫操作。對於replica set 中的secondary 節點默認是不可讀的:
weijh:SECONDARY> use testCp
switched to db testCp
weijh:SECONDARY> show collections
Fri Oct 11 10:09:36 uncaught exception: error: { "$err" : "not master and slaveok=false", "code" : 13435 }
若需要SECONDARY可以執行讀的操作,在SECONDARY執行slaveok方法
執行查詢操作測試:
weijh:SECONDARY> db.getMongo()
connection to 127.0.0.1
weijh:SECONDARY> db.getMongo().setSlaveOk()
not master and slaveok=false
執行查詢操作測試:
參考資料網頁: