一概述
MongoDB 复制群集支持节点故障自动切换, 最小配置应包含 3 个节点, 正常情况下应该至少包含两个数据节点, 第三个节点可以是数据节点也可以是仲裁节点仲裁节点的作用是当出现偶数节点导致无法仲裁的时候参与进来进行投票使之变成奇数个投票点, 仲裁节点可以看成是不包含任何数据集的副本节点仲裁节点并不需要太多系统资源, 仅仅只是参与投票, 可随意部署在网络通的地方不会占用什么系统资源; 而数据节点保存了数据, 需要占用比较大的磁盘空间内存等硬件资源, 成本比仲裁节点高很多, 但是额外提供了一个数据副本, 相当于更多一层保障
版本: MongoDB3.6.2
OS:Centos6.7
节点 1:192.168.137.10:27010 ; 目录 / mongos27010
节点 2:192.168.137.10:27011; 目录 / mongos27011
节点 3:192.168.137.10:27012; 目录 / mongos27012
二搭建
基本架构如下:
1. 安装 Mongodb
解压
- tar -xvf mongodb-linux-x86_64-rhel62-3.6.2.tgz
- mv mongodb-linux-x86_64-rhel62-3.6.2 mongos27010
创建相关目录
- cd /mongos27010
- mkdir -p data/db
- mkdir -p data/log
配置文件
- vim mongosdb.conf
- pidfilepath = /mongos27010/mongod.pid
- logpath = /mongos27010/data/log/mongod.log
- dbpath = /mongos27010/data/db
- logappend = true
- bind_ip = 192.168.137.10,127.0.0.1
- port = 27010
- fork = true
- #auth = true
- #replSet = myapp
- #keyFile = /mongos27010/autokey
加入环境变量
- vim /etc/profile
- export PATH=/mongos27010/bin:$PATH
- source /etc/profile
启动服务
/mongos27010/bin/mongod --maxConns 20000 --config /mongos27010/mongodb.conf
生成 keyfile 文件
- openssl rand -base64 756 > /mongodb27010/autokey
- chmod 400 /mongodb27010/autokey
2. 权限配置
登入
mongo --port 27010
创建 admin 的 root 角色用户
- db.createUser({
- user:"dba",
- pwd:"dba",
- roles:[{role:"root",db:"admin"}]});
创建用户数据库的读写权限用户, 在用户数据库下创建
- use test;
- db.createUser(
- {
- user:"test",
- pwd:"test",
- roles:[{role:"readWrite",db:"test"}
- ]
- }
- );
关闭数据库服务
db.shutdownServer();
3. 添加群集
修改节点 27010 配置文件
- pidfilepath = /mongos27010/mongod.pid
- logpath = /mongos27010/data/log/mongod.log
- dbpath = /mongos27010/data/db
- logappend = true
- bind_ip = 192.168.137.10
- port = 27010
- fork = true
- auth = true
- replSet = myapp
- keyFile = /mongos27010/autokey
将 27010 节点目录文件复制两份
- cp -rp /mongos27010 /mongos27011
- cp -rp /mongos27010 /mongos27012
注意: 对应修改节点 2701127012 配置文件
启动三个节点服务
- /mongos27010/bin/mongod --maxConns 20000 --config /mongos27010/mongodb.conf
- /mongos27011/bin/mongod --maxConns 20000 --config /mongos27011/mongodb.conf
- /mongos27012/bin/mongod --maxConns 20000 --config /mongos27012/mongodb.conf
登入到主节点 27010, 添加其它两个节点
mongo --port 27010
切换数据库
use admin
验证权限
db.auth("dba","dba")
初始化复制集
rs.initiate()
添加数据节点 27011, 可以用机器名加端口也可以使用 IP 加端口
rs.add("192.168.137.10:27011")
添加数据节点 27012, 可以用机器名加端口也可以使用 IP 加端口
rs.add("192.168.137.10:27012")
注意: 添加节点后基底重启所有节点服务
注意: 当前我已经把节点 27010 和 27011 的优先级都设成了 10, 节点 27012 的优先级设成了 0, 所以节点 27012 永远不会成为主节点
arbiterOnly: 表示该成员是仲裁者, arbiter 的唯一作用是就是参与选举, 其 votes 属性是 1,arbiter 不保存数据, 也不会为 client 提供服务
buildIndexes: 表示实在在成员上创建 Index, 该属性不能修改, 只能在增加成员时设置该属性如果一个成员仅仅作为备份, 不接收 Client 的请求, 将该成员设置为不创建 index, 能够提高数据同步的效率
priority: 表示一个成员被选举为 Primary 节点的优先级, 默认值是 1, 取值范围是从 0 到 100, 将 priority 设置为 0 有特殊含义: Priority 为 0 的成员永远不能成为 Primary 节点 Replica Set 中, Priority 最高的成员, 会优先被选举为 Primary 节点, 只要其满足条件
hidden: 将成员配置为隐藏成员, 要求 Priority 为 0Client 不会向隐藏成员发送请求, 因此隐藏成员不会收到 Client 的 Request
slaveDelay: 单位是秒, 将 Secondary 成员配置为延迟备份节点, 要求 Priority 为 0, 表示该成员比 Primary 成员滞后指定的时间, 才能将 Primary 上进行的写操作同步到本地为了数据读取的一致性, 应将延迟备份节点的 hidden 设置为 true, 避免用户读取到明显滞后的数据 Delayed members maintain a copy of the data that reflects the state of the data at some time in the past.
votes: 有效值是 0 或 1, 默认值是 1, 如果 votes 是 1, 表示该成员 (voting member) 有权限选举 Primary 成员在一个 Replica Set 中, 最多有 7 个成员, 其 votes 属性的值是 1
注意: 当前我已经把节点 27012 的优先级 (priority) 设成了 0, 所以节点 27012 在 passives 下面去了
4. 故障测试
停止 27010 节点服务
登入节点 27011 查询, rs.status()
主节点已经切换到了 27012 节点
三其它相关配置
1. 配置节点优先级
在主节点中配置
- cfg = rs.conf();
- cfg.members[0].priority = 10
- cfg.members[1].priority = 10
- cfg.members[2].priority = 5
- rs.reconfig(cfg)
- rs.conf();
注意: 1.members[n]指的是 rs.conf()查询中 "_id" 节点标志如果将某个节点的 priority 设为 0 那么它将永远不会成为 Primary 节点
2. 这里的 cfg 只是一个别名, 可以随意取
3. 主和背主的优先级建议设置成一样, 避免主重启之后又进行主切换
2. 关闭节点投票
- cfg = rs.conf()
- cfg.members[2].votes = 0;
- rs.reconfig(cfg)
- rs.conf();
注意: 将节点 votes 设为 0 那么该节点将不具有投票权
3. 添加仲裁节点
rs.addArb("localhost:27012")
注意: 添加节点后需要重启服务
4. 删除节点
删除仲裁节点命令相同
rs.remove("localhost:27012")
注意: 删除节点后要重启删除节点的服务, 同时将删除节点的 conf 配置文件的 replSet 参数去掉
5. 查询群集相关状态
- rs.status
- "_id" : #集群中节点编号
- "name" : #成员服务器名称及端口
- "health" : #表示成员中的健康状态(0:down;1:up)
- "state" : #为 0~10, 表示成员的当前状态
- "stateStr" : #描述该成员是主库 (PRIMARY) 还是备库(SECONDARY)
- "uptime" : #该成员在线时间(秒)
- "optime" : #成员最后一次应用日志 (oplog) 的信息
- "optimeDate" : #成员最后一次应用日志 (oplog) 的时间
- "electionTime" : #当前 primary 从操作日志中选举信息
- "electionDate" : #当前 primary 被选定为 primary 的日期
- "configVersion" : #mongodb 版本
- "self" : #为 true 表示当前节点
参考: https://docs.mongodb.com/manual/reference/command/replSetGetStatus/
rs.conf()
查询群集相关配置, 包括优先级投票等
参考: https://docs.mongodb.com/manual/reference/replica-configuration/
db.isMaster()
"passives" :priority=0 的标志
"setName": 群集名称
"ismaster": 是否是主节点
"secondary": 是否是从节点
参考: https://docs.mongodb.com/manual/reference/command/isMaster/
6. 关闭服务
db.shutdownServer()
7. 配置启动服务
- vim /etc/init.d/mongos27010
- ulimit -SHn 655350
- #!/bin/sh
- # chkconfig: - 64 36
- # description:mongod
- case $1 in
- start)
- /mongos27010/bin/mongod --maxConns 20000 --config /mongos27010/mongodb.conf
- ;;
- stop)
- /mongos27010/bin/mongo -u dba -p dba 192.168.137.10:27010/admin --eval "db.shutdownServer()"
- ;;
- status)
- /mongos27010/bin/mongo -u dba -p dba 192.168.137.10:27010/admin --eval "db.stats()"
- ;;
- esac
加入开启自动启动
chkconfig --level 345 mongos27010 on
四总结
如果是首次搭建可能会遇到各种小问题, 但是只要细心查找还是很容易解决; 整体来说搭建一个 MongoDB 复制群集还是比较简单
来源: https://www.cnblogs.com/chenmh/p/8484049.html