一、分片的概念
分片(sharding)是指根據片鍵,將數據進行拆分,使其落在不同的機器上的過程。如此一來,不需要功能,配置等強大的機器,也能儲存大數據量,處理更高的負載。
二、分片的原理和思想
MongoDB分片的基本思想就是將集合切分成小塊。這些塊分散到若干片里面,每個片只負責總數據的一部分。
對於客戶端來說,無需知道數據被拆分了,也無需知道服務端哪個分片對應哪些數據。數據在分片之前需要運行一個路由進程,進程名為mongos。這個路由器知道所有數據的存放位置,知道數據和片的對應關系。對客戶端來說,它僅知道連接了一個普通的mongod,在請求數據的過程中,通過路由器上的數據和片的對應關系,路由到目標數據所在的片上,如果請求有了回應,路由器將其收集起來回送給客戶端
二、分片的簡單實現
(1)片鍵的概念
設置分片時,需要從集合里面選一個鍵,用該鍵的值作為數據拆分的依據。這個鍵稱為片鍵(shard key)。
{department:"IT",name:"zhangsan"},{department:"HR",name:"lisi"},{department:"SUPPORT",name:"zhaowu"}
以該數據為例,表示的是職員名字以及所在的部門,假若我們設置部門(department)為片鍵,那么第一片可能存放名稱以字母A-F開頭的部門,第二片存放名稱以G~P開頭的部門,第三片存Q~Z,如此類推。隨着添加或者刪除片,MongoDB會重新平衡數據,使每片的流量都比較均衡,數據量也在合理范圍內。
(2)本地模擬實現
a、首先mongod開啟服務端3個節點,端口分別為8080,8081,8082
b、開啟config服務器 。mongos要把mongod之間的配置放到config服務器里面,所以首先開啟它,這里就使用8083端口。 命令為:
mongod --dbpath E:\sharding\config_node --port 8083
c、開啟mongos服務器 。端口8084,同時指定下config服務器。命令為:
mongos --port 8084 --configdb=127.0.0.1:8083
d、 路由指定服務端節點。客戶端直接跟mongos打交道,也就說明我們要連接mongos服務器,然后將8080,8081,8082的mongod交給mongos,添加分片也就是addshard()。需要進到路由節點的admin數據庫進行配置。allowLocal表示該服務端節點,可被客戶端直接連接而無需經過路由。
db.runCommand({"addshard":"127.0.0.1:8080",allowLocal:true})
db.runCommand({"addshard":"127.0.0.1:8081",allowLocal:true})
db.runCommand({"addshard":"127.0.0.1:8082",allowLocal:true})
e、 開啟數據庫分片功能,命令為enablesharding(),並指定數據庫名稱,如下指定每個mongod都有的test數據庫
db.runCommand({"enablesharding":"test"})
f、 指定集合中分片的片鍵,這里就指定為company.department鍵.
db.runCommand({"shardcollection":"company.department","key":{"depatment":1}})
g、 通過向mongos節點插入100萬條數據,查看各節點保存的數據。
h、 通過向mongos插入一條數據,查看數據被分配到哪個片