mongodb分片共有四個組件:mongos、config server、shard、replica set
mongos,數據庫集羣請求的入口,所有的請求都通過mongos進行協調,不需要在應用程序添加一個路由選擇器,mongos自己就是一個請求分發中心,它負責把對應的數據請求請求轉發到對應的shard服務器上。在生產環境通常有多mongos作爲請求的入口,防止其中一個掛掉所有的mongodb請求都沒有辦法操作。
config server,顧名思義爲配置服務器,存儲所有數據庫元信息(路由、分片)的配置。mongos本身沒有物理存儲分片服務器和數據路由信息,只是緩存在內存裏,配置服務器則實際存儲這些數據。mongos第一次啓動或者關掉重啓就會從 config server 加載配置信息,以後如果配置服務器信息變化會通知到所有的 mongos 更新自己的狀態,這樣 mongos 就能繼續準確路由。在生產環境通常有多個 config server 配置服務器,因爲它存儲了分片路由的元數據,這個可不能丟失!就算掛掉其中一臺,只要還有存貨, mongodb集羣就不會掛掉。
shard,這就是傳說中的片了,用來將數據讀寫壓力分散到不同的機器上,片越多,數據則越分散,數據吞吐量也會越高,需要的機器資源也會更多。通常情況下,需要將每個片做成副本集,以防止其中某個片出問題後則這個片上的數據不可用。
replica set(副本集),如果沒有 replica set 是個不完整架構,假設其中的一個分片掛掉那四分之一的數據就丟失了,所以在高可用性的分片架構還需要對於每一個分片構建 replica set 副本集保證分片的可靠性。官方推薦的是一個replica set由3個副本組成,如果機器不夠用,可以 2個副本 + 1個仲裁。
首先下載安裝程序 官方下載地址
搭建configserver
由於configserver的重要性,強烈推薦由至少3臺機器組成configserver副本集解壓並創建配置文件,並複製到3臺機器上
配置文件中增加
配置文件
sharding:
clusterRole: configsvr啓動所有實例,並登錄其中一臺機器,運行mongo程序(如果需要打開登錄認證功能,參見:爲MongoDB添加身份驗證)
執行初始化副本集腳本
示例
rs.initiate({
_id: "candao_qc_config",
configsvr: true,
members: [
{ _id : 0, host : "10.200.102.36:27117" ,"priority":100 },
{ _id : 1, host : "10.200.102.41:27117","priority":1 },
{ _id : 2, host : "10.200.102.45:27117","priority":1 }
]
})等待初始化完成,此時configserver副本集就搭建完成了
搭建shard server
每個shard負責存儲集羣的一部分數據,如果數據損壞,則會導致這部分數據丟失,重要性不言而喻,同樣強烈推薦由至少3臺機器組成副本集
搭建副本集不在贅述,參見:副本集的搭建,與副本集不同的是,需要在每臺機器的配置文件中添加如下配置:配置示例
sharding:
clusterRole: shardsvr想要分多少個片,就按述方法配置多少個副本集
配置mongos程序
創建mongos.conf
配置示例
net:
port: 27017
##日誌文件
systemLog:
destination: file
path: "mongod.log"
logAppend: true
processManagement:
##以後臺進程運行
fork: true
sharding:
configDB: candao_qc_config/10.200.102.36:27117,10.200.102.45:27117,10.200.102.41:27117啓動mongos進程./mongos -f mongos.conf (通常可以啓動多個,可以將mongos進程部署在部署項目的機器上)
在mongos上將配置好的分片副本集加入分片集羣 (直接在bin下:./mongo)
配置示例
sh.addShard( "candao_qc_shard1/10.200.102.31:27027");
sh.addShard( "candao_qc_shard2/10.200.102.31:27028");
sh.addShard( "candao_qc_shard3/10.200.102.31:27029");將要分片的數據庫開啓分片 sh.enableSharding("datacenter_qc")
將表進行分片 sh.shardCollection("datacenter_qc.order", { "createTime":1, "brandId":1 } )
至此,分片搭建完成,如果剛纔分片的集合中有數據,此時需要等待後臺進程將數據按照片鍵均勻地遷移到其他機器上
在工具或者程序中,需要用可讀可寫賬號進行訪問mongo的數據,這個時候,需要在configserver中進行創建原來的集羣中的可讀、可寫的賬號。