MongoDB分片集群的搭建
- 分片的概念
- 分片集群的優勢
- 分片集群包含的組件
- 部署MongoDB分片集群的
- 準備作業
- 配置shard
- 配置Config Server
- 配置 mongos
- 配置復制集
- 進入節點服務器集群配置節點銜接
- 啟動mongos
- 指定分片鍵對集合分片
分片的概念
-
分片(sharding)是一種跨多臺機器分布資料的方法, MongoDB使用分片來支持具有非常大的資料集和高吞吐量操作的部署,
-
換句話說:分片(sharding)是指將資料拆分,將其分散存在不同的機器上的程序,有時也用磁區(partitioning)來表示這個概念,將資料分散到不同的機器上,不需要功能強大的大型計算機就可以儲存更多的資料,處理更多的負載,
-
具有大型資料集或高吞吐量應用程式的資料庫系統會挑戰單個服務器的容量,例如,高查詢率會耗盡服務器的CPU容量,作業集大小大于系統的RAM會強調磁盤驅動器的I / O容量,
-
有兩種解決系統增長的方法:垂直擴展和水平擴展,
- 垂直擴展意味著增加單個服務器的容量,例如使用更強大的CPU,添加更多RAM或增加存盤空間量,可用技術的局限性可能會限制單個機器對于給定作業負載而言足夠強大,此外,基于云的提供商基于可用的硬體配置具有硬性上限,結果,垂直縮放有實際的最大值,
- 水平擴展意味著劃分系統資料集并加載多個服務器,添加其他服務器以根據需要增加容量,雖然單個機器的總體速度或容量可能不高,但每臺機器處理整個作業負載的子集,可能提供比單個高速大容量服務器更高的效率,擴展部署容量只需要根據需要添加額外的服務器,這可能比單個機器的高端硬體的總體成本更低,權衡是基礎架構和部署維護的復雜性增加,
-
MongoDB支持通過分片進行水平擴展,
分片集群的優勢
分片為應對高吞吐量與大資料提供了方法
- 使用分片減少了每個分片需要處理的請求數,通過水平擴展,集群可以提高自己的存盤量和吞吐量,比如,當插入一條資料時,應用只需要訪問存盤這條資料的分片
- 使用分片減少了每個分片存盤的資料
- 提供類似線性增長的架構、提高資料可用性,提高大型資料庫查詢服務器的性能,當MongoDB 單點資料庫服務器存盤成為瓶頸、單點資料庫服務器的性能成為瓶頸,或者需要部署大型應用以充分利用記憶體時,可以使用分片技術
分片集群包含的組件

