CentOS7下MongoDB4副本集搭建

版本信息

  • CentOS Linux release 7.6.1810 (Core)
  • mongodb-linux-x86_64-rhel70-4.0.8.tgz

安装必要支持软件包

1
$ yum -y install openssl-devel libcurl

解压并重命名

1
2
3
$ tar -zxvf mongodb-linux-x86_64-rhel70-4.0.8.tgz
$ mv mongodb-linux-x86_64-rhel70-4.0.8 mongodb
$ mv mongodb /usr/local/

创建数据库目录及日志文件

1
2
3
$ mkdir -p /usr/local/mongodb/data/db
$ mkdir -p /usr/local/mongodb/logs
$ touch /usr/local/mongodb/logs/mongodb.log

编写配置文件

1
2
3
4
5
6
7
8
9
10
# vim /etc/mongod.conf
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/logs/mongodb.log
port=27017
fork=true
logappend=true
maxConns=5000
storageEngine=mmapv1
bind_ip=0.0.0.0
replSet=lock

编写启动文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# /lib/systemd/system/mongod.service
[Unit]
Description=mongo
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/mongodb/bin/mongod -f /etc/mongod.conf
ExecStop=/usr/local/mongodb/bin/mongod -f /etc/mongod.conf --shutdown
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

可用命令

1
2
3
4
5
6
7
8
9
10
# 查看状态
$ systemctl status mongod
# 启动
$ systemctl start mongod
# 重启
$ systemctl restart mongod
# 停止
$ systemctl stop mongod
# 开机自启
$ systemctl enable mongod

防火墙暴露端口

1
2
3
4
5
6
7
8
$ firewall-cmd --permanent --zone=public --add-port=27017/tcp
# out: success

#查看所有暴露端口
$ firewall-cmd --zone=public --list-ports

# 更新防火墙规则,否则出现 No route to host 错误
$ firewall-cmd --reload

配置环境变量

1
2
3
4
5
6
7
# vim .bash_profile
# 追加
MONGODB_HOME=/user/local/mongodb

PATH=$PATH:$MONGODB_HOME/bin

export MONGODB_HOME

副本集配置

以下设置均在主节点配置即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 创建用户

$ systemctl start mongod
$ mongo

> use admin
> db.createUser(
{
user: "root",
pwd: "root",
roles: [{
role: "userAdminAnyDatabase",
db: "admin"
}]
}
)

// 验证权限是否生效
> db.auth("root", "root")

> use lockdata
> db.createUser(
{
user: "lock",
pwd: "lock",
roles: [{
role: "readWrite",
db: "lockdata"
}]
}
)
// 验证权限是否生效
> db.auth("lock", "lock")

-------------------------------------------------------------------------
# 添加从节点及仲裁节点

> rs.initiate()
lock:PRIMARY> rs.add("192.168.122.118:27017")
lock:PRIMARY> rs.addArb("192.168:122:123:27017")
lock:PRIMARY> rs.status()
# out:
"members" : [
{
"_id" : 0,
"name" : "es-master1-and-mongo1:27017",
},
{
"_id" : 1,
"name" : "192.168.122.118:27017",
},
{
"_id" : 2,
"name" : "192.168.122.123:27017",
}
]

测试

在主库中添加测试测试数据后,在从从库中也会同步;
如果主库关闭,从库会充当主库;
此时如果原主库再启动,则变为从库;

Q&A

1.在从库中无法查看数据库中的数据报 code: 13435

error: { “$err” : “not master and slaveOk=false”, “code” : 13435 }
注意看错误信息: 不是主机,slaveOk=false

解决方案: 进入mongo控制台
输入

rs.slaveOk()

2.No route to host

解决方案: 更新防火墙规则

$ firewall-cmd –reload

参考材料