前言

对于互联网应用来说,我们要尽量保证服务的不可间断性,一旦出现故障需要尽快的恢复。MongoDB 的副本集模式主要解决了在其主从模式下故障无法自动转移的情况,自动实现高可用。
三个成员副本集提供足够的冗余性,以承受大多数网络分区和其他系统故障,这些集合对于许多分布式读取操作也具有足够的容量。
本文档介绍如何从三个现有 mongod 实例创建三成员副本集。

原理图

P-S-S

Primary with Two Secondary Members 是具有三个存储数据的成员的副本集部署模式,它包含:

  • 一个主节点 primary
  • 两个副节点 secondary (每个副节点都可以被选举为主节点)

MongoDB副本集搭建 - 图1

除 primary 成员外,P-S-S 部署始终提供数据集的两个完整副本。这些副本集提供了额外的容错能力和高可用性。 如果主服务器不可用,则副本集将 secondary 成员选为 primary 并继续正常操作。原本的 primary 在可用时会重新加入副本集。
MongoDB副本集搭建 - 图2

环境准备

安装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 |
  • 创建相关目录
    1. ## 日志文件
    2. mkdir -p /var/log/rs0-0/mongodb/ /var/log/rs0-1/mongodb/ /var/log/rs0-2/mongodb/
    3. ## 数据文件
    4. mkdir -p /var/lib/rs0-0/mongo/ /var/lib/rs0-1/mongo/ /var/lib/rs0-2/mongo/
    5. ## 配置文件
    6. mkdir -p /etc/mongodb/conf/

    配置文件:mongod-rs0-0.conf

    ```bash

    mongod.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:

  1. <a name="ruOoz"></a>
  2. ## 复制 mongod-rs0-0.conf
  3. ```bash
  4. cd /etc/mongodb/conf
  5. ## 第2个节点
  6. cp mongod-rs0-0.conf mongod-rs0-1.conf
  7. ## 第3个节点
  8. cp mongod-rs0-0.conf mongod-rs0-2.conf
  9. vim mongod-rs0-1.conf
  10. ## 修改以下配置节点
  11. path
  12. dbPath
  13. pidFilePath
  14. port

通过配置文件启动实例

  1. mongod -f /etc/mongodb/conf/mongod-rs0-0.conf

进入实例

  1. # 进入我们上边配置的第1个节点
  2. mongo --port 27020

配置账号

  1. ## 超级账户
  2. db.createUser({"user":"root","pwd":"password","roles":["root"]});
  3. ## 管理员账户
  4. db.createUser({user:"admin", pwd:"password",roles:[{role:"userAdminAnyDatabase",db:"admin"}]});
  5. ## 读写账户
  6. db.createUser({user:"wlcrm_rw", pwd:"password",roles:[{role:"readWrite",db:"wlcrm"}]});

创建 KeyFile

  1. openssl rand -base64 512 > mongodb.key
  2. chmod 400 mongodb.key
  3. ## 移动到我们配置文件中写的心跳文件
  4. mv mongodb.key /var/run/mongodb/

验证账号

  1. # 返回1,则验证通过
  2. db.auth('root', 'password');
  3. db.auth('admin', 'password');
  4. db.auth('wlcrm_rw', 'password');

初始化副本集

  1. rs.initiate({
  2. _id: "rs0",
  3. members: [
  4. {
  5. _id: 0,
  6. host:'192.168.2.110:27020',
  7. priority:1
  8. },
  9. {
  10. _id: 1,
  11. host:'192.168.2.110:27021',
  12. priority:2
  13. },
  14. {
  15. _id: 2,
  16. host:'192.168.2.110:27022',
  17. priority:3
  18. }
  19. ]
  20. });

查看成员与状态

  1. rs.config();
  2. rs.status();

带验证启动mongo

  1. ps -ef | grep 'mongo'
  2. ## 不要用kill -9 会损坏数据文件
  3. kill 进程号
  4. mongod -f /etc/mongodb/conf/mongod-rs0-0.conf --auth
  5. mongod -f /etc/mongodb/conf/mongod-rs0-1.conf --auth
  6. mongod -f /etc/mongodb/conf/mongod-rs0-2.conf --auth

登陆mongo查看

  1. ## 根据配置的优先级,应该该节点是 PRIMARY
  2. mongo -u root --port 27022 -p

其他

  1. "priority": 优先级,默认为 1 ,优先级 0 为被动节点,不能成为活跃节点。优先级不为 0 则按照由大到小选出活跃节点。
  2. "arbiterOnly": 仲裁节点,只参与投票,不接收数据,也不能成为活跃节点。如果节点变为主库,则 mongo shell 会变成 myReplSet:PRIMARY>
  3. "votes": 无表决权时优先级
  4. # 删除节点
  5. rs.remove('192.168.2.110:27024')
  6. # 修改配置
  7. cfg = rs.conf()
  8. # 把第1个节点的 priority 修改为 1
  9. cfg.members[0].priority = 1
  10. # 把第1个节点的 votes 修改为 1
  11. cfg.members[0].votes = 1
  12. # 刷新配置
  13. rs.reconfig(cfg)