MongoDB | 部署一个 Replica Set 集群
source link: https://ijayer.github.io/post/tech/db/mongodb/20170615-deploy-a-replica-set-cluster/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
MongoDB | 部署一个 Replica Set 集群
Replica Set:是有故障恢复功能的主从集群,由一个primary节点和一个或多个secondary节点组成。
- MongoDB shell version v3.4.5
- MongoDB server version: 3.4.5
- Centos 7 x86_64
注:在副本集环境中,如果所有的secondary节点都宕机,则primary节点降级为secondary节点,不能提供服务。
ReplicaSet架构图
准备Mongo服务器
部署三台装有MongoDB的主机
ip | port | description |
---|---|---|
192.168.1.167 | 27017 | primary(主节点) |
192.168.1.196 | 27017 | secondary(从节点) |
192.168.1.197 | 27017 | secondary or arbiter(仲裁节点) |
注:确保所有服务器上的数据库都是空的,并停止所有mongod服务。
创建数据文件夹
分别创建数据和日志文件存放目录
mkdir -p /home/mongo/data/db mkdir -p /home/mongo/log |
配置mongod服务启动参数
vim /etc/mongod.conf
|
Options: - replication: 副本集配置
注:其他两台服务器配置文件只需要修改
bindIp
为自己主机ip即可
配置mongod服务控制脚本
vim /usr/lib/systemd/system/mongod.service
|
注:主要修改Mongod服务的用户组和所有者:
User、Group、
为root
启动mongod服务
首先关闭Centos系统防火墙或在防火墙配置中运许27017端口通过
systemctl status firewalld.service
active (running)
:表示运行systemctl stop firewalld.service
inactive (dead)
:表示关闭
先开启服务,并检查服务状态
systemctl start mongod.service systemctl status mongod.service
连接数据库,使用
ip:port
方式连接mongo 192.168.1.167:27017
注:如果没有关闭防火墙或允许27017端口,则会出现集群中的节点间通信失败,导致整个集群无法正常运行。
配置副本集初始化参数
配置初始化参数
|
_id
:选项必须和服务启动参数的副本集保持一致host
:用主机的ip:port代替原有的示例说明
执行初始化命令
可通过mongo shell输入 rs.help()
获取命令帮助
rs.initiate(cfg) # 初始化 rs.reconfig(cfg) # 重新初始化 rs.reconfig(cfg, {force: true}) # 强制执行重新初始化 |
注:初始化过程出现了一些问题记录在 FAQ 中
查看初始化后的集群配置
|
查看初始化后的集群状态
|
注:可以看到有,1个primary节点,两个secondary节点;以及syncingTo
指明的同步到的数据库,lastHeartbeat
集群中节点间的心跳包
至此,整个副本集搭建成功。
集群功能测试
|
注:secondary节点默认是不可读的;如果没有配置slaveOk,则回报如下错误:
error: { "$err" : "not master and slaveOk=false", "code" : 13435 } |
登陆主节点服务
- mongo 192.168.1.167:27017
查看并新建测试数据库
查看所有数据库
- show dbs
新建测试数据库
- use rstest
插入测试数据
- db.rstest.insert({“name”:“test data”,“value”:1111})
查看是否插入成功
- db.rstest.find()
开启另一个shell连接到secondary节点
- mongo 192.168.1.196:27017
- use rstest
在从节点不能读写数据,需要设置从节点可读
- rs.slaveOk()
- db.rstest.find()
执行完成可看到主节点数据已经同步到从节点了
自动故障转移
关闭primary节点服务
断开与主节点连接,回到shell执行一下命令:
- systemctl stop mongod.service
登陆到任意一个从节点
- mongo 192.168.1.196:27017
查看节点最新状态
|
可以看到,原来的主节点(192.168.1.167:27017)
变为不可达状态,而两个从节点中的一个会升级为主节点继续提供服务; 自动故障转移测试完成。
详细过参考 环境搭建1.1~1.6
- 创建mongod服务实例
- 连接到primary节点
-
- rs.add(“192.168.1.1198:27017”)
- rs.status()
删除节点前首先要关闭该节点的mongod服务, 进入该节点的主机,执行
- systemctl mongod.service
连接到primary节点,执行
- mongo 192.168.1.169:27017
- rs.remove(“192.168.1.196:27017”)
- rs.status()
通过重新配置达到删除目的
|
集群其他方面应用
应用方面会随后补充更新…
手动从节点升级为主节点
添加仲裁节点
添加备份节点
ReplicaSet集群节点互联不通,Heartbeat超时,导致链接通道关闭,主要表现为一下两个错误提示:
Issue 1:
connected refused
Issue 2
“stateStr” : “(not reachable/healthy)”
-
Centos防火墙未关闭,导致三个节点之间连接不通;或27017节点没有被允许通过防火墙
How 关闭防火墙或运行27017端口
集群中节点状态
Name | Description |
---|---|
STARTUP | 没有任何活跃的节点,所有节点在这种状态下启动,解析副本集配置 |
PRIMARY | 副本集的主节点 |
SECONDARY | 副本集从节点,可以读数据 |
RECOVERING | 可以投票,成员执行启动自检,或完成回滚或重新同步。 |
STARTUP2 | 节点加入,并运行初始同步 |
UNKNOWN | 从其它节点看来,该节点未知 |
ARBITER | 仲裁者,不复制数据,供投票 |
DOWN | 在其它节点看来,该节点不可达 |
ROLLBACK | 该节点正在执行回滚,不能读取数据 |
REMOVED | 该节点被删除 |
集群中shell方法
Method Name | Description |
---|---|
rs.add() | 添加节点到副本集 |
rs.addArb() | 添加仲裁节点到副本集 |
rs.conf() | 获取副本集的配置文档 |
rs.freeze() | 指定一段时间内,当前节点不能竞选主节点Primary |
rs.help() | 获取副本集的基本方法 |
rs.initiate() | 初始化一个新的副本集 |
rs.printReplicationInfo() | 打印副本集的主节点Primary的状态报告 |
rs.printSlaveReplicationInfo() | 打印副本集的从节点Secondary的状态报告 |
rs.reconfig() | 重新配置副本集 |
rs.remove() | 删除一个节点 |
rs.slaveOk() | 设置当前连接可读,使用readPref() 和 MongosetReadPref()去设置读偏好 |
rs.status() | 返回副本集状态信息的文档 |
rs.stepDown() | 强制当前主节点Primary成为从节点Secondary,并触发投票选举 |
rs.syncFrom() | 设置新的同步目标,覆盖默认的同步目标 |
See Also
Thanks to the authors 🙂
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK