- 前言
- 原理图
- 环境准备
- mongod.conf
- for documentation of all options, see:
- http://docs.mongodb.org/manual/reference/configuration-options/">http://docs.mongodb.org/manual/reference/configuration-options/
- where to write logging data.
- Where and how to store data.
- engine:
- wiredTiger:
- how the process runs
- network interfaces
- operationProfiling:
- replication:
- sharding:
- auditLog:
- snmp:
- 通过配置文件启动实例
- 进入实例
- 配置账号
- 创建 KeyFile
- 验证账号
- 初始化副本集
- 查看成员与状态
- 带验证启动mongo
- 登陆mongo查看
- 其他
前言
对于互联网应用来说,我们要尽量保证服务的不可间断性,一旦出现故障需要尽快的恢复。MongoDB 的副本集模式主要解决了在其主从模式下故障无法自动转移的情况,自动实现高可用。
三个成员副本集提供足够的冗余性,以承受大多数网络分区和其他系统故障,这些集合对于许多分布式读取操作也具有足够的容量。
本文档介绍如何从三个现有 mongod 实例创建三成员副本集。
原理图
P-S-S
Primary with Two Secondary Members 是具有三个存储数据的成员的副本集部署模式,它包含:
- 一个主节点 primary
- 两个副节点 secondary (每个副节点都可以被选举为主节点)
除 primary 成员外,P-S-S 部署始终提供数据集的两个完整副本。这些副本集提供了额外的容错能力和高可用性。 如果主服务器不可用,则副本集将 secondary 成员选为 primary 并继续正常操作。原本的 primary 在可用时会重新加入副本集。
环境准备
安装mongodb 4.4 (省略)
- 节点规划 | Replica Set Member | Hostname | | :—- | :—- | | rs0-0 | 192.168.2.110:27020 | | rs0-1 | 192.168.2.110:27021 | | rs0-2 | 192.168.2.110:27022 |
- 创建相关目录
## 日志文件
mkdir -p /var/log/rs0-0/mongodb/ /var/log/rs0-1/mongodb/ /var/log/rs0-2/mongodb/
## 数据文件
mkdir -p /var/lib/rs0-0/mongo/ /var/lib/rs0-1/mongo/ /var/lib/rs0-2/mongo/
## 配置文件
mkdir -p /etc/mongodb/conf/
配置文件:mongod-rs0-0.conf
```bashmongod.conf
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/rs0-0/mongodb/mongod.log
Where and how to store data.
storage: dbPath: /var/lib/rs0-0/mongo journal: enabled: true
engine:
wiredTiger:
how the process runs
processManagement: fork: true # fork and run in background pidFilePath: /var/run/mongodb/rs0-0/mongod.pid # location of pidfile timeZoneInfo: /usr/share/zoneinfo
network interfaces
net: port: 27020 bindIp: 127.0.0.1,192.168.2.110 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
security: keyFile: /var/run/mongodb/mongodb.key authorization: enabled
operationProfiling:
replication:
replication: replSetName: rs0 oplogSizeMB: 128
sharding:
Enterprise-Only Options
auditLog:
snmp:
<a name="ruOoz"></a>
## 复制 mongod-rs0-0.conf
```bash
cd /etc/mongodb/conf
## 第2个节点
cp mongod-rs0-0.conf mongod-rs0-1.conf
## 第3个节点
cp mongod-rs0-0.conf mongod-rs0-2.conf
vim mongod-rs0-1.conf
## 修改以下配置节点
path
dbPath
pidFilePath
port
通过配置文件启动实例
mongod -f /etc/mongodb/conf/mongod-rs0-0.conf
进入实例
# 进入我们上边配置的第1个节点
mongo --port 27020
配置账号
## 超级账户
db.createUser({"user":"root","pwd":"password","roles":["root"]});
## 管理员账户
db.createUser({user:"admin", pwd:"password",roles:[{role:"userAdminAnyDatabase",db:"admin"}]});
## 读写账户
db.createUser({user:"wlcrm_rw", pwd:"password",roles:[{role:"readWrite",db:"wlcrm"}]});
创建 KeyFile
openssl rand -base64 512 > mongodb.key
chmod 400 mongodb.key
## 移动到我们配置文件中写的心跳文件
mv mongodb.key /var/run/mongodb/
验证账号
# 返回1,则验证通过
db.auth('root', 'password');
db.auth('admin', 'password');
db.auth('wlcrm_rw', 'password');
初始化副本集
rs.initiate({
_id: "rs0",
members: [
{
_id: 0,
host:'192.168.2.110:27020',
priority:1
},
{
_id: 1,
host:'192.168.2.110:27021',
priority:2
},
{
_id: 2,
host:'192.168.2.110:27022',
priority:3
}
]
});
查看成员与状态
rs.config();
rs.status();
带验证启动mongo
ps -ef | grep 'mongo'
## 不要用kill -9 会损坏数据文件
kill 进程号
mongod -f /etc/mongodb/conf/mongod-rs0-0.conf --auth
mongod -f /etc/mongodb/conf/mongod-rs0-1.conf --auth
mongod -f /etc/mongodb/conf/mongod-rs0-2.conf --auth
登陆mongo查看
## 根据配置的优先级,应该该节点是 PRIMARY
mongo -u root --port 27022 -p
其他
"priority": 优先级,默认为 1 ,优先级 0 为被动节点,不能成为活跃节点。优先级不为 0 则按照由大到小选出活跃节点。
"arbiterOnly": 仲裁节点,只参与投票,不接收数据,也不能成为活跃节点。如果节点变为主库,则 mongo shell 会变成 myReplSet:PRIMARY>
"votes": 无表决权时优先级
# 删除节点
rs.remove('192.168.2.110:27024')
# 修改配置
cfg = rs.conf()
# 把第1个节点的 priority 修改为 1
cfg.members[0].priority = 1
# 把第1个节点的 votes 修改为 1
cfg.members[0].votes = 1
# 刷新配置
rs.reconfig(cfg)