Mongodb集群之副本集
上篇咱們遺留了幾個問題
1主節點是否能自己主動切換連接?
眼下須要手動切換
2主節點讀寫壓力過大怎樣解決
3從節點每一個上面的數據都是對數據庫全量拷貝,從節點壓力會不會過大
4數據壓力達到機器支撐不了時候是否能自己主動擴展?
Nosql的產生是為了解決大數據量。高擴展,高性能,靈活數據模型。高可用性。可是光通過主從模型的架構是遠遠達不到上面幾點的。因此。mongodb設計了副本集和分片的功能。咱們以下就來說說副本集
mongodb官方已經不建議使用主從模式,而是副本集進行取代。
IMPORTANT
Replica sets
來自 <http://docs.mongodb.org/master/core/master-slave/>
什麽是副本集
副本集合(ReplicaSets)。是一個基於主/從復制機制的復制功能。但添加了自己主動故障轉移和恢復特性。一個集群最多能夠支持7個server。而且隨意節點都能夠是主節點。
全部的寫操作都被分發到主節點。而讀操作能夠在不論什麽節點上進行。
從圖中能夠發現,client連接到整個副本集,不關系詳細哪一臺server是否宕機。主server負責整個副本集的讀寫。
副本集定期同步數據。一旦主節點掛了。副本節點就會選舉一個新主機作為主節點。
壞掉的節點修好後會自己主動擴充為副本節點。
怎樣配置副本集
在一臺機器上創建三個文件用戶存放三臺數據庫,之後分別配置三臺數據庫,使他們的
配置啟動參數
啟動配置文件
mongoA.bat mongod --configa.conf mongoB.bat mongod --configb.conf mongodbC.bat Mongod--config c.conf
登錄數據庫
ashell.bat mongo 127.0.0.1:9000 b.shell.bat mongo 127.0.0.1:9001 c.shell.bat mongo 127.0.0.1:9002
初始化副本集
在三臺機器上隨意登陸一臺機器輸入例如以下命名回車
use admin db.runCommand({"replSetInitiate":{ "_id":‘child‘, "members":[ {"_id":1,"host":"127.0.0.1:9000"}, {"_id":2,"host":"127.0.0.1:9001"}, {"_id":3,"host":"127.0.0.1:9002",}, ] } })
查看集群狀態
child:SECONDARY> rs.status() { "set" : "child", "date" : ISODate("2015-08-16T07:43:36Z"), "myState" : 2, "syncingTo" : "127.0.0.1:9002", "members" : [ { "_id" : 1, "name" : "127.0.0.1:9000", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 182, "optime" : Timestamp(1439170908, 1), "optimeDate" : ISODate("2015-08-10T01:41:48Z"), "infoMessage" : "syncing to: 127.0.0.1:9002", "self" : true }, { "_id" : 2, "name" : "127.0.0.1:9001", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 7, "optime" : Timestamp(1439170908, 1), "optimeDate" : ISODate("2015-08-10T01:41:48Z"), "lastHeartbeat" : ISODate("2015-08-16T07:43:36Z"), "lastHeartbeatRecv" : ISODate("2015-08-16T07:43:35Z"), "pingMs" : 2, "lastHeartbeatMessage" : "syncing to: 127.0.0.1:9002", "syncingTo" : "127.0.0.1:9002" }, { "_id" : 3, "name" : "127.0.0.1:9002", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 8, "optime" : Timestamp(1439170908, 1), "optimeDate" : ISODate("2015-08-10T01:41:48Z"), "lastHeartbeat" : ISODate("2015-08-16T07:43:35Z"), "lastHeartbeatRecv" : ISODate("2015-08-16T07:43:36Z"), "pingMs" : 772, "electionTime" : Timestamp(1439711010, 1), "electionDate" : ISODate("2015-08-16T07:43:30Z") } ], "ok" : 1 }
整個部分創建成功
副本集數據庫測試
啟動三個數據庫查看僅僅有一個活躍節點其它為副本節點
停掉活躍點,我們查看活躍點
child:PRIMARY>show dbs
2015-08-16T15:51:21.667+0800Socket recv() errno:10053你的主機中的軟件中止了一
個已建立的連接。127.0.0.1:9002
2015-08-16T15:51:21.669+0800SocketException: remote: 127.0.0.1:9002 error: 9001
再次連接數據庫發現 活躍點已轉移到 9000port
再將9002數據庫開啟
查看狀態 9002數據庫為備份點
以上說明我們的副本集已經搭建完畢
小結:
副本集解攻克了我們的故障轉義功能。可是我們還是有一些問題 。從節點每一個上面的數據都是對數據庫全量拷貝。從節點壓力會不會過大?
數據壓力大到機器支撐不了的時候是否能做到自己主動擴展?
Mongodb集群之副本集