天天看點

mongdob-高可用叢集

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副本集配置啟動

按上表分别建立資料庫檔案夾及配置檔案 ​

mongdob-高可用叢集

​​

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等。 啟動節點。 ​

mongdob-高可用叢集

​​​ ​

mongdob-高可用叢集

​​​ ​

mongdob-高可用叢集

​​ 進入節點,初始化副本集:

[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"