1. 程式人生 > >Mongodb集群之副本集

Mongodb集群之副本集

only sim post ims mongob sta art 機制 wid

上篇咱們遺留了幾個問題

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個server。而且隨意節點都能夠是主節點。

全部的寫操作都被分發到主節點。而讀操作能夠在不論什麽節點上進行。

技術分享

技術分享

從圖中能夠發現,client連接到整個副本集,不關系詳細哪一臺server是否宕機。主server負責整個副本集的讀寫。

副本集定期同步數據。一旦主節點掛了。副本節點就會選舉一個新主機作為主節點。

壞掉的節點修好後會自己主動擴充為副本節點。


怎樣配置副本集

在一臺機器上創建三個文件用戶存放三臺數據庫,之後分別配置三臺數據庫,使他們的

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

再次連接數據庫發現 活躍點已轉移到 9000port

技術分享

再將9002數據庫開啟

查看狀態 9002數據庫為備份點

技術分享

以上說明我們的副本集已經搭建完畢

小結:


副本集解攻克了我們的故障轉義功能。可是我們還是有一些問題 。從節點每一個上面的數據都是對數據庫全量拷貝。從節點壓力會不會過大?

數據壓力大到機器支撐不了的時候是否能做到自己主動擴展?

Mongodb集群之副本集