上篇咱們遺留了幾個問題
1主節點能否自動切換連接?目前需要手動切換
2主節點讀寫壓力過大如何解決
3從節點每個上面的數據都是對數據庫全量拷貝,從節點壓力會不會過大
4數據壓力達到機器支撐不了時候能否自動擴展?
Nosql的產生是爲了解決大數據量,高擴展,高性能,靈活數據模型,高可用性。但是光通過主從模型的架構是遠遠達不到上面幾點的。因此,mongodb設計了副本集和分片的功能。咱們下面就來說說副本集
mongodb官方已經不建議使用主從模式,而是副本集進行代替。
IMPORTANT
Replica sets replace master-slave replication for most use cases. If possible, use replicasets rather than master-slave replication for all new production deployments.This documentation remains to support legacy deployments and for archivalpurposes only.
來自 <http://docs.mongodb.org/master/core/master-slave/>
什麼是副本集
副本集合(ReplicaSets),是一個基於主/從複製機制的複製功能,但增加了自動故障轉移和恢復特性。一個集羣最多可以支持7個服務器,並且任意節點都可以是主節點。所有的寫操作都被分發到主節點,而讀操作可以在任何節點上進行。
從圖中可以發現,客戶端連接到整個副本集,不關係具體哪一臺服務器是否宕機。主服務器負責整個副本集的讀寫。副本集定期同步數據,一旦主節點掛了,副本節點就會選舉一個新主機作爲主節點。壞掉的節點修好後會自動擴充爲副本節點。
如何配置副本集
在一臺機器上創建三個文件用戶存放三臺數據庫,之後分別配置三臺數據庫,使他們的replset(複製集分別形成閉環)配置啓動數據庫。
配置啓動參數
啓動配置文件
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
再次連接數據庫發現 活躍點已轉移到 9000端口
再將9002數據庫開啓
查看狀態 9002數據庫爲備份點
以上說明我們的副本集已經搭建完成
小結:
副本集解解決了我們的故障轉義功能,但是我們還是有一些問題 ,從節點每個上面的數據都是對數據庫全量拷貝,從節點壓力會不會過大?
數據壓力大到機器支撐不了的時候能否做到自動擴展?