Mongodb 搭建高可用叢集(分片+副本集)
分片與副本集的差別?
在上一篇我們學習了叢集配置--副本集的配置, 副本集是叢集配置的方式, 分片也是叢集配置的方式, 那麼這兩種方式的差別是什麼?
-
- 副本集(replica Set)
-
- 一個副本集中每一個節點上的資料都相同(從節點複制主節點資料),保證資料一緻性。
- 主節點當機後,從節點會選舉出新的主節點。故障轉移,保證服務的可用性。
- 分片(sharding)
-
- 每一個節點存放的資料都是不一樣的。保證當資料量過大時,資料庫能夠正常使用,緩解資料庫的讀寫壓力。
- 叢集節點抽象,用戶端隻需要知道route路由的連結位址,通過路由來存取資料,無需知道具體連接配接的叢集節點資訊。保證資料安全性。
分析上面的差別可以看出,副本集和分片各有優點,是以高可用的服務叢集應該時replSet+sharding。
實作replSet+ sharding
節點分布資訊:關于仲裁節點
端口号 | 192.168.226.130 | 192.168.226.131 | 192.168.226.132 |
30000 | mongos | mongos | mongos |
27100 | config server | config server | config server |
27017 | shard1(primary) | shard1(secondary) | shard1(仲裁節點) |
27018 | shard2(primary) | shard2(secondary) | shard2(仲裁節點) |
27019 | shard3(primary) | shard3(secondary) | shard3(仲裁節點) |
config server副本集配置啟動
config server是存儲資料的位置的節點,路由route通過該節點擷取資料位置。隻設一個節點,config server當機,就會導緻服務整體不可用,是以也設為副本集形式 在/data目錄下分别建立config檔案夾做資料庫檔案夾, 并建立配置檔案
mongodb-config.conf
内容如下:
dbpath=/data/config
logpath=/data/log/mongodb-config.log
logappend=true
fork=true
bind_ip=192.168.226.130
port=27100
configsvr=true
replSet=configs
關于configsvr屬性配置後,config server節點啟動失敗問題
本來我是用的3.0.6版本的mongdob,config server節點一直啟動失敗,如果不配置configsvr這個屬性就能正常啟動,但是無法配置mongos副本集,後來更新到3.4.6版本後就可以正常啟動了。
複制到其他兩個節點并修改配置檔案的内容
[root@moggledb config]# scp mongodb-config.conf [email protected]:/data/config/ 100% 149 0.2KB/s 00:00
[root@moggledb config]# scp mongodb-config.conf [email protected]:/data/config/
啟動config庫,初始化副本集:
[root@moggledb config]# mongo --host 192.168.226.130 --port 27100
...
> var conf={_id:"configs",members:[{_id:0,host:"192.168.226.130:27100"},{_id:1,host:"192.168.226.131:27100"},{_id:2,host:"192.168.226.132:27100"}]}
> rs.initiate(conf)
shard副本集配置啟動
按上表分别建立資料庫檔案夾及配置檔案
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yN0UjNxYjY0IzYmFGZ4UGZxYzX1MzMxYTMyEzLcFDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
dbpath=/data/shard1
logpath=/data/log/mongodb-shard1.log
logappend=true
fork=true
bind_ip=192.168.226.130
port=27017
replSet=shard1
# 設定分片
shardsvr=trueZZZZ
分别複制到其他幾個節點并修改相應節點資訊ip/port/replSet等。 啟動節點。
進入節點,初始化副本集:
[root@mongodb2 data]# mongo --host 192.168.226.130 --port 27017
.....
> var conf={_id:"shard1",members:[{_id:0,host:"192.168.226.130:27017"},{_id:1,"host":"192.168.226.131:27017"},{_id:2,host:"192.168.226.132:27017",arbiterOnly:true}]}
> rs.initiate(conf)
{ "ok" : 1 }
shard1:OTHER> exit
bye
[root@mongodb2 data]# mongo --host 192.168.226.130 --port 27018
....
> var conf={_id:"shard2",members:[{_id:0,host:"192.168.226.130:27018"},{_id:1,"host":"192.168.226.131:27018"},{_id:2,host:"192.168.226.132:27018",arbiterOnly:true}]}
> rs.initiate(conf)
{ "ok" : 1 }
shard2:OTHER> exit
bye
[root@mongodb2 data]# mongo --host 192.168.226.130 --port 27019
.....
> var conf={_id:"shard3",members:[{_id:0,host:"192.168.226.130:27019"},{_id:1,"host":"192.168.226.131:27019"},{_id:2,host:"192.168.226.132:27019",arbiterOnly:true}]}
> rs.initiate(conf)
{ "ok" : 1 }
啟動路由: 建立mongos檔案夾,編輯mongodb-mongos.conf
port=30000
bind_ip=192.168.226.130
logpath=/data/log/mongodb-route.log
logappend=true
configdb=configs/192.168.226.130:27100,192.168.226.131:27100,192.168.226.132:27100
fork=true
route節點
啟動路由,配置分片副本集
[root@moggledb mongos]# mongos -f mongodb-mongos.conf
[root@moggledb mongos]# mongo --host 192.168.226.130 --port 30000
...
mongos> use admin
switched to db admin
mongos> sh.addShard("shard1/192.168.226.130:27017,192.168.226.131:27017,192.168.226.132:27017")
{ "shardAdded" : "shard1", "ok" : 1 }
mongos> sh.addShard("shard2/192.168.226.130:27018,192.168.226.131:27018,192.168.226.132:27018")
{ "shardAdded" : "shard2", "ok" : 1 }
mongos> sh.addShard("shard3/192.168.226.130:27019,192.168.226.131:27019,192.168.226.132:27019")
{ "shardAdded" : "shard3", "ok" : 1 }
[root@moggledb ~]# mongo -host 192.168.226.130 -port 30000
......
mongos> show dbs
admin 0.000GB
config 0.000GB
mongos> use admin
switched to db admin
mongos> db.runCommand({enablesharding:"study"})
{ "ok" : 1 }
mongos> db.runCommand({shardcollection:"study.book",key:{id:1}})
{ "collectionsharded" : "study.book", "ok" : 1 }
mongos> use study
switched to db study
mongos> for(var i=1;i<=500;i++){db.book.insert({id:i,"name":"java"})}
WriteResult({ "nInserted" : 1 })
## 檢視表資料存儲狀态
mongos> db.book.find().count()
500
mongos> db.book.stats()
{
"sharded" : true,
"capped" : false,
"ns" : "study.book",
"count" : 500,
"size" : 24500,
"storageSize" : 53248,
"totalIndexSize" : 102400,
"indexSizes" : {
"_id_" : 49152,
"id_1" : 53248
},
"avgObjSize" : 49,
"nindexes" : 2,
"nchunks" : 3,
"shards" : {
"shard1" : {
"ns" : "study.book",
"size" : 23471,
"count" : 479,
"avgObjSize" : 49,
"storageSize" : 20480,
"capped" : false,
...
"nindexes" : 2,
"totalIndexSize" : 36864,
"indexSizes" : {
"_id_" : 16384,
"id_1" : 20480
},
"ok" : 1
},
"shard2" : {
"ns" : "study.book",
"size" : 49,
"count" : 1,
"avgObjSize" : 49,
"storageSize" : 16384,
"capped" : false,
...
"nindexes" : 2,
"totalIndexSize" : 32768,
"indexSizes" : {
"_id_" : 16384,
"id_1" : 16384
},
"ok" : 1
},
"shard3" : {
"ns" : "study.book",
"size" : 980,
"count" : 20,
"avgObjSize" : 49,
"storageSize"