Mongodb 配置复制集,并启用安全校验

    Mongodb 在正式使用时为了实现高可用,最简单的办法就是配置复制集,当主节点发生故障时,能够自动切换节点,从而尽可能的减少应用的故障时间。典型的复制集架构由 3 个或以上具有投票权的节点组成,包括:
・一个主节点(PRIMARY):接受写入操作和投票选举;
・两个(或多个)从节点(SECONDARY):复制主节点上的数据和投票选举;
当一个修改操作到达主节点时,它对数据的操作被记录为 oplog ,从节点根据 oplog 更新自身的数据。
    接下来介绍下如何搭建一个最基本的复制集,一个主节点和两个从节点,为了方便,在一台机器上根据端口号区分不同的 mongodb 服务,在正式使用时,尽量在不同的服务器上部署,避免机器出现问题,导致全部节点失效。mongodb 的安装可以参考我的博文,传送门。下面的操作在 Centos7 中完成。

1. 建立数据存储目录#

/var 目录中创建 mongodb 文件夹,mongodb 目录下创建 db_28017, db_28018, db_28019 分别存储三个节点的配置文件,日志文件和数据文件等。

$ mkdir -p /var/mongodb/db_{28017,28018,28019}

在三个节点的目录下创建配置文件,日志文件和数据文件夹

$ cd /var/mongodb/db_28017/ && mkdir data && touch mongod.log mongod.conf
$ cd /var/mongodb/db_28018/ && mkdir data && touch mongod.log mongod.conf
$ cd /var/mongodb/db_28019/ && mkdir data && touch mongod.log mongod.conf

2. 编辑配置文件#

配置文件示例:

# 系统日志配置
systemLog:
  destination: file
  logAppend: true
  path: /var/mongodb/db_*/mongod.log

# 存储数据的配置
storage:
  dbPath: /var/mongodb/db_*/data
  journal:
    enabled: true

#进程运行配置
processManagement:
  fork: true 
  pidFilePath: /var/mongodb/db_*/mongod.pid  
  timeZoneInfo: /usr/share/zoneinfo

# 网络配置
net:
  port: 28017
  bindIp: 127.0.0.1 

#复制集名称
replication:
  replSetName: rs0

编辑三个节点的配置文件,修改上方包含 path 的配置项到正确的目录,以及端口号。

3. 启动节点#

由于是在同一个机器上运行,所以我们需要指定配置文件启动 mongo 服务

# 启动服务
$ mongod -f  /var/mongodb/db_28017/mongod.conf
$ mongod -f  /var/mongodb/db_28018/mongod.conf
$ mongod -f  /var/mongodb/db_28019/mongod.conf

Mongodb 配置复制集,并启用安全校验

4. 配置节点#

这里以端口号为 28017 的 mongo 为主节点,进入 mongo cli

# 连接 mongo 服务
$ mongo --port 28017

Mongodb 配置复制集,并启用安全校验
查看状态
Mongodb 配置复制集,并启用安全校验
添加从节点
Mongodb 配置复制集,并启用安全校验

5. 配置安全校验#

mongo 默认不启用安全校验,任何人在服务器上可以进行任何操作,这是非常危险的,由于这种机制,发生了很多的数据泄露的事故。因此,安全校验是必不可少的,我们仅仅设置最简单的用户名和密码就可以避免掉大多数的攻击。在复制集中,只设置用户名和密码会导致从节点和主节点连接失败,最简单的方式就是创建一个 keyFile,就可以解决问题。

# 在 /var/mongodb 目录下创建keyFile,由于 mongo 对 keyFile 的内容有要求,这里我们使用 openssl 创建 base64 编码的字符
$ openssl rand -base64 745 > /var/mongodb/keyFile
# 权限修改为600
$ chmod 600  /var/mongodb/keyFile

在三个节点的配置文件中追加配置内容

security:
  keyFile: /var/mongodb/keyFile

在配置 keyFile 后需要创建管理员用户,我们在主节点中进行配置。
root 角色为 mongo 中的超级管理员角色
Mongodb 配置复制集,并启用安全校验
配置后,重新进入 mongo cli
Mongodb 配置复制集,并启用安全校验
不使用用户名和密码可以连接到 mongo,但是不能进行任何的操作,使用 auth 可以进行验证,验证通过后,可以正常操作。
Mongodb 配置复制集,并启用安全校验

6. 开启从节点读#

从节点在配置完成后,主节点的数据变化后,从节点还不能读取到变化。
在主节点插入一条数据
Mongodb 配置复制集,并启用安全校验
在从节点读取数据,会发生错误,没有读取的权限
Mongodb 配置复制集,并启用安全校验
开启读权限 rs.slaveOk(), 读取正常
Mongodb 配置复制集,并启用安全校验
End!

本作品采用《CC 协议》,转载必须注明作者和本文链接
Hesunfly