MongoDB的Sharding機制解決了海量存儲和動態擴容的問題,但離生產環境的高可靠,高可用還有距離,Sharding在單點出現故障時就無能為力了。但是MongoDB的副本集卻可以很輕松的處理單點故障,所以就有了Replica Sets + Sharding的高可用,高安全的架構。
架構如下:
1,shard服務器:使用Replica Sets確保每個數據節點都具有備份、自動容錯轉移、自動恢復的能力。
2,配置服務器:使用使用3個配置服務器確保元數據完整性
3,路由進程:使用3個路由進程實現平衡,提高客戶端接入性能,架構如下
3個分片進程:shard11,shard12,shard13組成一個副本集,提供Sharding中shard1的功能。
3個分片進程:shard21,shard22,shard23組成一個副本集,提供Sharding中shard2的功能。
3個配置服務器進程和3個路由器進程
--------------------------------------------------------------------------------------------
現在我們開始搭建整個架構(因為沒那么多機器,我還是用本地的目錄來模擬機器)
主機 | ip | 服務及端口 |
ServerA mongodb1 mongodb2 mongodb3 mongodb4 |
127.0.0.1 | mongod shard11:10000 mongod shard21:20000 mongod config 1:30000 mongos :40000 |
ServerB mongodb5 mongodb6 mongodb7 mongodb4 |
127.0.0.1 | mongod shard12:10001 mongod shard22:20001 mongod config 2:30001 mongos :40000 |
ServerC mongodb9 mongodb8 mongodb11 mongodb4 |
127.0.0.1 | mongod shard13:10002 mongod shard23:20002 mongod config 3:30002 mongos :40000 |
1,啟動Shard1進程並配置Replica Sets
啟動mongod shard11進程,副本集名稱:shard1
啟動mongod shard12進程,並設置副本集:shard1
啟動mongod shard13進程,並設置副本集:shard1
把這三個進程配置成副本集,新開一個cmd,用來執行各種非啟動命令,連接到上面三個進程中的任何一個,把他們配置成副本集,操作如下
2,啟動Shard2進程並配置Replica Sets
啟動mongod shard21進程,副本集名稱:shard2
啟動mongod shard22進程,並設置副本集:shard2
啟動mongod shard23進程,並設置副本集:shard2
把這三個進程配置成副本集,操作如下
到此兩個副本集夠成的分片已經配置完成,下面配置Config server和Route process
3,配置3個Config Server
4配置Route Process
chunk大小為1M,方便我們測試效果。
5配置分片的表和片鍵
我用的還是Friends庫中的FriendUser表來做分片,片鍵是_id,因為cmd寬度太小了添加分片的命令顯示不完全,我手動把他們列出來
添加分片
db.runCommand({addshard:"shard1/127.0.0.1:10000,127.0.0.1:10001,127.0.0.1:10002"})
db.runCommand({addshard:"shard2/127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002"})
到此整個構架已經配置完成了,我們來驗證下配置的情況,我通過客戶端添加10000條數據到數據庫中
可以看到分片已經執行。
------------------------------------------------------------------------------------------------
現在做下容災的測試,我停掉shard11,看看結果會如何。
打開shard11的 cmd窗口,Ctrl+C停止進程
查看下狀態
狀態完好,我在插入20000條數據,看看效果
可以看到依然可以運行。
這里會出現這種情況:當有三台機器做副本集的時候,只能是一太服務器當掉,當有兩台當掉的時候,第三台不能由從庫變為主庫。
這里應該注意副本集的選舉規則: 當主庫當掉時,次節點將觸發選舉。 收到副本集大多數成員投票的第一個節點將成為主節點。副本集選舉最重要的功能是副本集的大多數原始成員節點必須參與選舉才能成功。如果您的副本集包含三個 成員,有兩個或三個節點可以相互連接時該副本集可選出一個主節點。如果該副本集中有兩個節點脫機,則剩余的一個節點仍將作為次節點。