MongoDB副本集

2022-05-07 19:16:41 浏览数 (1)

一、副本集(Replication Set)

  复本集解决的问题的:

  1. 数据高可用,当主节点宕机,从节点可以马上顶上去,但是只是解决宕机问题,如果被黑了,或者数据被误删除了,从节点的数据依然也是被删除,这一点上是不可以保证数据的安全的
  2. 副本集可以解决mongodb的事务问题。

  MongoDB的副本集至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据,建议提供仲裁节点,侧节点不存储数据,作用是当主节点出现故障时,选举出某个备用节点成为主节点,保证MongoDB的正常服务。客户端只需要访问主节点或者从节点,不需要访问仲裁节点。

  MongoDB各个节点常见的搭配方式为:一主一从一仲裁,一主多从一仲裁,一主多从多仲裁。

  主节点记录在其上的所有操作oplog(操作日志),从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点与主节点一致。

二、副本集实现思路

  无论是主节点还是从节点,都是独立的mongo进程,可以放在不同的服务器上,也可以放在同一个服务器上,使用不同的端口号区分,即伪复本集,可以解决mongodb的事务问题

  主节点和从节点,最好都配置开机自动启动,详细请见《Centos8上安装MongoDB4.X》

  主从节点的配置文件要配置同样的复本集名字

三、副本集配置举例

  在服务器启动四个mongodb集成,模拟四个不同的服务器的mongo,使用不同的端口号区分

  1. primary: 192.xx.xx.xx:2727 (主节点)
  2. secondary1:192.xx.xx.xx:27278 (从节点1 或者 副本集1)
  3. secondary2:192.xx.xx.xx:27279  (从节点2 或者 副本集2)
  4. arbiter:192.xx.xx.xx:27280 (仲裁节点,只参与主从节点切换的选举,不保存数据)

  需要为这四个节点,都单独配置data路径,log路径,pid文件路径,conf文件,已经副本之间的验证文件mongo.keyfile

四、配置data路径

代码语言:javascript复制
[root@VM-16-13-centos mongodb4]# pwd
/opt/mongodb4
[root@VM-16-13-centos mongodb4]# ls
bin  conf  data  LICENSE-Community.txt  logs  mongo.keyfile  MPL-2  pids  README  THIRD-PARTY-NOTICES  THIRD-PARTY-NOTICES.gotools
[root@VM-16-13-centos mongodb4]# cd data
[root@VM-16-13-centos data]# ls
db  rs
[root@VM-16-13-centos data]# cd rs
[root@VM-16-13-centos rs]# ls
arbiter  primary  secondary1  secondary2
[root@VM-16-13-centos rs]#

五、配置log日志

代码语言:javascript复制
[root@VM-16-13-centos mongodb4]# pwd
/opt/mongodb4
[root@VM-16-13-centos mongodb4]# ls
bin  conf  data  LICENSE-Community.txt  logs  mongo.keyfile  MPL-2  pids  README  THIRD-PARTY-NOTICES  THIRD-PARTY-NOTICES.gotools
[root@VM-16-13-centos mongodb4]# cd logs
[root@VM-16-13-centos logs]# ls
mongodb.log  rs
[root@VM-16-13-centos logs]# cd rs
[root@VM-16-13-centos rs]# ls
arbiter.log  primary.log  secondary1.log  secondary2.log  secondary.log

六、生产mongo.keyfile

代码语言:javascript复制
[root@VM-16-13-centos mongodb4]# openssl rand -base64 90 > ./mongo.keyfile

七、配置pids文件路径

只需要创建到rs文件即可,里面具体的pid文件会在运行的时候自动创建。

代码语言:javascript复制
[root@VM-16-13-centos mongodb4]# pwd
/opt/mongodb4
[root@VM-16-13-centos mongodb4]# ls
bin  conf  data  LICENSE-Community.txt  logs  mongo.keyfile  MPL-2  pids  README  THIRD-PARTY-NOTICES  THIRD-PARTY-NOTICES.gotools
[root@VM-16-13-centos mongodb4]# cd pids
[root@VM-16-13-centos pids]# ls
rs
[root@VM-16-13-centos pids]# cd rs
[root@VM-16-13-centos rs]# ls
arbiter.pid  primary.pid  secondary1.pid  secondarys.pid

八、配置conf文件

