mongdob-高可用集群

Posted zs-book1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongdob-高可用集群相关的知识,希望对你有一定的参考价值。

Mongodb 搭建高可用集群(分片+副本集)

分片与副本集的区别?

在上一篇我们学习了集群配置--副本集的配置, 副本集是集群配置的方式, 分片也是集群配置的方式, 那么这两种方式的区别是什么?

  • 副本集(replica Set)
    • 一个副本集中每一个节点上的数据都相同(从节点复制主节点数据),保证数据一致性。
    • 主节点宕机后,从节点会选举出新的主节点。故障转移,保证服务的可用性。
  • 分片(sharding)
    • 每一个节点存放的数据都是不一样的。保证当数据量过大时,数据库能够正常使用,缓解数据库的读写压力。
    • 集群节点抽象,客户端只需要知道route路由的链接地址,通过路由来存取数据,无需知道具体连接的集群节点信息。保证数据安全性。

分析上面的区别可以看出,副本集和分片各有优点,因此高可用的服务集群应该时replSet+sharding。

实现replSet+ sharding

节点分布信息:关于仲裁节点

端口号192.168.226.130192.168.226.131192.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 root@192.168.226.131:/data/config/                                                                                                                             100%  149     0.2KB/s   00:00
[root@moggledb config]# scp mongodb-config.conf root@192.168.226.132:/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副本集配置启动

按上表分别创建数据库文件夹及配置文件 技术图片

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 }

至此集群配置完毕,下面测试集群配置是否可用:
存入500条数据

[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" : 16384,
                        "capped" : false,
                        ...
                        "nindexes" : 2,
                        "totalIndexSize" : 32768,
                        "indexSizes" : {
                                "_id_" : 16384,
                                "id_1" : 16384
                        },
                        "ok" : 1
                }
        },
        "ok" : 1
}

注意上面的count属性,shard1.count:479,shard2.count:1,shard3.count:20。
500条数据分片存储,集群搭建成功。

关闭/启动集群

启动集群 先启动config server,在启动shard,最后启动mongos

mongod -f /data/config/mongodb-config.conf
mongod -f /data/shard1/mongodb-shard1.conf
mongod -f /data/shard2/mongodb-shard2.conf
mongod -f /data/shard3/mongodb-shard3.conf
mongod -f /data/mongos/mongodb-mongos.conf

关闭集群:

killall mongod
killall mongos

以上是关于mongdob-高可用集群的主要内容,如果未能解决你的问题,请参考以下文章

keepalived集群高可用

高可用kubernetes集群搭建

Nginx keepalived 高可用集群

Flink高可用集群搭建

Linux 高可用(HA)集群基本概念详解

集群介绍keepalived介绍用keepalived配置高可用集群