MongoDB 分散式可拓展集群的研究
來自專欄深度學習之入門實踐
簡言:目前很多現實中的數據無法用關係型資料庫存儲時候,一些nosql的資料庫脫穎而出,本文不去贅述為什麼mongodb的好處,僅僅是為了能夠大家對於mongodb集群搭建的一些個人實踐理解和感觸。
很多人搭建了一個mongo集群,就說自己的集群已經是分散式的了,可以很容易的拓展。
可以在primary的節點下,執行如下命令,一直增加機器:
rs.add("ip:port")
看似好像集群可以無限拓展,也有shard,也有副本集,但是卻完全沒有分散式的操作和存儲在裡面,每一台機器都全量存儲數據,僅僅是一個副本。也許很多人說,一看就是有問題,建議你們去繆一眼自身集群的配置,再來說也不一定,我就遇到過這樣,以前同事說,搭建的一個並發很高的機器,弄了很久,把所有配置和集群了解一遍後,搭建的居然是一個假分散式(存在一個分片),本質上是一個主備結構的集群。
為了大家能夠清晰的明確mongo各個服務,我把路由伺服器和配置伺服器分開,多個shard之間也分開(現實中機器資源有限,可以混合搭建。開啟不同埠就行,例如參考:MongoDB Sharding分片配置)
基礎的架構如下:
如何理清三者的關係? 我建議按照如下步驟去操作,執行。
一、構建分片伺服器(伺服器ip為杜撰,請根據實際ip修改)
shard1: 192.168.0.1 shard2: 192.168.0.5 arbiter: 192.168.0.4
192.168.0.2 192.168.0.6
192.168.0.3 192.168.0.7
在shard1的機器:192.168.0.1-192.168.0.3上執行:
# 啟動mongo服務,配置文件默認埠27017,配置文件可以修改,包括數據存儲路徑等,本人採用默認)mongod --replSet shard1 --config /etc/mongod.conf
在shard2的機器:192.168.0.5-192.168.0.7上執行:
mongod --replSet shard2 --config /etc/mongod.conf
因為仲裁伺服器需要參與shard1和shard2中,啟用兩個配置文件:
mongod --replSet shard1 --config /etc/mongod_shard1.conf (埠27017)mongod --replSet shard1 --config /etc/mongod_shard2.conf (埠27020)# 注意mongd_shard1.conf與mongd_shard2.conf的log和數據存儲位置需要不同。
啟動各個shard後,進行初始化:
# 沒有使用許可權控制mongo --host 192.168.0.1 --port 27017#使用許可權控制連接mongo --host 192.168.0.1 --port 27017 -u "xx" -p "yy" --authenticationDatabase "admin"use admincfg={_id:"shard1", members: [{_id:0,host:192.168.0.1:27017,priority:2}, {_id:1,host:192.168.0.2:27017,priority:1}, {_id:2,host:192.168.0.3:27017,priority:1}, {_id:3,host:192.168.0.4:27017,arbiterOnly:true}]} ] };rs.initiate(cfg)-------------------------------------------------------------------------------------------------》# 沒有使用許可權控制mongo --host 192.168.0.5 --port 27017#使用許可權控制連接mongo --host 192.168.0.5 --port 27017 -u "xx" -p "yy" --authenticationDatabase "admin"use admincfg={_id:"shard2", members: [{_id:0,host:192.168.0.5:27017,priority:2}, {_id:1,host:192.168.0.6:27017,priority:1}, {_id:1,host:192.168.0.7:27017,priority:1}, {_id:3,host:192.168.0.4:27020,arbiterOnly:true}]} ] };rs.initiate(cfg)
二、構建配置伺服器
configSrv: 192.168.0.8
192.168.0.9
注意:配置伺服器裡面本身也存在一個副本集
1、首先在192.168.0.8-192.168.0.9上啟動副本集
mongod --replSet config --config /etc/mongod.conf # 默認埠也是27017
2、啟動後,連接mongo,進行初始化
# 沒有使用許可權控制mongo --host 192.168.0.8 --port 27017#使用許可權控制連接mongo --host 192.168.0.8 --port 27017 -u "xx" -p "yy" --authenticationDatabase "admin"# 連接mongo後,進行初始化操作use admincfg={_id:"config", members: [{_id:0,host:192.168.0.8:27017,priority:2}, {_id:1,host:192.168.0.9:27017,priority:1} ] };rs.initiate(cfg)exit
3、配置路由伺服器(連接配置伺服器,連接shard,將集群關聯起來,形成一個整體)
路由伺服器:192.168.0.10,192.168.0.11# 3.1分別啟動路由伺服器,並指定安裝好的配置伺服器mongos --configdb config/192.168.0.8:27017,192.168.0.9:27017 --port 27018 --keyFile /root/mongorpm/mongodb-keyfile --fork --logpath /var/log/mongodb/mongod.log --logappend &# 3.2連接路由伺服器(以192.168.0.10為例)mongo --host 192.168.0.10 --port 27018或者mongo --host 192.168.0.10 --port 27018 -u "xx" -p "yy" --authenticationDatabase "admin"# 3.3增加shard分片use adminsh.addShard("shard1/192.168.0.1:27017,192.168.0.2:27017,192.168.0.3:27017,192.168.0.4:27017");sh.addShard("shard2/192.168.0.5:27017,192.168.0.6:27017,192.168.0.7:27017,192.168.0.4:27020");
至此,所有角色均已關聯起來,客戶端連接兩個路由伺服器,即可訪問集群。數據均勻分布在兩個shard中,每個shard又有自己的數據備份(副本)。
線上:兩個配置伺服器和兩個路由伺服器可以合在一起(2台)
shard1和shard2的三台機器也可以合在一起,使用不同的埠(只不過數據遷移比較麻煩一點)
關於仲裁伺服器,任選一台機器(僅僅做投票使用,不存儲任何數據,可以在已有的應用伺服器上部署)(有的公司為了解決成本,可能甚至都沒有部署這台機器)
關於網上很多說配置伺服器必須三台,其實後面的3.x的版本好像也沒有硬性規定了。
推薦閱讀:
※關於mongodb的一些常見話題深入
※數據量在億級以上,hbase與mongodb的選擇?
※MongoDB 中游標(Cursor)
※使用 Kafka 和 MongoDB 進行 Go 非同步處理
※mongo-elasticsearch-py查詢了解下