代码语言:javascript复制
[root@VM-16-13-centos mongodb4]# pwd
/opt/mongodb4
[root@VM-16-13-centos mongodb4]# ls
bin  conf  data  LICENSE-Community.txt  logs  mongo.keyfile  MPL-2  pids  README  THIRD-PARTY-NOTICES  THIRD-PARTY-NOTICES.gotools
[root@VM-16-13-centos mongodb4]# cd conf
[root@VM-16-13-centos conf]# ls
mongodb.conf  rs
[root@VM-16-13-centos conf]# cd rs
[root@VM-16-13-centos rs]# ls
arbiter.conf  primary.conf  secondary1.conf  secondary2.conf

primary.conf配置内容,secondary1.conf,secondary2.conf 以及 arbiter.conf 雷同,只需修改其中部分配置的路径

代码语言:javascript复制
port=27277 #端口 默认端口是27017,但是mongodb特别容易被攻击,所以这里不建议使用默认端口
dbpath= /opt/mongodb4/data/rs/primary #数据库存文件存放目录,副本集中的主数据库
logpath= /opt/mongodb4/logs/rs/primary.log #日志文件存放路径
logappend=true #使用追加的方式写日志
fork=true #以守护进程的方式运行,创建服务器进程
maxConns=100 #最大同时连接数
auth=true #不启用验证,先不开启,配完用户在更改开启
journal=true #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
#即使宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,然后重放后续的journal日志来恢复。
storageEngine=wiredTiger #存储引擎有mmapv1、wiretiger、mongorocks
bind_ip = 0.0.0.0 #0.0.0.0代表任何IP地址,如果写127.0.0.1那就只能本机访问,其他同理
replSet=rs # 设置副本集的名称,这里主节点的名称和从节点的名称一定要一致 (副本集需要的)
pidfilepath=/opt/mongodb4/pids/rs/primary.pid # 这里的pid mongo会自己创建 (副本集需要的)
oplogSize=1024 # 日志的大小,单位是M (副本集需要的)
keyFile=/opt/mongodb4/mongo.keyfile #主从节点之间做认证的 (副本集需要的)

九、初始化副本集

  副本集配置好了之后,还要在主节点中先登录mongo的客户端,然后再注册复本集

代码语言:javascript复制
# mongodb 的复制集配置
rs.initiate({
    "_id":"rs",
        "members":[
        {"_id":0, "host":"192.xx.xx.xx:27277", "priority":3},
        {"_id":1, "host":"192.xx.xx.xx:27278", "priority":1},
        {"_id":2, "host":"192.xx.xx.xx:27279", "priority":1},
        {"_id":3, "host":"192.xx.xx.xx:27280", "arbiterOnly":true}
    ]      
});

 至此副本集的基础配置完毕了

十、副本集的安全验证

代码语言:javascript复制
# 设置查询mongodb的所有用户
db.system.users.find().pretty()
# 创建用户
db.createUser({user:"admin",pwd:"Se7eN521",roles:[{role:"root",db:"admin"}]});
# 副本集,只需要在主节点上设置密码,其他从节点会自定被设置上密码
代码语言:javascript复制
# 如果作为主节点关机不成功,可以先使用下面的命令,在关机
# 可以通过replSetStepDown命令下架主节点。这个命令可以登录主节点使用
db.adminCommand({replSetStepDown : 1})
# 如果杀不掉可以使用强制开关
db.adminCommand({replSetStepDown : 1, force : true})
# 或者使用 rs.stepDown(120)也可以达到同样的效果,中间的数字指不能在停止服务这段时间成为主节点,单位为秒。

db.shutdownServer()

十一、副本集配置开机自动启动

  其步骤命令和《Centos8上安装MongoDB4.X》中讲解的配置开机自启一致的

代码语言:javascript复制
# mongodb副本集的开机自动启动
在/lib/systemd/system/ 创建文件 mongodb-primary.service
代码语言:javascript复制
[Unit]
Description=mongodb-arbiter
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/opt/mongodb4/bin/mongod --config /opt/mongodb4/conf/rs/arbiter.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/opt/mongodb4/bin/mongod --shutdown --config /opt/mongodb4/conf/rs/arbiter.conf
PrivateTmp=true

[Install]
WantedBy=multi-user.target

上面是配置主节点的路径和代码,副本节点和仲裁节点一样,换成对应的路径和名称即可

副本集的服务命令:具体后面的命令的名字是自己起的。

  • systemctl enable mongodb-primary.service
  • systemctl enable mongodb-secondary1.service
  • systemctl enable mongodb-secondary2.service
  • systemctl enable mongodb-arbit.service

0 人点赞