![MongoDB进阶与实战:微服务整合、性能优化、架构管理](https://wfqqreader-1252317822.image.myqcloud.com/cover/697/38209697/b_38209697.jpg)
5.5 搭建副本集
本节将介绍如何在本机安装MongoDB副本集,真实的项目环境中可以采用多机部署,但具体步骤是类似的。
5.5.1 安装副本集
假设读者已经完成了MongoDB单节点的安装,并且环境变量path中已经包含了MongoDB执行程序的配置。接下来我们需要为副本集定义一个名称,例如myReplSet。
1.准备安装目录
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_104_1.jpg?sign=1738887177-fidsi4ol5MSYEIK7d8Ock8Sv3qFppYTv-0-a9911be3a3d4e327dfcb3cba2d43ab13)
2.配置文件
执行cd/opt/work/mongoReplSet/进入安装目录。编辑配置文件mongo.conf,内容如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_104_2.jpg?sign=1738887177-7XYXfc5sKqKF8400ZiIUftNkE7OEVkNP-0-4b3d26ddb5b9d9508c024ef6fc642b13)
上述配置仅包含一些公共的配置,由于每个副本集成员会使用不同的端口、数据目录,我们将在命令行中进行指定。
3.创建keyfile
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_104_3.jpg?sign=1738887177-P2HnshmLpfpVJ0Q4mKjht82rN2PZStU0-0-3226e57ff1ce84e7298868ed26d42c93)
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_105_1.jpg?sign=1738887177-eiDc6HVLGteOR89Vp0vAOc66g99A24cF-0-7d31963cf0ebedb5781e9b97d5c44285)
mongo.key采用随机算法生成,用作节点内部通信的密钥文件。
4.启动副本集成员
执行mongod程序,启动3个副本集成员,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_105_2.jpg?sign=1738887177-31mqP4yYYYVxoSZBr9Yv5FRvGBfeM0zr-0-c77ee65ac66600a1bca0e361b706fe83)
除了keyFile、config文件,我们还指定了几个参数,分别如下。
● --port:数据库的监听端口。
● --dbpath:数据的存储目录。
● --logpath:数据库进程的日志文件路径。
执行命令之后,可以看到启动成功的输出日志:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_105_3.jpg?sign=1738887177-cYjthiE57oNSIBHlmXhdAQzjTPUdkiEB-0-b943b3927a6cea93894693e48c08157f)
通过netstat命令同样可以看到启动的几个端口,输出如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_105_4.jpg?sign=1738887177-MaI67zMmLUoMDdVq5EpXHpfbmxtXfDZa-0-84fa021a6125f2ec45fb546295fc09d9)
5.初始化配置
连接其中一个成员节点,并执行初始化命令,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_105_5.jpg?sign=1738887177-es6or60aS2v01PrzMRk31MFZXeGw0kdn-0-a8e843f23cf7f7e75aa960be45b18a4f)
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_106_1.jpg?sign=1738887177-7dsBGxjFP3rYanHEyeh7sRK2tCfO6vrK-0-b44961f7d80e636b59a3808bf6720b59)
此处,cfg._id表示的是副本集的名称(myReplSet),该值必须和副本集成员启动时指定的--replSet参数保持一致。members则表示当前副本集的成员列表,包括每个成员的主机IP、端口号。
使用rs.initiate命令执行副本集的初始化,当前成员会自动向其他成员同步该配置,之后这些成员在内部完成选举。
6.查看状态
执行db.isMaster命令,用于查看副本集的其他节点,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_106_2.jpg?sign=1738887177-fD3rMyEWx3JBuidRqwBXRotEMlIhzy6p-0-552159f817769748af2d120f624781b9)
从输出上看,当前节点已经成为主节点("ismaster":true),而hosts字段也展示了整个副本集的所有成员。
5.5.2 创建用户
由于使用了--keyFile作为成员节点的启动参数,此时MongoDB会启用鉴权(相当于--auth),因此在操作数据之前需要创建用户,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_107_1.jpg?sign=1738887177-fXo0jZxrNVheQw0JmPTj9OUBq9CvYeHp-0-b199403320c67a7b0687f493981849af)
在开启鉴权的情况下,MongoDB允许创建首个用户。一旦数据库中存在用户,所有的操作就必须经过鉴权了。
副本集之间的用户数据会自动进行同步,因此可以使用同一个用户在任一成员节点登录。
5.5.3 写入数据
登录主节点,向test集合写入一条数据,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_107_2.jpg?sign=1738887177-t2cYMSVKBeN5XufRhUL90SlucOBqG5Gj-0-be27caccfc422f4c33e79a046d4d6bda)
登录某个备节点,查看test集合,可发现新增的数据已经同步,如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_107_3.jpg?sign=1738887177-AjeOrtampH8xxa7bG7b0NKmFy6SdyBNE-0-70753172af1200cdc49b6b0dbc344edb)
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_108_1.jpg?sign=1738887177-6ZgGaeyb8r7kwyaa7eXRTgfmrd19fdY3-0-9ba4c456f86e8ce7de5567a146ac80b3)
5.5.4 主备节点切换
接下来,验证副本集的主备节点切换功能,登录主节点并执行stepDown命令,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_108_2.jpg?sign=1738887177-VZDZolNxdYAgH9trektWVDoUP61X9rdH-0-0f0a522b9b59cec78d3c899fa2a9a0f0)
如果执行成功,则当前节点将会降备,并开启新一轮的选举。通过多次执行isMaster命令可以确认最后的选举结果,代码如下:
![](https://epubservercos.yuewen.com/6F449D/20118171608699906/epubprivate/OEBPS/Images/40827_108_3.jpg?sign=1738887177-urgKSLz7jZYUnfW7vQOM9PXXgPx9Ywz2-0-c843bea41d8adf6e4893c55c525c8e67)
从结果中可以看出,在主备节点切换之后,127.0.0.1:27002成为新的主节点。