副本集架构
三个节点的副本集架构

主节点宕机,会变成

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

一主两备
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上
环境
| IP | 端口 | 角色 | 主机名 |
|---|
| 192.168.1.163 | 27017 | 主节点 | mongo01 |
| 192.168.1.126 | 27017 | 备节点 | mongo02 |
| 192.168.1.41 | 27017 | 备节点 | 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
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
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();
|