MongoDB副本集部署

温馨提醒

副本集架构

三个节点的副本集架构

1

主节点宕机,会变成

2

一主一备一仲裁架构下,主节点宕机

3

一主两备

默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上

环境

IP端口角色主机名
192.168.1.16327017主节点mongo01
192.168.1.12627017备节点mongo02
192.168.1.4127017备节点mongo03

安装

创建安装目录,修改权限

1
2
3
mkdir /data/mongod
mkdir /var/run/mongod
chown -R mongod.mongod /data/mongod /var/run/mongod

修改配置文件

vim /etc/mongod.conf

 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
57
58
59
60
61
62
63
64
65
66
67
# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true		#启动或重启后是否追加写入
  path: /var/log/mongodb/mongod.log
#  traceAllExceptions: true	#打印异常详细信息

# Where and how to store data.
storage:
  dbPath: /data/mongod
  journal:
    enabled: true
  directoryPerDB: false|true	#当为true时,mongodb使用单独的目录存储每个数据库,每个目录名称对应于数据库名称
#  engine:
#  mmapv1:
#  wiredTiger:
#    engineConfig:
#      cacheSizeGB: 1
#      directoryForIndexes: true
#    collectionConfig:
#      blockCompressor: zlib
#    indexConfig:
#      prefixCompression: true

# how the process runs
processManagement:
  fork: true 		#允许程序在后台运行
  pidFilePath: /var/run/mongod/mongod.pid

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0
  maxIncomingConnections: 65535		#最大连接数
  wireObjectCheck: true 		#mongod实例在收到客户端时验证所有请求,以防止客户端将格式错误或无效的bson插入到mongod数据库
  ipv6: false|true	#启用或禁用ipv6支持,默认禁用
  unixDomainSocket:
    enabled: true 	#启用或禁用unix套接字上的侦听
    pathPrefix: /tmp	#unix套接字的路径,默认/tmp目录下

security:
  authorization: enabled
  keyFile: /data/mongod/keyFile
# 创建一个密钥文件:openssl rand -base64 123456 > /data/mongod/keyFile
# chmod 600 /data/mongod/keyFile
# 把密钥文件复制到每个副本集成员
# 关闭复制集中的每个 mongod ,从从节点开始,直到副本集所有成员都离线,包括仲裁节点,主节点必须是最后一个关闭
# 要关闭 mongodb,在admin库上,执行 db.shutdownServer();

#operationProfiling:

replication:
  oplogSizeMB: 1024
  replSetName: xbd		#副本集名称,按需修改
 
#sharding:
#  clusterRole: shardsvr	#把此实例作为分片
#  clusterRole: configsvr	#把此实例作为配置服务器

## Enterprise-Only Options

#auditLog:

#snmp:

启动服务

1
systemctl enable --now mongod

初始化副本集(登录任意一个节点)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mongo 192.168.1.163:27017

> config = {_id:"xbd",
... members:[
... {_id:0,host:"192.168.1.163:27017",priority:1},
... {_id:1,host:"192.168.1.126:27017",priority:1},
... {_id:2,host:"192.168.1.41:27017",priority:1}]
... }

> rs.initiate(config);	# 如果结果返回1,说明初始化成功

检查副本集状态

1
2
3
4
5
6
7
8
# 查看副本集状态
rs.status();

# 查看当前节点是否为主节点
rs.isMaster();

# 查看副本集配置信息
rs.conf();

扩容和缩减节点

扩容节点

登录主节点,将新节点加入集群

1
2
3
4
mongo 192.168.1.163:27017

use admin
rs.add("xx.xx.xx.xx:27017")		# 添加新节点到副本集

缩减节点

登录主节点

1
2
3
4
5
mongo 192.168.1.163:27017

rs.remove("xx.xx.xx.xx:27017")

# 此时从节点变成了 OTHER 状态

关闭从节点

1
systemctl stop mongod

常用命令

1
2
3
4
5
rs.remove("192.168.1.41:27017")	#移除一个节点,需要在主节点操作

rs.add("192.168.1.41:27017")	#添加一个节点,需要在主节点操作
	
rs.addArb("192.168.10.108:27017")   #添加一个仲裁节点

模拟宕机测试

副本集更新权重模拟宕机,默认三台的权重都为1,如果任何一个权重比其他的高,则该台机器切换为 primary 角色。

在 primary 节点上执行

1
2
3
4
cfg = rs.conf()		# 读取当前配置
cfg.members[2].priority = 10	# 修改指定节点的权重为10
rs.reconfig(cfg)	# 使用配置生效
rs.stepDown();		# 主节点主动降权,重新选举

登录备节点查询数据,备节点是不能直接查询数据的,备节点设置为可读

1
rs.slaveOk()

一主一备一仲裁

仲裁节点是一种特殊的节点,它本身并不存储数据,不能被选为主节点,也不跟主节点同步数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。

初始化副本集(登录任意一个节点)

1
2
3
4
5
6
7
8
> cfg = {_id:"xbd",
... members:[
... {_id:0,host:"192.168.1.126:27017",priority:2},
... {_id:1,host:"192.168.1.163:27017",priority:2},	
... {_id:2,host:"192.168.1.41:27017",arbiterOnly:true}]
}

xbd:PRIMARY> rs.initiate(cfg)

仲裁节点有一个特别的配置–arbiterOnly:true,这个不能少,否则主备不生效,mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读。

1
xbd:SECONDARY> db.getMongo().setSlaveOk();