MongoDB集群有三种搭建方案,分别为Replica Set / Sharding / Master-Slaver
,
本文介绍简单的Replica Set
模式。
-
安装mongodb
参考https://blog.csdn.net/zhiyual/article/details/79764165 -
主节点
Mongodb的Replica Set即副本集方式主要有两个目的,一个是数据冗余做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。另一个是做读写分离,读的请求分流到副本上,减轻主(Primary)的读压力。 -
副本节点(Secondary)
与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。
默认设置下,主节点提供所有增删查改服务,备用节点只提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。 -
仲裁者(Arbiter)
不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter跑起来几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。
注意,集群副本集数量建议是奇数可不设置仲裁者,如果是偶数,需要设置一个仲裁者。 -
选主过程
其中Secondary宕机,不受影响,若Primary宕机,会进行重新选主,选举过程参考https://blog.csdn.net/rudygao/article/details/49868437 -
配置文件
dbpath=/data/app/mongo/data
logpath=/data/app/mongo/mongodb.log
pidfilepath=/data/app/mongo/mongodb.pid
#keyFile=/data/app/mongo/mongodb.key # 用户集群间的验证
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=0.0.0.0
port=27017
oplogSize=1000
fork=true
#noprealloc=true
#maxConns=4000
- 创建集群
不用仲裁者,启动三个mongodb服务,命令如下
mongod -f config.conf
连接任意节点并执行如下命令:
cfg = {_id : "rs0",members : [ { _id:0, host:"127.0.0.1:27018", priority:2 },{ _id:1, host:"127.0.0.1:27019", priority:1 },{ _id:2, host:"127.0.0.1:27020", priority:1 } ]}
rs.initiate(cfg)
指定了127.0.0.1:27018
为主节点,因为priority
最大。
- 节点增删
rs.add({"host":"127.0.0.1:27018", "priority": 1});# 增加节点
rs.remove("127.0.0.1:27018"); # 删除节点
配置集群访问密码
- 第一步
创建用户
use admin;
db.createUser({user: "root",pwd: "123456",roles: ["root"]});
- 第二步
创建key文件
openssl rand -base64 741 > mongodb.key
chmod 600 mongodb.key
并将mongodb.key
复制到其他副本
- 第三步
先停到所有副本的服务,最后停掉主节点服务.
在主节点以及副本节点的配置文件中添加如下,指定key file
keyFile=/data/app/mongo/mongodb.key
依次重启主节点和副本节点。
遇到的问题
- 当主节点和一个副本节点down之后,只剩一个副本节点会出现没有主节点的问题。
这是因为mongodb选主的大多数原则决定的(即当前复制集中,存活节点的数量必须大于节点总数的1/2,这样才能触发选举,否则当从节点挂掉时主节点会降级为从节点;当主节点挂掉时从节点也不会升为主节点)
参考文章
https://www.zhihu.com/question/27648448
MongoDB的选举过程
http://www.ywnds.com/?p=3366
网友评论