MongoDB健壯叢集——用副本集做分片
1. MongoDB分片+副本集
健壯的叢集方案
多個配置伺服器 多個mongos伺服器 每個片都是副本集 正確設定w
架構圖
說明: 1. 此實驗環境在一臺機器上透過不同port和dbpath實現啟動不同的mongod例項 2. 總的9個mongod例項,分別做成shard1、shard2、shard3三組副本集,每組1主2從 3. Mongos程式的數量不限,建議把mongos配置在每個應用伺服器本機上,這樣每個應用伺服器就與自身的mongos進行通訊,如果伺服器不工作了,並不會影響其他的應用伺服器與其自己的mongos通訊 4. 此實驗模擬2臺應用伺服器(2個mongos服務) 5. 生產環境中每個片都應該是副本集,這樣單個伺服器壞了,才不會導致片失效
|
|
部署環境
建立相關目錄
~]# mkdir -p /data/mongodb/shard{1,2,3}/node{1,2,3}
~]# mkdir -p /data/mongodb/shard{1,2,3}/logs
~]# ls /data/mongodb/shard*
/data/mongodb/shard1:
logs node1 node2 node3
/data/mongodb/shard2:
logs node1 node2 node3
/data/mongodb/shard3:
logs node1 node2 node3
~]# mkdir -p /data/mongodb/config/logs
~]# mkdir -p /data/mongodb/config/node{1,2,3}
~]# ls /data/mongodb/config/
logs node1 node2 node3
~]# mkdir -p /data/mongodb/mongos/logs
啟動配置服務
Config server |
/data/mongodb/config/node1 |
/data/mongodb/config/logs/node1.log |
10000 |
/data/mongodb/config/node2 |
/data/mongodb/config/logs/node2.log |
20000 |
|
/data/mongodb/config/node3 |
/data/mongodb/config/logs/node3.log |
30000 |
#按規劃啟動3個:跟啟動單個配置服務一樣,只是重複3次
~]# mongod --dbpath /data/mongodb/config/node1 --logpath /data/mongodb/config/logs/node1.log --logappend --fork --port 10000
~]# mongod --dbpath /data/mongodb/config/node2 --logpath /data/mongodb/config/logs/node2.log --logappend --fork --port 20000
~]# mongod --dbpath /data/mongodb/config/node3 --logpath /data/mongodb/config/logs/node3.log --logappend --fork --port 30000
~]# ps -ef|grep mongod|grep -v grep
root 3983 1 0 11:10 ? 00:00:03 /usr/local/mongodb/bin/mongod --dbpath /data/mongodb/config/node1 --logpath /data/mongodb/config/logs/node1.log --logappend --fork --port 10000
root 4063 1 0 11:13 ? 00:00:02 /usr/local/mongodb/bin/mongod --dbpath /data/mongodb/config/node2 --logpath /data/mongodb/config/logs/node2.log --logappend --fork --port 20000
root 4182 1 0 11:17 ? 00:00:03 /usr/local/mongodb/bin/mongod --dbpath /data/mongodb/config/node3 --logpath /data/mongodb/config/logs/node3.log --logappend --fork --port 30000
啟動路由服務
Mongos server |
—— |
/data/mongodb/mongos/logs/node1.log |
40000 |
—— |
/data/mongodb/mongos/logs/node2.log |
50000 |
#mongos的數量不受限制,通常應用一個伺服器執行一個mongos
~]#mongos --port 40000 --configdb 192.168.211.217:10000,192.168.211.217:20000,192.168.211.217:30000 --logpath /data/mongodb/mongos/logs/mongos1.log --logappend --fork
~]#mongos --port 50000 --configdb 192.168.211.217:10000,192.168.211.217:20000,192.168.211.217:30000 --logpath /data/mongodb/mongos/logs/mongos2.log --logappend –fork
~]# ps -ef|grep mongos|grep -v grep
root 4421 1 0 11:29 ? 00:00:00 /usr/local/mongodb/bin/mongos --port 40000 --configdb 192.168.211.217:10000,192.168.211.217:20000,192.168.211.217:30000 --logpath /data/mongodb/mongos/logs/mongos1.log --logappend --fork
root 4485 1 0 11:29 ? 00:00:00 /usr/local/mongodb/bin/mongos --port 50000 --configdb 192.168.211.217:10000,192.168.211.217:20000,192.168.211.217:30000 --logpath /data/mongodb/mongos/logs/mongos2.log --logappend --fork
配置副本集
按規劃,配置啟動shard1、shard2、shard3三組副本集
#此處以shard1為例說明配置方法
#啟動三個mongod程式
~]#mongod --replSet shard1 --dbpath /data/mongodb/shard1/node1 --logpath /data/mongodb/shard1/logs/node1.log --logappend --fork --port 10001
~]#mongod --replSet shard1 --dbpath /data/mongodb/shard1/node2 --logpath /data/mongodb/shard1/logs/node2.log --logappend --fork --port 10002
~]#mongod --replSet shard1 --dbpath /data/mongodb/shard1/node3 --logpath /data/mongodb/shard1/logs/node3.log --logappend --fork --port 10003
#初始化Replica Set:shard1
~]# /usr/local/mongodb/bin/mongo --port 10001
MongoDB shell version: 2.6.6
connecting to: 127.0.0.1:10001/test
> use admin
switched to db admin
> rsconf={
... "_id" : "shard1",
... "members" : [
... {
... "_id" : 0,
... "host" : "192.168.211.217:10001"
... }
... ]
... }
{
"_id" : "shard1",
"members" : [
{
"_id" : 0,
"host" : "192.168.211.217:10001"
}
]
}
> rs.initiate(rsconf)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
> rs.add("192.168.211.217:10002")
{ "ok" : 1 }
shard1:PRIMARY> rs.add("192.168.211.217:10003")
{ "ok" : 1 }
shard1:PRIMARY> rs.conf()
{
"_id" : "shard1",
"version" : 3,
"members" : [
{
"_id" : 0,
"host" : "192.168.211.217:10001"
},
{
"_id" : 1,
"host" : "192.168.211.217:10002"
},
{
"_id" : 2,
"host" : "192.168.211.217:10003"
}
]
}
Shard2和shard3同shard1配置副本集
#最終副本集配置如下:
shard3:PRIMARY> rs.conf()
{
"_id" : "shard3",
"version" : 3,
"members" : [
{
"_id" : 0,
"host" : "192.168.211.217:30001"
},
{
"_id" : 1,
"host" : "192.168.211.217:30002"
},
{
"_id" : 2,
"host" : "192.168.211.217:30003"
}
]
}
~]# /usr/local/mongodb/bin/mongo --port 20001
MongoDB shell version: 2.6.6
connecting to: 127.0.0.1:20001/test
shard2:PRIMARY> rs.conf()
{
"_id" : "shard2",
"version" : 3,
"members" : [
{
"_id" : 0,
"host" : "192.168.211.217:20001"
},
{
"_id" : 1,
"host" : "192.168.211.217:20002"
},
{
"_id" : 2,
"host" : "192.168.211.217:20003"
}
]
}
~]# /usr/local/mongodb/bin/mongo --port 10001
MongoDB shell version: 2.6.6
connecting to: 127.0.0.1:10001/test
shard1:PRIMARY> rs.conf()
{
"_id" : "shard1",
"version" : 3,
"members" : [
{
"_id" : 0,
"host" : "192.168.211.217:10001"
},
{
"_id" : 1,
"host" : "192.168.211.217:10002"
},
{
"_id" : 2,
"host" : "192.168.211.217:10003"
}
]
}
目前mongo相關程式埠情況如下:
#此時,剛好與環境規劃列表對應
新增(副本集)分片
#連線到mongs,並切換到admin這裡必須連線路由節點
~]# /usr/local/mongodb/bin/mongo --port 40000
MongoDB shell version: 2.6.6
connecting to: 127.0.0.1:40000/test
mongos> use admin
switched to db admin
mongos> db
admin
mongos> db.runCommand({"addShard":"shard1/192.168.211.217:10001"})
{ "shardAdded" : "shard1", "ok" : 1 }
mongos> db.runCommand({"addShard":"shard2/192.168.211.217:20001"})
{ "shardAdded" : "shard2", "ok" : 1 }
mongos> db.runCommand({"addShard":"shard3/192.168.211.217:30001"})
{ "shardAdded" : "shard3", "ok" : 1 }
mongos> db.runCommand({listshards:1})
mongos> db.runCommand({listshards:1})
{
"shards" : [
{
"_id" : "shard1",
"host" : "shard1/192.168.211.217:10001,192.168.211.217:10002,192.168.211.217:10003"
},
{
"_id" : "shard2",
"host" : "shard2/192.168.211.217:20001,192.168.211.217:20002,192.168.211.217:20003"
},
{
"_id" : "shard3",
"host" : "shard3/192.168.211.217:30001,192.168.211.217:30002,192.168.211.217:30003"
}
],
"ok" : 1
}
啟用db和collections分片
啟用資料庫分片,命令
> db.runCommand( { enablesharding : “
執行以上命令,可以讓資料庫跨shard,如果不執行這步,資料庫只會存放在一個shard
一旦啟用資料庫分片,資料庫中不同的collection將被存放在不同的shard上
但一個collection仍舊存放在同一個shard上,要使單個collection也分片,還需單獨對collection作些操作
#如:啟用test資料庫分片功能,連線mongos程式
~]# /usr/local/mongodb/bin/mongo --port 50000
MongoDB shell version: 2.6.6
connecting to: 127.0.0.1:50000/test
mongos> use admin
switched to db admin
mongos> db.runCommand({"enablesharding":"test"})
{ "ok" : 1 }
要使單個collection也分片儲存,需要給collection指定一個分片key,透過以下命令操作:
> db.runCommand( { shardcollection :
“
注: a. 分片的collection系統會自動建立一個索引(也可使用者提前建立好)
b. 分片的collection只能有一個在分片key上的唯一索引,其它唯一索引不被允許
#對collection:test.yujx分片
mongos> use admin
switched to db admin
mongos> db.runCommand({"shardcollection":"test.yujx","key":{"_id":1}})
{ "collectionsharded" : "test.yujx", "ok" : 1 }
生成測試資料
mongos> use test
#生成測試資料,此處只是為了說明問題,並不一定要生成那麼多行
mongos> for(var i=1;i<=888888;i++) db.yujx.save({"id":i,"a":123456789,"b":888888888,"c":100000000})
mongos> db.yujx.count()
271814 #此實驗使用了這麼多行測試資料
檢視集合分片
mongos> db.yujx.stats()
{
"sharded" : true,
"systemFlags" : 1,
"userFlags" : 1,
"ns" : "test.yujx",
"count" : 271814,
"numExtents" : 19,
"size" : 30443168,
"storageSize" : 51773440,
"totalIndexSize" : 8862784,
"indexSizes" : {
"_id_" : 8862784
},
"avgObjSize" : 112,
"nindexes" : 1,
"nchunks" : 4,
"shards" : {
"shard1" : {
"ns" : "test.yujx",
"count" : 85563,
"size" : 9583056,
"avgObjSize" : 112,
"storageSize" : 11182080,
"numExtents" : 6,
"nindexes" : 1,
"lastExtentSize" : 8388608,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 2796192,
"indexSizes" : {
"_id_" : 2796192
},
"ok" : 1
},
"shard2" : {
"ns" : "test.yujx",
"count" : 180298,
"size" : 20193376,
"avgObjSize" : 112,
"storageSize" : 37797888,
"numExtents" : 8,
"nindexes" : 1,
"lastExtentSize" : 15290368,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 5862192,
"indexSizes" : {
"_id_" : 5862192
},
"ok" : 1
},
"shard3" : {
"ns" : "test.yujx",
"count" : 5953,
"size" : 666736,
"avgObjSize" : 112,
"storageSize" : 2793472,
"numExtents" : 5,
"nindexes" : 1,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 204400,
"indexSizes" : {
"_id_" : 204400
},
"ok" : 1
}
"ok" : 1
}
#此時我們連線各個分片的primary查詢自身擁有的記錄資料:
可以發現分別與上面的集合分片狀態顯示的一致
補充提示:secondary節點預設是無法執行查詢操作,需要執行setSlaveOK操作
檢視資料庫分片
mongos> db.printShardingStatus()
#或者連線mongos的config資料庫查詢
mongos> db.shards.find()
{ "_id" : "shard1", "host" : "shard1/192.168.211.217:10001,192.168.211.217:10002,192.168.211.217:10003" }
{ "_id" : "shard2", "host" : "shard2/192.168.211.217:20001,192.168.211.217:20002,192.168.211.217:20003" }
{ "_id" : "shard3", "host" : "shard3/192.168.211.217:30001,192.168.211.217:30002,192.168.211.217:30003" }
mongos> db.databases.find()
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : true, "primary" : "shard3" }
mongos> db.chunks.find()
{ "_id" : "test.yujx-_id_MinKey", "lastmod" : Timestamp(2, 0), "lastmodEpoch" : ObjectId("54b8b475a13b3af589cffc62"), "ns" : "test.yujx", "min" : { "_id" : { "$minKey" : 1 } }, "max" : { "_id" : ObjectId("54b8b58ddb2797bbb973a718") }, "shard" : "shard1" }
{ "_id" : "test.yujx-_id_ObjectId('54b8b58ddb2797bbb973a718')", "lastmod" : Timestamp(3, 1), "lastmodEpoch" : ObjectId("54b8b475a13b3af589cffc62"), "ns" : "test.yujx", "min" : { "_id" : ObjectId("54b8b58ddb2797bbb973a718") }, "max" : { "_id" : ObjectId("54b8b599db2797bbb973be59") }, "shard" : "shard3" }
{ "_id" : "test.yujx-_id_ObjectId('54b8b599db2797bbb973be59')", "lastmod" : Timestamp(4, 1), "lastmodEpoch" : ObjectId("54b8b475a13b3af589cffc62"), "ns" : "test.yujx", "min" : { "_id" : ObjectId("54b8b599db2797bbb973be59") }, "max" : { "_id" : ObjectId("54b8b6cfdb2797bbb9767ea2") }, "shard" : "shard2" }
{
"_id" :
"test.yujx-_id_ObjectId('54b8b6cfdb2797bbb9767ea2')",
"lastmod" : Timestamp(4, 0), "lastmodEpoch" :
ObjectId("54b8b475a13b3af589cffc62"), "ns" :
"test.yujx", "min" : { "_id" :
ObjectId("54b8b6cfdb2797bbb9767ea2") }, "max" : {
"_id" : { "$maxKey" : 1 } }, "shard" :
"shard1" }
單點故障分析
由於這是為了瞭解入門mongodb做的實驗,而故障模擬太浪費時間,所以這裡就不一一列出,關於故障場景分析,可以參考:
http://blog.itpub.net/27000195/viewspace-1404402/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27000195/viewspace-1404405/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mongodb分散式叢集副本集+分片MongoDB分散式
- linux下Mongodb叢集搭建:分片+副本集LinuxMongoDB
- 【MongoDB】分片(sharding)+副本集(replSet)叢集搭建MongoDB
- Mongodb副本集+分片叢集環境部署記錄MongoDB
- Mongodb主從複製/ 副本集/分片叢集介紹MongoDB
- mongodb 分片叢集建立分片集合MongoDB
- MongoDB分片叢集新增分片(自用)MongoDB
- MongoDB 分片叢集搭建MongoDB
- MongoDB叢集之分片MongoDB
- 搭建MongoDB分片叢集MongoDB
- mongodb 分片叢集設定MongoDB
- MongoDB分片叢集常用操作MongoDB
- 使用副本集搭建MongoDB叢集MongoDB
- mongodb副本叢集和分片叢集佈署MongoDB
- MongoDB 3.2.7 for rhel6.4 副本集-分片叢集部署MongoDB
- MongoDB分片叢集chunk的概念MongoDB
- 高可用mongodb叢集(分片+副本)MongoDB
- mongodb 4.0副本集搭建MongoDB
- MongoDB 6.0.3副本集搭建MongoDB
- MongoDB Sharding(二) -- 搭建分片叢集MongoDB
- mongodb的分散式叢集(3、分片)MongoDB分散式
- 搭建高可用MongoDB叢集(四):分片MongoDB
- MongoDB 3.2.7 基於keyFile的認證在副本集+叢集分片中的使用MongoDB
- 搭建高可用MongoDB叢集(二): 副本集MongoDB
- 【最佳實踐】高可用mongodb叢集(1分片+3副本):規劃及部署MongoDB
- 使用Docker搭建MongoDB 5.0版本副本集叢集DockerMongoDB
- 搭建 MongoDB分片(sharding) / 分割槽 / 叢集環境MongoDB
- MongoDB分片儲存的叢集架構實現MongoDB架構
- MongoDB叢集設定集合分片生效及檢視集合分片情況MongoDB
- MongoDB 副本集分片叢集一分片config庫主機斷電導致該分片config庫無法啟動MongoDB
- MongoDB日常運維-04副本集搭建MongoDB運維
- 分片叢集元件元件
- 部署分片叢集
- MongoDB 分片叢集均衡器導致的效能下降MongoDB
- mongoDB研究筆記:分片叢集的工作機制MongoDB筆記
- Nagios監控mongodb分片叢集服務實戰iOSMongoDB
- MongoDB 4.2分片叢集搭建及與3.4分片叢集搭建時的一些異同MongoDB
- Redis叢集 - cluster叢集、資料分片Redis