
5.5 搭建副本集
本节将介绍如何在本机安装MongoDB副本集,真实的项目环境中可以采用多机部署,但具体步骤是类似的。
5.5.1 安装副本集
假设读者已经完成了MongoDB单节点的安装,并且环境变量path中已经包含了MongoDB执行程序的配置。接下来我们需要为副本集定义一个名称,例如myReplSet。
1.准备安装目录

2.配置文件
执行cd/opt/work/mongoReplSet/进入安装目录。编辑配置文件mongo.conf,内容如下:

上述配置仅包含一些公共的配置,由于每个副本集成员会使用不同的端口、数据目录,我们将在命令行中进行指定。
3.创建keyfile


mongo.key采用随机算法生成,用作节点内部通信的密钥文件。
4.启动副本集成员
执行mongod程序,启动3个副本集成员,代码如下:

除了keyFile、config文件,我们还指定了几个参数,分别如下。
● --port:数据库的监听端口。
● --dbpath:数据的存储目录。
● --logpath:数据库进程的日志文件路径。
执行命令之后,可以看到启动成功的输出日志:

通过netstat命令同样可以看到启动的几个端口,输出如下:

5.初始化配置
连接其中一个成员节点,并执行初始化命令,代码如下:


此处,cfg._id表示的是副本集的名称(myReplSet),该值必须和副本集成员启动时指定的--replSet参数保持一致。members则表示当前副本集的成员列表,包括每个成员的主机IP、端口号。
使用rs.initiate命令执行副本集的初始化,当前成员会自动向其他成员同步该配置,之后这些成员在内部完成选举。
6.查看状态
执行db.isMaster命令,用于查看副本集的其他节点,代码如下:

从输出上看,当前节点已经成为主节点("ismaster":true),而hosts字段也展示了整个副本集的所有成员。
5.5.2 创建用户
由于使用了--keyFile作为成员节点的启动参数,此时MongoDB会启用鉴权(相当于--auth),因此在操作数据之前需要创建用户,代码如下:

在开启鉴权的情况下,MongoDB允许创建首个用户。一旦数据库中存在用户,所有的操作就必须经过鉴权了。
副本集之间的用户数据会自动进行同步,因此可以使用同一个用户在任一成员节点登录。
5.5.3 写入数据
登录主节点,向test集合写入一条数据,代码如下:

登录某个备节点,查看test集合,可发现新增的数据已经同步,如下:


5.5.4 主备节点切换
接下来,验证副本集的主备节点切换功能,登录主节点并执行stepDown命令,代码如下:

如果执行成功,则当前节点将会降备,并开启新一轮的选举。通过多次执行isMaster命令可以确认最后的选举结果,代码如下:

从结果中可以看出,在主备节点切换之后,127.0.0.1:27002成为新的主节点。