MongoDB副本集的搭建和管理(高可用)

使得mongodb具备自动故障转移、高可用、读写分离。

副本集默认情况下读写都只是通过主库,副节点只是备份数据而已,但是可以设置副节点允许读操作,这样就可以做成读写分离。

使用pymongo的时候也可以设置,还可以动态设置库、集合的readPreference。详细的后面再写。。。

如果主节点不可用,副本集会选择一个辅助节点作为主节点并继续正常运行。旧的主节点在可用时会重新加入集合。

副本集搭建可以参考官方教程:

https://www.mongodb.com/docs/manual/administration/replica-set-deployment/

如果是需要将现有的mongodb实例转换为副本集,看这里:

https://www.mongodb.com/docs/manual/tutorial/convert-standalone-to-replica-set/#std-label-server-replica-set-deploy-convert

副本集中的节点角色可以有下面几种:

  1. 主节点
  2. 副节点
  3. 仲裁器节点(仲裁者参与选举,但不保存数据,即不提供数据冗余)
    1. 仲裁节点的使用场景:你有一个主、副节点,但是你的服务器又不够硬件支撑你再添加一个副节点(因为副节点也是池不少硬件的),此时你可以添加一个仲裁器。仲裁器参与主节点的选举,但仲裁器没有数据集的副本,因此无法成为主节点。

需要注意的是:

  1. 仲裁节点不要和主节点和副节点运行在统一个系统上!!!
  2. 仲裁器节点不要添加多个,容易出现数据一致性问题。降低写入时的可靠使用性。
  3. 副本集建议使用单数,3、5、7这样的.....

副本集的搭建至少要有3个节点,可以是:1主2从(官方推荐),或者:1主1从1仲裁

副本集搭建实例(1主2从)

  1. 创建3个实例的数据存储目录,因为我都放在同一台机器上了,所以要区分一下目录。生成环境不可能将成员实例都放在同一台机器上的。
mkdir data-master
mkdir data-slave01
mkdir data-slave02

  1. 修改3个实例的配置文件

    这里测试用,所以都放在同一台机器上了,注意修改端口为不一样的。

    主节点master:

# Where and how to store data.
storage:
  dbPath: D:\Program Files\MongoDB\Server\5.0\data
  journal:
    enabled: true

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path:  D:\Program Files\MongoDB\Server\5.0\log\mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1

# 副本集配置
replication:
  #副本集的名称  
  replSetName: "myrs"


**副节点1:**
# mongod-salve01.conf
storage:
  dbPath: D:\Program Files\MongoDB\Server\5.0\data-slave01
  journal:
    enabled: true
    
# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path:  D:\Program Files\MongoDB\Server\5.0\log\mongod-slave01.log

# network interfaces
net:
  port: 27018
  bindIp: 127.0.0.1

# 副本集配置
replication:
  # 副本集的名称 ,统一个副本集中的mongodb实例都要用同一个名称!!!
  replSetName: "myrs"


**副节点2:**
# mongod-salve02.conf
storage:
  dbPath: D:\Program Files\MongoDB\Server\5.0\data-slave02
  journal:
    enabled: true
    
# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path:  D:\Program Files\MongoDB\Server\5.0\log\mongod-slave02.log

# network interfaces
net:
  port: 27019
  bindIp: 127.0.0.1

# 副本集配置
replication:
  # 副本集的名称 ,统一个副本集中的mongodb实例都要用同一个名称!!!
  replSetName: "myrs"


  1. 启动3个实例
mongod.exe -f mongod.cfg
mongod.exe -f mongod-slave01.cfg
mongod.exe -f mongod-slave02.cfg

REM windows可以将其安装为服务,以服务的方式启动
mongod.exe -f mongod-slave01.cfg --install --serviceName MongoDB-slave01-27018
mongod.exe -f mongod-slave02.cfg --install --serviceName MongoDB-slave01-27019

  1. 初始化副本集

    需要先连接到你想要其成为主节点的实例上,然后执行rs.initiate({config配置})命令通过传递副本集配置参数来初始化。

    副本集的配置参数请参考:https://www.mongodb.com/docs/manual/reference/replica-configuration/

mongo.exe --port 27017

/*
// 生产环境,用hostname比较好。
rs.initiate( {
   _id : "rs0",
   members: [
      { _id: 0, host: "mongodb0.example.net:27017" },
      { _id: 1, host: "mongodb1.example.net:27017" },
      { _id: 2, host: "mongodb2.example.net:27017" }
   ]
})
*/

//这里因为式测试,所以就用ip地址了
rs.initiate({
   _id : "myrs", // 副本集的名称,这个在配置文件中指定了。
   members: [
      { _id: 0, host: "127.0.0.1:27017" },
      { _id: 1, host: "127.0.0.1:27018" },
      { _id: 2, host: "127.0.0.1:27018" }
   ]
})

// 第一次初始化后副本集后,一开始显示的还是PRIMARY节点(副节点),过一会再按回车后才会变成主节点
// 这是因为,初始化还未完成,需要稍等一会。
myrs:SECONDARY> 
myrs:PRIMARY>

副本集管理

https://www.mongodb.com/docs/manual/administration/replica-set-member-configuration/

https://www.mongodb.com/docs/manual/administration/replica-set-maintenance/

比较常用:

rs.help()     // 查看帮助信息
rs.isMaster()  // 查看当前节点是否为主节点等信息
rs.hello()   // 查看副本集信息
rs.status()  // 查看副本集状态
rs.conf()   // 返回当前副本集的配置文件


**rs.secondaryOk(true|false) //将所有的副节点设置是否允许读操作(在同一个副本集中的任意节点中都可以执行该命令)**

// https://www.mongodb.com/docs/manual/reference/method/rs.add/#mongodb-method-rs.add
rs.add()  // 将成员添加到副本集。使用该命令必须实在主节点上操作!
 
posted @ 2023-07-17 11:58  蕝戀  阅读(115)  评论(0编辑  收藏  举报