MongoDB分片群集包含以下組件:
- Shard:分片服務器,用于存盤實際的資料塊,實際生產環境中一個shard server角色可由幾臺服務器組成一個Replica Set 承擔,防止主機單點故障
- Config Server:配置服務器存盤群集的元資料和配置設定, 從MongoDB 3.4開始,必須將配置服務器部署為副本集(CSRS)
- Routers:前端路由,客戶端由此接入,在客戶端應用程式和分片集群之間提供介面,且讓整個集群看上去像單一資料庫,前端應用可以透明使用
部署MongoDB分片集群的
準備作業
- Shard:
- maomao:27017-27019(一主兩從),27020(仲裁)
- zhuzhu:27021-27023(一主兩從)
- Config Server:37017-37019
- mongos:47017(先使用一臺路由,等搭建完成之后再添加一臺路由+Atlas做備份)
cd /data/logs/mongodb
touch mongodb-2702{1..3}.log
touch mongodb-3701{7..9}.log
touch mongodb-47017.log
[root@mongodb mongodb]# ls
mongodb-27017.log mongodb-27019.log mongodb-27021.log mongodb-27023.log mongodb-37018.log mongodb-47017.log
mongodb-27018.log mongodb-27020.log mongodb-27022.log mongodb-37017.log mongodb-37019.log
chmod 777 ./*
mkdir mongodb-2702{1..3}
mkdir mongodb-3701{7..9}
mkdir mongodb-47017
cp -a mongod-27017.conf mongod-27021.conf
配置shard
注意兩個復制集的名字不能相同
第一個復制集
sharding:
clusterRole: shardsvr
replication:
oplogSizeMB: 2048
replSetName: maomao
第二個復制集
sed -ri -e 's/27017/27021/g' -e 's/maomao/zhuzhu/g' mongod-27021.conf
sed -ri -e 's/27017/27022/g' -e 's/maomao/zhuzhu/g' mongod-27022.conf
sed -ri -e 's/27017/27023/g' -e 's/maomao/zhuzhu/g' mongod-27023.conf
只在切片服務器上添加
sharding:
clusterRole: shardsvr
配置Config Server
sed -ri -e 's/27017/37017/g' mongod-37017.conf
vim mongod-37017.conf
sharding:
clusterRole: configsvr
replication:
oplogSizeMB: 2048
replSetName: configReplSet
配置 mongos
sed -ri -e 's/27017/47017/g' mongod-47017.conf
添加config server的地址和埠
sharding:
configDB: configReplSet/192.168.188.101:37017,192.168.188.101:37018,192.168.188.101:37019
并且將存盤路注銷
#storage:
# dbPath: /data/mongodb-47017
# journal:
# enabled: true
配置復制集
將所有節點打開
mongod -f /mongod-27017.conf
mongod -f mongod-27017.conf
mongod -f mongod-27018.conf
mongod -f mongod-27019.conf
mongod -f mongod-27020.conf
mongod -f mongod-27021.conf
mongod -f mongod-27022.conf
mongod -f mongod-27023.conf
mongod -f mongod-37017.conf
mongod -f mongod-37018.conf
mongod -f mongod-37019.conf
ss -ntl
進入兩個主節點
第一個:
config={_id:"maomao",members:[{_id:0,host:"192.168.188.101:27017"},{_id:1,host:"1192.168.188.101:27018"},{_id:2,host:"192.168.188.101:27019"}]}
rs.initiate(config)
{ "ok" : 1 }
config={_id:"zhuzhu",members:[{_id:0,host:"192.168.188.101:27021"},{_id:1,host:"192.168.188.101:27022"},{_id:2,host:"192.16
8.188.101:27023"}]}
{
"_id" : "zhuzhu",
"members" : [
{
"_id" : 0,
"host" : "192.168.188.101:27021"
},
{
"_id" : 1,
"host" : "192.168.188.101:27022"
},
{
"_id" : 2,
"host" : "192.168.188.101:27023"
}
]
}
> rs.initiate(config)
{ "ok" : 1 }
進入節點服務器集群配置節點銜接
mongo --host 192.168.188.101 --port 37017
> config={_id:"configReplSet",members:[{_id:0,host:"192.168.188.101:37017"},{_id:1,host:"192.168.188.101:37018"},{_id:2,host:
"192.168.188.101:37019"}]}
{
"_id" : "configReplSet",
"members" : [
{
"_id" : 0,
"host" : "192.168.188.101:37017"
},
{
"_id" : 1,
"host" : "192.168.188.101:37018"
},
{
"_id" : 2,
"host" : "192.168.188.101:37019"
}
]
}
> rs.initiate(config)
{ "ok" : 1 }
啟動mongos
路由命令較為特殊,使用的是mongos而非mongod
whatis mongos
mongos (1) - MongoDB Sharded Cluster Query Router
whatis mongo
mongo (1) - MongoDB Shell
whatis mongod
mongod (1) - MongoDB Server
mongos -f /usr/local/mongodb/bin/mongod-47017.conf
mongo --host 192.168.188.101 --port 47017
進入路由資料庫,可以看到路由資料庫的名字為mongos
mongos>
切換到admin
mongos> use admin
switched to db admin
添加分片資訊
mongos> db.runCommand({addshard:"maomao/192.168.188.101:27017,192.168.188.101:27018,192.168.188.101:27019,1
92.168.188.101:27020",name:"shard1"})
{ "shardAdded" : "shard1", "ok" : 1 }
mongos> db.runCommand({addshard:"zhuzhu/192.168.188.101:27021,192.168.188.101:27022,192.168.188.101:27023"
,name:"shard2"})
{ "shardAdded" : "shard2", "ok" : 1 }
列出分片資訊
mongos> db.runCommand({listshards:1})
{
"shards" : [
{
"_id" : "shard1",
"host" : "maomao/192.168.188.101:27017,192.168.188.101:27018,192.168.188.101:27019"
, "state" : 1
},
{
"_id" : "shard2",
"host" : "zhuzhu/192.168.188.101:27021,192.168.188.101:27022,192.168.188.101:27023"
, "state" : 1
}
],
"ok" : 1
}
整體狀態查看
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5f0574f7fe0c76b475e50326")
}
shards:
{ "_id" : "shard1", "host" : "kgcrs/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019", "state" : 1 }
{ "_id" : "shard2", "host" : "kgcrs1/127.0.0.1:27020,127.0.0.1:27021,127.0.0.1:27022", "state" : 1 }
active mongoses:
"3.4.24" : 1
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
NaN
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
激活分片功能
mongos> db
admin
mongos> db.runCommand({enablesharding:"test"})
{ "ok" : 1 }
指定分片鍵對集合分片
創建索引 :優化查詢的重要手段
mongos> use test
switched to db test
mongos> db
test
創建索引
mongos> db.stu.ensureIndex({id:1})
{
"raw" : {
"zhuzhu/192.168.188.101:27021,192.168.188.101:27022,192.168.188.101:27023" : {
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1,
"$gleStats" : {
"lastOpTime" : {
"ts" : Timestamp(1618913138, 2),
"t" : NumberLong(1)
},
"electionId" : ObjectId("7fffffff0000000000000001")
}
}
},
"ok" : 1
}
mongos> use admin
switched to db admin
開啟分片
mongos> db.runCommand({shardcollection:"test.stu",key:{id:1}})
{ "collectionsharded" : "test.stu", "ok" : 1 }
測驗
集合分片驗證
產生大量資料
mongos> use test;
switched to db test
mongos> for(var i=1;i<=1000000;i++){db.stu.insert({'id':i,'name':'Alice'});}
當test大小變成64mb之后 chunks: shard2會變成shard1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/278580.html
標籤:其他
