MongoDB副本集搭建
MongoDB副本集搭建
概述
本文参照 MongoDB 官方文档(https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/#std-label-server-replica-set-deploy)进行实践
基于单机环境,启动3个mongod
进程模拟搭建mongo副本集(replica set)
实践环境
使用单台机器启动多个
mongod
进程模拟集群
操作系统(OS):
1 | $ cat /etc/redhat-release |
使用Docker构建Mongo环境
Docker版本:
1 | $ docker --version |
Mongo镜像版本:
1 | $ docker images | grep mongo |
CentOS7安装Docker教程:https://cloud.tencent.com/developer/article/1701451
一些建议
Hostnames
官方建议使用 DNS 代替直接使用 IP 地址来配置节点信息
在 MongoDB 5.0开始,如果节点只配置一个 IP 地址则启动时就会校验并且无法启动
前置配置
配置域名映射
分别为3个mongod
进程的hostname配置域名映射
1 | $ vim /etc/hosts |
追加以下域名配置
1 | 127.0.0.1 mongodb0.example.net |
创建目录与文件
创建数据目录
1 | $ mkdir /data/mongod0 /data/mongod1 /data/mongod2 |
创建配置文件
样例配置文件
取自镜像中的配置模板文件/etc/mongod.conf.orig
1 | # mongod.conf |
根据模板配置文件,修改storage.dbpath
、systemLog.path
、net.port
,分别给三个不同的mongod
实例使用,例如:
1 | $ ls -lh /etc/mongod |
步骤
依次启动mongod进程
1 | # 使用--config或-f参数指定配置文件 |
1 | $ ps -ef | grep mongod |
成功启动三个mongod
进程
连接其中一个mongod实例
Connect mongosh to one of the mongod instances.
官网使用mongosh
的命令行工具进行连接,这里直接使用mongo
的二进制工具,注意指定连接主机和端口,默认使用27017
尝试使用mongo
命令连接mongod0
实例
1 | $ mongo --host mongodb0.example.net --port 17000 |
连接成功
初始化副本集
Initiate the replica set.
只需要在其中一个节点执行rs.initiate()
1 | > rs.initiate({"_id": "rs-example-0", "members": [{"_id": 0, "host": "mongodb0.example.net:17000"}]}) |
以上步骤中,将mongod0
实例加入到名为rs-example-0
的副本集中,成功后观察到命令行提示符显示角色为 OTHER ,再次回车后则变为 PRIMARY
再使用rs.add()
命令依次添加已有节点加入副本集
1 | rs-example-0:PRIMARY> rs.add({"_id": 1, "host": "mongodb1.example.net:17001"}) |
也可以用rs.initiate()
传入所有节点信息直接完成初始化
常见问题
空参调用rs.initiate()
报错,hostname
配置错误
1 | > rs.initiate() |
解析:当空参调用时,mongodb使用本机的hostname
作为默认的配置,如果hostname
无法作为DNS解析的话,那么就会报找不到对应的主机
查询本机hostname
配置
1 | # 当前配置 |
再次执行rs.initiate()
1 | > rs.initiate() |
缺少members
参数
1 | > rs.initiate({_id: "rs"}) |
添加members
参数即可
_id
与配置文件中的副本集名称不一致
1 | > rs.initiate({_id: "rs", "members": []}) |
副本集节点数不足
1 | > rs.initiate({"_id": "rs-example-0", "members": []}) |
副本集要求至少1个节点,至多50个节点
查看副本集配置
View the replica set configuration.
使用rs.conf()
可以查看当前节点所在副本集的配置信息
点我展开
1 | rs-example-0:PRIMARY> rs.conf() |
查看副本集状态
使用rs.status()
可以查看当前副本集状态
点我展开
1 | rs-example-0:SECONDARY> rs.status() |
关闭mongod进程
mongo命令
使用mongo
命令连接到mongod
后,使用
1 | # 切换到admin库 |
需要先切换到admin
库
执行完毕后mongo
命令会自动断开与mongod
的连接
会有以下日志报错
点击展开
1 | 2023-12-23T14:53:57.358+0000 I NETWORK [js] DBClientConnection failed to receive message from mongodb2.example.net:17002 - HostUnreachable: Connection closed by peer |
mongod命令
直接使用mongod
命令
1 | $ mongod -f [config] --shutdown |
需要指定-f
或--config
参数指定配置文件(-f
和--config
等效)
或者--dbpath
指定数据库文件路径(其实-f
/--config
也是通过读取dbpath
的参数获取了数据库文件路径)
本质上原理是相同的,都是通过dbpath
下面的mongod.lock
文件获取实例进程发送信号退出进程
1 | $ cat /data/mongod0/mongod.lock |