# MongoDB配置副本集(含Arbiter)

集群模式为:一主一副一仲裁

安装依赖

yum install net-snmp lsof -y

yum install net-snmp -y
1
2
3

# 配置数据节点

在每一台要配置数据节点的机器上均要操作,这里配置两台机器

# 创建存放进程ID(PID)的文件夹

mkdir -p /var/run/mongodb/
1

# 创建存储节点数据和log文件的文件夹

mkdir -p /mongodb/node/data

mkdir -p /mongodb/node/log
1
2
3

# 编辑数据节点的配置文件

vim /etc/mongod_Node.conf
1
systemLog:
  destination: file
  logAppend: true
  path: /mongodb/node/log/node.log
  
storage:
  dbPath: /mongodb/node/data
  journal:
    enabled: true

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/node.pid
  timeZoneInfo: /usr/share/zoneinfo
 
net:
  port: 27019
  bindIp: 0.0.0.0
  
replication:
  replSetName: repl_0
  
sharding:
    clusterRole: shardsvr  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 使用配置文件启动数据节点

/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongod -f /etc/mongod_Node.conf
1

# 配置防火墙

#开启端口
firewall-cmd --zone=public --add-port=27019/tcp --permanent 
#重新载入
firewall-cmd --reload
#查看
firewall-cmd --query-port=27019/tcp
1
2
3
4
5
6

# 创建仲裁节点

在每一台要配置Arviter的机器上均要操作,此处配置一台

Arbiter存储的不是应用程序的数据,而是副本集的配置数据

# 创建存放进程ID(PID)的文件夹

mkdir -p /var/run/mongodb/
1

# 创建存储Arbiter数据和log文件的文件夹

mkdir -p /mongodb/arbiter/data

mkdir -p /mongodb/arbiter/log
1
2
3

# 编辑Arbiter的配置文件

vim /etc/mongod_Arbiter.conf
1
systemLog:
  destination: file
  logAppend: true
  path: /mongodb/arbiter/log/arbiter.log

storage:
  dbPath: /mongodb/arbiter/data
  journal:
    enabled: true

processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/arbiter.pid
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27020
  bindIp: 0.0.0.0
  
replication:
  replSetName: repl_0
  
sharding:
    clusterRole: shardsvr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 使用配置文件启动仲裁节点

/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongod -f /etc/mongod_Arbiter.conf
1

# 配置防火墙

#开启端口
firewall-cmd --zone=public --add-port=27020/tcp --permanent 
#重新载入
firewall-cmd --reload
#查看
firewall-cmd --query-port=27020/tcp
1
2
3
4
5
6

# 登录其中一台数据节点

通常选择初始时欲成为Primary的节点

/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongo --port 27019
1

# 在登录节点后设定副本集成员

use admin

rs.initiate({
  _id:"repl_0",
  members:[
  {_id:0,host:"node1:27019"},
  {_id:1,host:"node2:27019"},
  {_id:2,host:"node3:27020",arbiterOnly:true}
]})

# 如果全部是node节点,使用以下配置
rs.initiate({
  _id:"repl_0",
  members:[
  {_id:0,host:"node1:27019"},
  {_id:1,host:"node2:27019"},
  {_id:2,host:"node3:27019"}
]})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
rs.conf()

rs.status()
1
2
3

# 配置内存节点

In-Memory节点的数据会完全放置在内存中,仅有少量的元数据及诊断(Diagnostic)日志会存放在磁盘中。在读取数据时不会涉及磁盘I/O操作。

缺点:一旦服务关闭,数据就会丢失(包含权限信息)

# 将内存节点设置为主/副节点的优势

# 设置为主节点

若将In-memory节点设定成主节点,则可以怎家读写的效率。

但若在数据写入后还在同步到副本节点就发生宕机,则可能导致数据丢失。

# 设定为副节点

若将In-memory设置为副本节点,则In-Memory节点重启后可以从其他节点上同步数据,以避免数据丢失所造成的损失。

如将In-Memory设为副本节点,则可通过"读写分离"来提高读写性能。

# In-Memory节点的配置方式

配置In-Memory节点的方式,与配置一般节点的方式仅有少量差异

配置时可以设置”内存使用空间“的大小,默认大小为”50%的物理内存-1GB“;

而dbpath的路径仅会保存一些诊断数据及元数据

# 建立保存诊断(Diagnostic)数据及元数据的文件夹

madir -p /mongodb/in-memoryNode
1

# 设置启动文件中storage的属性值

storage:
engine: inMemory
  dbPath: /mongodb/in-memoryNode
  inMemory:
    engineConfig:
      inMemorySizeGB: 16000
1
2
3
4
5
6
  • 使用配置文件启动此节点
  • 使用副本集设定方式加入副本节点

# 正常关机

如果电脑需要关机,一定要先正常关闭mongodb,否则容易出现集群启动不了的问题

/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongo --port 27019

use admin

db.shutdownServer()
1
2
3
4
5
lsof -i:27019

kill pid
1
2
3

# 配置自启动服务

# 关闭SELinux

# 检查SELinux是否开启
/usr/sbin/sestatus -v
1
2
vim /etc/selinux/config
1
SELINUX=disabled
1

重启机器

reboot
1

# 编辑自启动服务文件

编辑MongoDB服务文件(mongod.service)

vim /usr/lib/systemd/system/mongod.service
1
  • 数据节点
[Unit]  
Description=mongodb 
After=network.target

[Service]
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStart=/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongod --config /etc/mongod_Node.conf
ExecStop=/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongod --shutdown --config /etc/mongod_Node.conf  
PIDFile=/var/run/mongodb/node.pid
PermissionsStartOnly=true
Type=forking  

# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false


[Install]  
WantedBy=multi-user.target
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
  • 仲裁节点
[Unit]  
Description=mongodb 
After=network.target

[Service]
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStart=/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongod --config /etc/mongod_Arbiter.conf
ExecStop=/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongod --shutdown --config /etc/mongod_Arbiter.conf  
PIDFile=/var/run/mongodb/arbiter.pid
PermissionsStartOnly=true
Type=forking  

# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false


[Install]  
WantedBy=multi-user.target
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

设置mongod.service权限

chmod 754 /usr/lib/systemd/system/mongod.service
1

启动自启动服务

systemctl enable mongod.service
1

开启服务

systemctl start mongod.service
1

关闭自启动服务

systemctl disable mongod.service
1

查询服务状态

systemctl status mongod.service
1

停止服务

systemctl stop mongod.service
1
上次更新时间: 2024年2月12日星期一晚上7点28分