MongoDB3.0.1分片部署,國內3.0的部署文檔還不是很多(何志雄)。
一)、分片包括:
1、至少3個config服務器:存儲了數據塊對分片的映射,用於判斷數據存儲在那個片上。
2、分發路由器:1個以上的mongos,將用戶的讀、寫請求分發到分片中,該服務器被應用程序訪問,應用程序不直接訪問分片。
3、2個以上的分片,每個分片是單獨的 mongod 或者是 replica set,如果是開發、測試環境,分片可以使獨立的mongod而不一定要是副本集。
二)、分片讀寫原理:
應用程序訪問mongos(又稱為查詢路由),mongos向config服務器(又稱為配置服務器)查詢數據應該屬於哪個分片,
然後shards(分片)向具體的分片讀寫數據。
每個分片由一個副本集構成。
appDriver
|
mongos\(可以是多個mongos)
/ \ \config/config/config
/ \
shard(replset) shard(replset)
三)、生產環境部署注意事項:
1、3台config服務器,需要部署在不同的機器上。
2、2個或以上的復制集組成分片。
3、一個或更多的mongos,部署在應用程序所在的服務器上。
四)、部署:
4.1 IP規劃環境:
1、至少3台Config服務器(需要注意到是Config需要奇數個):
192.168.62.152:27052
192.168.62.154:27054
192.168.62.155:27055
2、至少1台Mongos服務器,商用環境建議配置多台:
192.168.62.153:27788
192.168.62.155:27799
3、不低於2個副本集分片:
分片1:
192.168.62.153:
17053
192.168.62.154:
17054
192.168.62.155:
17055
分片2:
192.168.62.155:
17155
192.168.62.153:
17153
192.168.62.152:
17152
【總體部署步驟描述】
1、先部署2個分片副本集,無需配置超級管理員和數據庫管理員,不要創建任何數據庫。
2、步驟3個mongoConfig服務,無需配置超級管理員和數據庫管理員。
3、部署2個Mongos路由服務,
4、在mongos服務器上使用./mongo --port 27788的本地例外登錄的方式創建超級管理員。
5、在mongos服務器上增加mongoConfig配置服務器。
6、在mongos服務器上添加數據庫管理員。
7、在mongos服務器上為數據庫創建索引(需要分片的)
6、在mongos服務器上添加2個分片及片鍵盤。
【重要】所有服務器(config/mongs/分片副本集)的mongodb-keyfile的加密串都為,目的是集群服務器之間的通訊需要IJMyg3AL15ek0FWIbIBhVAr9oK/D0DEqxtkCNoyaQyz2wOIN/IcXLLjsZPX0F+6AMM
4.2、部署配置服務器(Mongo Config:存儲集群元信息的mongod實例,生成環境至少配置3台以上的服務器,運行在不同的服務器上)
在155/154/152服務器上,重復以下2個步驟。端口可以不一樣。
安裝目錄在/soft/configMongoDB目錄下。
1)、在配置服務器上:mkdir -p /data/configdb
2)、啟動配置服務器
(不需要建立管理員賬號和密碼)
如果不把mongdb命令加入到環境變量中,則到安裝包的bin目錄下執行:
在155執行:
cd /soft/configMongoDB/bin
./mongod --configsvr --dbpath /soft/configMongoDB/db --port 27055 --keyFile=/soft/configMongoDB/mongodb-keyfile&
在154執行:
cd /soft/configMongoDB/bin
./mongod --configsvr --dbpath /soft/configMongoDB/db --port 27054 --keyFile=/soft/configMongoDB/mongodb-keyfile&
在152執行:
cd /soft/configMongoDB/bin
./mongod --configsvr --dbpath /soft/configMongoDB/db --port 27052 --keyFile=/soft/configMongoDB/mongodb-keyfile&
4.3、部署Mongos服務,用於路由客戶端操作到具體的分片上,至少部署不低於一個Mongos服務.
需要注意的是,所有mongos的配置服務器順序(192.168.62.152:27052,192.168.62.154:27054,192.168.62.155:27055)必須一致,否則會報錯。
Mongos由於沒有數據節點,因此創建管理員的時候,使用 ./mongo --port 27799 在本機上執行才可以。
Mongos的超級賬戶和密碼與副本集的保持一致,創建超級用戶後執行如下命令。
在153上執行:
cd /soft/mongosMongo/bin
./mongos --configdb 192.168.62.152:27052,192.168.62.154:27054,192.168.62.155:27055 --port 27788 --keyFile=/soft/mongosMongo/mongodb-keyfile&
在155上執行:
cd /soft/mongosMongo/bin
./mongos --configdb 192.168.62.152:27052,192.168.62.154:27054,192.168.62.155:27055 --port 27799 --keyFile=/soft/mongosMongo/mongodb-keyfile&
4.4、向集群中添加分片(一個分片可以單獨的monod服務,或者一個副本集,在生產環境中應該使用副本集,進行讀寫分離,故障失效轉移)
本案例使用2個副本集,實現分片。
副本集的部署,請參考上文,需要注意的是如果在1-2台機器上部署整個環境,每個Mogod實例的數據目錄不要在同一個地方。
在副本集中,只需要在master機器建立超級管理員(估計也能省略此步驟),不需要建立具體數據庫的管理,等到加入分片成功後,
到mongos服務器上建立具體的管理員和索引。
4.4.1啟動分片副本集1,分片名稱:
shard1
在153、154、155上執行:
cd /soft/shardMongo/bin
./mongod -
shardsvr --auth --replSet
shard1 --config
/soft/shardMongo/mongodb.conf
在Master機器上執行副本集
config={"_id" : "shard1","version" : 1,"members" : [{ "_id" : 1,"host":"192.168.62.153:17053"},{ "_id" : 2,"host":"192.168.62.154:17054"},{"_id":3,"host":"192.168.62.155:17055"}]}
rs.initiate(config)
4.4.2 啟動分片副本集2,分片名稱:
shard2
在155/153/152上執行
cd /soft/shard2Mongo/bin
./mongod -
shardsvr --auth --replSet
shard2 --config /soft/shard2Mongo/mongodb.conf
在Master機器上執行副本集
config={"_id" : "shard2","version" : 1,"members" : [{ "_id" : 1,"host":"192.168.62.155:17155"},{ "_id" : 2,"host":"192.168.62.153:17153"},{"_id":3,"host":"192.168.62.152:17152"}]}
rs.initiate(config)
4.5、添加分片到Mongos。選擇選擇其中一台Mongos,連接後執行命令
./mongo 192.168.62.153:27788
use admin
db.auth("superAdmin","admin123")
4.5.1、添加分片1: sh.addShard("shard1/192.168.62.153:17053") 格式:分片名稱/該分片中的至少一台Mongod實例。
添加成功顯示:{ "shardAdded" : "shard1", "ok" : 1 }
ps:如果只是純粹添加一台單機的mongd實例,直接執行sh.addShard("192.168.62.153:17053")
4.5.2、添加分片2: sh.addShard("shard2/192.168.62.155:17155")
如果提示錯誤:
"can't add shard shard2/192.168.62.155:17155
because a local database 'hezx' exists in another shard1:shard1/192.168.62.153:17053,192.168.62.154:17054,192.168.62.155:17055
那麼此時需要在shard1和shard2的master上去刪除hezx數據庫,然後在添加分片成功後,在mongos服務器上上操作創建數據庫。
在另外一台mongos服務器上也和如上命令一並操作。
4.5、對某個數據庫開啟分片
sh.enableSharding("hezx")
4.6、創建片鍵(片鍵需要是索引,如果集合中有數據,需要手動敲創建索引命令,如果沒有建立索引,創建的過程中會自動建立)
原因是,片鍵要求是索引,且如果是復合索引就必須是索引的開頭。如果集合中沒有數據,此時會自動創建索引。
sh.shardCollection("hezx.message", { "to": 1 } )
說明:為hezx庫的message集合創建以to為鍵片,可以是組合鍵。
至此,MongoDB的分片已經部署完畢。分片的相關命令如下:
1、sh.status(),查看分片的狀態。有哪些分片,哪些數據庫被分片了,片鍵是什麼。
2、db.message.stats(),選擇某個表,執行該命令,可以看到該表的分片情況,占用多大,數據多少。