一、安装参考文档
二、配置主从
(一)切换到mongo所在的bin目录下,后面操作全部在bin下进行
- 命令:
cd /usr/mongodb/mongodb-linux-x86_64-3.4.18/bin
(根据个人的mongo位置进行切换)
(二)修改主、从、仲裁节点配置文件
- 命令:
vi mongodb.conf
- 主、从、仲裁的服务器上,mongo的配置只有bindIp不同,要设置好各自的ip值,不要写localhost;
- 我的ip配置为
192.168.2.222、223、224
; - 我的端口号修改了默认值为
27022
; - 主从的名字是
“rs”
。
(三)分别在主、从、仲裁节点的服务器上启动mongo服务,后台启动
- 命令:
./monood -f mongo.conf &
(四)在任一台服务器上链接mongo
- 命令:
./mongo 192.168.2.222:27022
# 指定ip和port登录
(五)在mongo shell里操作
- 使用管理员权限
use admin
- 设置主从的参数, “_id"是主从关联的名字,和配置文件内的replSetName对应; “members”:是主从的成员列表,members内的”_id":是主从序列,"priority"是优先权重;"arbiterOnly"是仲裁标志,不做从属,只是负责仲裁。
cfg={ "_id":"rs", "members":[ {"_id":0,"host":'192.168.2.222:27022',"priority":2}, {"_id":1,"host":'192.168.2.223:27022',"priority":1}, {"_id":2,"host":'192.168.2.224:27022',"arbiterOnly":true}] };
- 初始化主从配置信息,返回ok,即为配置成功。
rs.initiate(cfg)
{ "ok" : 1 }
- 查看副本集的状态
rs:OTHER> rs.status()
{返回一长串主从信息… 不展示了}
三、报错解析
1、没有配置成功。
{
"info" : "run rs.initiate(...) if not yet done for the set",
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized"
}
2、从属服务器mongo内有数据,需要删除数据库的数据。
解决:尝试注释掉掉服务器的从属关系,恢复为一个单纯的服务器,然后将数据库内的数据都删掉,再恢复从属关系并重启数据库。
{
"ok" : 0,
"errmsg" : "'192.168.2.224:27022' has data already, cannot initiate set.",
"code" : 110,
"codeName" : "CannotInitializeNodeWithData"
}
3、从属服务器没有设置读写功能。
解决:在从服务器上设置命令rs.slaveOk()后,再查询即可。
Error: error: {
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk"
}
4、有些从服务没有响应
解决:①查看selinux是关闭的,这个先排除;②iptables -nvL, wps, 这么多防火墙规则,关了它;③重启mongodb服务
{
"ok" : 0,
"errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.3.221:27017 failed with Failed attempt to connect to 192.168.3.221:27017; couldn't connect to server 192.168.3.221:27017 (192.168.3.221), connection attempt failed",
"code" : 74
}
四、重点提醒
- 一定要先把从属服务器的数据库数据删除再配置主从
- 报错了不要慌,看看防火墙什么的关了没有
- 配置文件只需要改ip和开启从属关系,其他的不要乱配置
- 如果莫名失败,那就mongo卸载了重新来过~大不了从头再来!!!