【MongoDB】分片(sharding)+副本集(replSet)叢集搭建
構建一個sharded cluster需要至少三個元件:
〇 shard: 每一個shard包括了切片資料的子集,也可以被部署為“副本集”
〇 mongos: 作為一個“查詢路由”,在客戶端和shard cluster之間作為一箇中間介面,類似於MySQL的一些中間proxy。
可以透過mongo shell或者mongodb driver直連mongos
〇 config server: 一個儲存了sharded cluster的後設資料和配置資訊的server,同樣也可以被部署為“副本集”(mongodb 3.2)
此處用了四臺伺服器實踐,資源分配如下:
config server(186):
mongos(185):
此處先給兩個shard節點做副本集,此處將透過埠區分不同例項:
shard1(187):
透過mongo shell進入任意一個例項,此處選擇的是27017例項,配置副本集並初始化
以下為mongo shell操作:
可以檢查一下副本集狀態
再給shard2做三個副本集
shard2(188):
和shard1一樣,透過mongo shell進入任意一個例項,此處選擇的是27017例項,配置副本集並初始化
最後在mongos(185)的機器上新增shard節點:
進入mongo shell,透過addshard來加入shard節點,多個副本集用逗號分隔:
此處對sano1y庫的testtb使用hash策略:
目前為止,已經對sano1y庫的testtb集合進行了shard配置。
測試:
稍等片刻,等待插入完畢:
進入shard1(187)的PRIMARY例項檢查
另外如果到shard2可以看到shard1這些不連續的id。
可發現shard1和2中的document數量,還是比較均勻的。
shard1: 49983
shard2: 50017
至此,分片叢集搭建基本完成。
當然,config server現在存在著單點的問題,同樣也可以將config server配置成一組replSet,其本質是mongod伺服器。
參考文件:
〇 shard: 每一個shard包括了切片資料的子集,也可以被部署為“副本集”
〇 mongos: 作為一個“查詢路由”,在客戶端和shard cluster之間作為一箇中間介面,類似於MySQL的一些中間proxy。
可以透過mongo shell或者mongodb driver直連mongos
〇 config server: 一個儲存了sharded cluster的後設資料和配置資訊的server,同樣也可以被部署為“副本集”(mongodb 3.2)
此處用了四臺伺服器實踐,資源分配如下:
config server(186):
-
mkdir -p /data/config/data
-
mkdir -p /data/config/log
- mongod --dbpath=/data/config/data --logpath=/data/config/log/config.log --port=30000 --fork --configsvr
mongos(185):
-
mkdir -p /data/mongos/log
- mongos --logpath=/data/mongos/log/mongos.log --port=27017 --fork --configdb=192.168.1.186:30000
此處先給兩個shard節點做副本集,此處將透過埠區分不同例項:
shard1(187):
-
mkdir -p /data/shard1/data/set1
-
mkdir -p /data/shard1/data/set2
-
mkdir -p /data/shard1/data/set3
-
mkdir -p /data/shard1/logs
-
mongod --dbpath=/data/shard1/data/set1 --logpath=/data/shard1/logs/set1.log --port=27017 --fork --shardsvr --replSet=shard1
-
mongod --dbpath=/data/shard1/data/set2 --logpath=/data/shard1/logs/set2.log --port=27018 --fork --shardsvr --replSet=shard1
- mongod --dbpath=/data/shard1/data/set3 --logpath=/data/shard1/logs/set3.log --port=27019 --fork --shardsvr --replSet=shard1
透過mongo shell進入任意一個例項,此處選擇的是27017例項,配置副本集並初始化
- # mongo 127.0.0.1:27017/admin
以下為mongo shell操作:
-
> cnf = {_id:"shard1", members:[
-
{_id:1, host:"192.168.1.187:27017"},
-
{_id:2, host:"192.168.1.187:27018"},
-
{_id:3, host:"192.168.1.187:27019"},
-
]
-
}
-
-
-
> rs.initiate(cnf);
- { "ok" : 1 }
可以檢查一下副本集狀態
- > rs.status()
再給shard2做三個副本集
shard2(188):
-
mkdir -p /data/shard2/data/set1
-
mkdir -p /data/shard2/data/set2
-
mkdir -p /data/shard2/data/set3
-
mkdir -p /data/shard2/logs
-
mongod --dbpath=/data/shard2/data/set1 --logpath=/data/shard2/logs/set1.log --port=27017 --fork --shardsvr --replSet=shard2
-
mongod --dbpath=/data/shard2/data/set2 --logpath=/data/shard2/logs/set2.log --port=27018 --fork --shardsvr --replSet=shard2
- mongod --dbpath=/data/shard2/data/set3 --logpath=/data/shard2/logs/set3.log --port=27019 --fork --shardsvr --replSet=shard2
和shard1一樣,透過mongo shell進入任意一個例項,此處選擇的是27017例項,配置副本集並初始化
-
> cnf = {_id:"shard2", members:[
-
{_id:1, host:"192.168.1.188:27017"},
-
{_id:2, host:"192.168.1.188:27018"},
-
{_id:3, host:"192.168.1.188:27019"},
-
]
-
}
-
-
-
> rs.initiate(cnf);
- { "ok" : 1 }
最後在mongos(185)的機器上新增shard節點:
- # mongo 127.0.0.1:27017/admin
進入mongo shell,透過addshard來加入shard節點,多個副本集用逗號分隔:
-
mongos> db.runCommand( { addshard : "shard1/192.168.1.187:27017,192.168.1.187:27018,192.168.1.187:27019"});
-
{ "shardAdded" : "shard1", "ok" : 1 }
-
mongos> db.runCommand( { addshard : "shard2/192.168.1.188:27017,192.168.1.188:27018,192.168.1.188:27019"});
-
{ "shardAdded" : "shard2", "ok" : 1 }
-
mongos> db.runCommand( { listshards : 1 } );
-
{
-
"shards" : [
-
{
-
"_id" : "shard1",
-
"host" : "shard1/192.168.1.187:27017,192.168.1.187:27018,192.168.1.187:27019"
-
},
-
{
-
"_id" : "shard2",
-
"host" : "shard2/192.168.1.188:27017,192.168.1.188:27018,192.168.1.188:27019"
-
}
-
],
-
"ok" : 1
- }
此處對sano1y庫的testtb使用hash策略:
-
mongos> use admin
-
switched to db admin
-
-
mongos> db.runCommand({"enablesharding":"sano1y"})
-
{ "ok" : 1 }
-
-
mongos> db.runCommand({"shardcollection":"sano1y.testtb","key":{"_id":"hashed"}})
- { "collectionsharded" : "sano1y.testtb", "ok" : 1 }
目前為止,已經對sano1y庫的testtb集合進行了shard配置。
測試:
-
mongos> use sano1y
-
switched to db sano1y
- mongos> for(i=0;i<100000;i++) {db.testtb.insert({"id":i,"name":"test_hash"});}
稍等片刻,等待插入完畢:
- WriteResult({ "nInserted" : 1 })
進入shard1(187)的PRIMARY例項檢查
-
shard1:PRIMARY> use sano1y
-
switched to db sano1y
-
shard1:PRIMARY> db.testtb.find().count()
-
49983
-
shard1:PRIMARY> db.testtb.find()
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d845c"), "id" : 0, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d845d"), "id" : 1, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d845e"), "id" : 2, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8460"), "id" : 4, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8461"), "id" : 5, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8465"), "id" : 9, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8468"), "id" : 12, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d846f"), "id" : 19, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8471"), "id" : 21, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8475"), "id" : 25, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8476"), "id" : 26, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8479"), "id" : 29, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d847d"), "id" : 33, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d847e"), "id" : 34, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8480"), "id" : 36, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8481"), "id" : 37, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8483"), "id" : 39, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d8486"), "id" : 42, "name" : "test_hash" }
-
{ "_id" : ObjectId("5837ef1dea1fd54fb38d848b"), "id" : 47, "name" : "test_hash" }
- { "_id" : ObjectId("5837ef1dea1fd54fb38d848d"), "id" : 49, "name" : "test_hash" }
另外如果到shard2可以看到shard1這些不連續的id。
可發現shard1和2中的document數量,還是比較均勻的。
shard1: 49983
shard2: 50017
至此,分片叢集搭建基本完成。
當然,config server現在存在著單點的問題,同樣也可以將config server配置成一組replSet,其本質是mongod伺服器。
參考文件:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-2129100/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MongoDB Sharding(二) -- 搭建分片叢集MongoDB
- linux下Mongodb叢集搭建:分片+副本集LinuxMongoDB
- 搭建 MongoDB分片(sharding) / 分割槽 / 叢集環境MongoDB
- Mongodb分散式叢集副本集+分片MongoDB分散式
- MongoDB 分片叢集搭建MongoDB
- 搭建MongoDB分片叢集MongoDB
- Mongodb副本集+分片叢集環境部署記錄MongoDB
- MongoDB健壯叢集——用副本集做分片MongoDB
- 使用副本集搭建MongoDB叢集MongoDB
- mongodb 4.0副本集搭建MongoDB
- MongoDB 6.0.3副本集搭建MongoDB
- Mongodb主從複製/ 副本集/分片叢集介紹MongoDB
- 搭建高可用MongoDB叢集(四):分片MongoDB
- 搭建高可用MongoDB叢集(二): 副本集MongoDB
- mongodb複製集(replica sets)+分片(sharding)環境搭建MongoDB
- mongodb 分片叢集建立分片集合MongoDB
- MongoDB分片叢集新增分片(自用)MongoDB
- 【Mongodb】Sharding 叢集配置MongoDB
- MongoDB叢集之分片MongoDB
- mongodb分片(sharding)搭建、應用及管理MongoDB
- MongoDB日常運維-04副本集搭建MongoDB運維
- mongodb 分片叢集設定MongoDB
- MongoDB分片叢集常用操作MongoDB
- 使用Docker搭建MongoDB 5.0版本副本集叢集DockerMongoDB
- mongodb副本叢集和分片叢集佈署MongoDB
- MongoDB 3.2.7 for rhel6.4 副本集-分片叢集部署MongoDB
- akka-typed(7) - cluster:sharding, 叢集分片
- MongoDB 4.2分片叢集搭建及與3.4分片叢集搭建時的一些異同MongoDB
- MongoDB分片叢集chunk的概念MongoDB
- 高可用mongodb叢集(分片+副本)MongoDB
- 利用Mongodb的複製集搭建高可用分片,Replica Sets + Sharding的搭建過程MongoDB
- MongoDB 3.4配置sharding分片MongoDB
- mongodb 分片群集(sharding cluster)MongoDB
- 搭建高可用MongoDB叢集(三):深入副本集內部機制MongoDB
- mongodb的分散式叢集(3、分片)MongoDB分散式
- MongoDB 3.2.7 基於keyFile的認證在副本集+叢集分片中的使用MongoDB
- 【Mongodb】sharding 叢集Add/Remove 節點MongoDBREM
- Docker 搭建叢集 MongoDBDockerMongoDB