一.背景
由于不需要进行故障自动切换以及机器不足以组建集群,因此不采用mongodb官方推荐的副本集模式,采用旧版本(本次实验版本号是3.4.1)的主从复制模式(并没有功能上的bug,只是官方不建议使用,但是适用我们的场景)

二.主从同步搭建流程
1.首先准备两台服务器,分别安装好mongodb,这里249为主机,248为从机。(以下的用户名、密码、配置都是测试用的,没法直接拿来登录248 249数据库)

2.在主机上进行以下操作

1)进入admin库下,执行

use admin

2)创建一个用户,可以用来做数据同步的用户因此权限高一些,这里我们直接用root用户,执行

db.createUser( {user: "root",pwd: "root",roles: [ { role: "root", db: "admin" } ]})

3)修改配置文件

net:
    port: 27017
    bindIp: 0.0.0.0
security:
  keyFile: /data/configdb/keyfile   #keyfile相当于一把锁,248 249的keyfile文件内容一模一样,248的keyfile应该是从249scp过去的,
             #248 249相当于持有相同锁,一个用户用他的用户名密码可以打开249的锁,那么他一定可以打开248的锁,也就是249上账户在248上可以直接访问
             #如果没有keyfile这个文件的话可以自己生成,执行:openssl rand -base64 745 > keyfile
  clusterAuthMode: keyFile   #权限验证模式为keyfile模式
  authorization: enabled   #是否开启验证
  javascriptEnabled: true
 
storage:
  dbPath: /data/configdb/mongo-data
  journal:
    enabled: true  #这个可以避免写数据的过程突然宕机丢失太多数据

4)重启mongodb服务,指定249为master,执行:

mongod --master -f /data/configdb/mongo.conf

注:(这里–master为什么不写在配置文件中,就是因为官方文档的yaml里面没有看到关于master的配置,有一个snmp配置的master,但是这个和主从同步的master不是同一个概念,是用来做监控的,实验过没用,有兴趣可以自己再踩看看)
3.主机执行完之后,在从机执行以下操作

1)修改配置文件

bind_ip=0.0.0.0
autoresync=true   #如果发现主从不一致自动重新同步
slave=true  #标识这个机子为从机
source=xxx.xxx.xxx.249:27017 #配置从机的同步源为249
auth=true   #是否开启权限验证
keyFile=/data/configdb/keyfile
dbpath=/data/configdb/mongo-data/
logpath=/data/configdb/mongo-log/mongod.log
logappend = true
journal = true

2)重启mongodb服务:

mongod -f /data/configdb/mongo.conf

3)主从开始自动同步,等同步完之后进行数据校验。同步完成后,主机和从机数据大小可能不一致,猜测是数据结构被优化了,实际上数据是一致的,可以自己挑一个磁盘大小不一致的表验证一下。

三.注意事项
1.从机上不需要创建账户,如果自己创建了账户,在最后一步db.auth验证通过了,会误以为主从同步成功了。

2.keyfile生成之后要查看一下是否有读写权限,没有权限的话,执行chmod 600 keyfile修改一下文件权限。(这里不会报错,但是同步会失败所以要注意一下)

3.主从同步完之后,从机默认是没有读写操作权限的,如果需要进行读数据,在admin下执行rs.slaveOk()。

4.主从同步的历史数据是mongo自己帮我们做好的初始化同步的,不需要我们在从机上自己手动导入数据。

5.主机的–master必须要设置,不设置虽然主机和从机都能正常启动,但是从机没办法拿到主机的数据。

6.报错:
WiredTiger error (24) [1658152942:293075][53071:0x7f4c8c001700], log-server: /home/mongo/mongo-data/journal: directory-list: opendir: Too many open files

解决方法是:prlimit --pid 41814(这里修改成mongodb的进程号) --nofile=65535:65535
7.mongodb4.0后不再支持主从复制,本次实验是在3.4.1版本下完成的。