mongodb · 16 11 月, 2022 1

mongodb搭建副本集群(ReplicaSet)详细教程

部署副本集

这篇文章介绍如何搭建副本集群,帮助我们熟悉mongodb的副本集的搭建过程,能够在以后的工作中快速的搭建。

环境准备

在我测试的环境中,主要使用虚拟机来搭建多实例,具体环境如下:

  • mongodb 4.4.18
  • 三台虚拟机
    • 192.168.56.101 (fedora)
    • 192.168.56.102(centos)
    • 192.168.56.103(centos)

mongodb安装

mongodb的安装,可以使用压缩包或者通过rpm的方式安装,我这里主要介绍压缩包的状态方式

1.从官网下载tgz的压缩包

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.18.tgz

2.解压压缩包

tar -zxvf mongodb-linux-x86_64-rhel70-4.4.18.tgz

3.进入到mongodb的解压目录, 并创建config配置文件

cd mongodb-linux-x86_64-rhel70-4.4.18
touch mognod.cnf

4.填充配置文件

vi mongod.cnf


# 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/mongodb/mongod.log

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27017
 # bindIp: 0.0.0.0  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
  bindIpAll: true

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:

5. 启动Mongod实例

./bin/mongod -f mongod.cnf

搭建副本集群

以上配置在每个虚拟机上的配置基本保持一致,在三台机器上启动mongod实例完成后,就可以开始组件副本集群。

1.为每个实例配置副本集名称

replication:
    replSetName: "rs0"

该配置是放在mongod.cnf的配置文件中,这里需要注意,当处于同一个集群中的实例需要保持一致的名称。否则会报错。

在不同的副本集群中,最好设置不同的名称,否则在应用使用的时候也会出现错误。

2.重启mongod实例

./bin/mongod -f mongod.cnf

3. 初始化副本集群

./bin/mongo

rs.initiate({
  "_id": "rs0",
  "members": [
    { "_id": 0, "host": "192.168.56.101:27017" },
    { "_id": 1, "host": "192.168.56.102:27017" },
    { "_id": 2, "host": "192.168.56.103:27017" }
  ]
})

通过这种方式,就初始化完成了副本集群。这个时候可以通过rs.status()以及 rs.conf()命令的方式查看初始化情况。

当然,也可以通过命令行的方式启动Mongod的实例,例如:

mongod --replSet rs0 --port 27019 --bind_ip localhost,<hostname(s)|ip address(es)> --dbpath /srv/mongodb/rs0-2 --oplogSize 128

向集群中加入仲裁者

仲裁者其实也是一个Mongod的实例,只是并不会存储实际的数据和被选举成为primary, 只是参与投票。在加入仲裁者可以通过rs.addArb()的方式向副本集群加入仲裁者信息。

还是以上面已经有的集群为例,在已有的集群上,通过命令行的方式加入仲裁者节点。

1.请动仲裁者节点

仲裁者节点的启动和一般节点的启动并没有区别,则可以通过创建仲裁者的数据存放目录/var/lib/mongodb/arb,命令如下:

mkdir -p /var/lib/mongodb/arb
./bin/mongod --port 27018 --dbpath /var/lib/mongodb/arb --replSet rs0 --bind_ip 0.0.0.0

2.在节点启动完成后,将当前实例添加为仲裁者

rs.addArb("192.168.56.103:27018")

当配置没有问题时,此时在primary节点上执行以上命令,将返回添加成功的信息

{
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp(1, 1668588199),
    signature: {
      hash: Binary(Buffer.from("0000000000000000000000000000000000000000", "hex"), 0),
      keyId: 0
    }
  },
  operationTime: Timestamp(1, 1668588199)
}
  1. 我们也可以通过rs.conf()或者rs.status()查看具体的情况

这里需要注意一点,通过手工的方式加入仲裁者节点时,如果节点配置有误,或者其他原因并不会报错,这时可以通过rs.status()查看错误新并加以改正

将独立运行的实例加入到集群

如果mongod实例最开始以独立的模式运行时,此时需要将该实例加入到集群中,主要有需要设置一下步骤:

  1. 为实例指定replSetName设置集群的名称可以通过命令行--replSet或者配置文件replication.replSetName进行配置,并且需要和已有的集群名称保持一致。
  2. 通过rs.add()方法向集群中添加实例
rs.add( { host: "mongodb3.example.net:27017", priority: 0, votes: 0 } )

移除节点

当某些节点因为一些原因需要从副本集中移除时,主要有两种方式可以实现,

  • 通过rs.reconfig()的方式重新配置副本集
  • 通过rs.remove()的方式移除某个具体的节点,节点移除时需要指定域名和端口,例如rs.remove("192.168.56.102:27017")

问题列表

  1. 在集群初始化完成后,在secondary上执行查询出现not master and slaveOk=false的提示当初始化完成副本集之后,只能在primary上执行读写操作,所有的secondary是不支持读操作的,此时需要在每个secondary节点上执行:
    rs.secondaryOk()

    通过以上命令,再次在secondary上执行查询操作,将不会报错。