mongodb高可用之副本集

实践出真知

Posted by dbstack on July 20, 2018

一、mongo复制的简介

mongo集群成员说明

成员 说明
Secondary 正常情况下,复制集的Seconary会参与Primary选举(自身也可能会被选为Primary),并从Primary同步最新写入的数据,以保证与Primary存储相同的数据。Secondary可以提供读服务,增加Secondary节点可以提供复制集的读服务能力,同时提升复制集的可用性。另外,Mongodb支持对复制集的Secondary节点进行灵活的配置,以适应多种场景的需求。
Arbiter Arbiter节点只参与投票,不能被选为Primary,并且不从Primary同步数据。比如你部署了一个2个节点的复制集,1个Primary,1个Secondary,任意节点宕机,复制集将不能提供服务了(无法选出Primary),这时可以给复制集添加一个Arbiter节点,即使有节点宕机,仍能选出Primary。Arbiter本身不存储数据,是非常轻量级的服务,当复制集成员为偶数时,最好加入一个Arbiter节点,以提升复制集可用性。
Priority0 Priority0节点的选举优先级为0,不会被选举为Primary。比如你跨机房A、B部署了一个复制集,并且想指定Primary必须在A机房,这时可以将B机房的复制集成员Priority设置为0,这样Primary就一定会是A机房的成员。(注意:如果这样部署,最好将『大多数』节点部署在A机房,否则网络分区时可能无法选出Primary)
Vote0 Mongodb 3.0里,复制集成员最多50个,参与Primary选举投票的成员最多7个,其他成员(Vote0)的vote属性必须设置为0,即不参与投票。
Hidden Hidden节点不能被选为主(Priority为0),并且对Driver不可见。因Hidden节点不会接受Driver的请求,可使用Hidden节点做一些数据备份、离线计算的任务,不会影响复制集的服务。
Delayed Delayed节点必须是Hidden节点,并且其数据落后与Primary一段时间(可配置,比如1个小时)。因Delayed节点的数据比Primary落后一段时间,当错误或者无效的数据写入Primary时,可通过Delayed节点的数据来恢复到之前的时间点。

安装mongo服务的环境

系统环境说明:
1、系统版本及内核版本
[root@node1 ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
[root@node1 ~]# uname -r
3.10.0-514.el7.x86_64
[root@node1 ~]# hostname -i
10.0.52.201
2、关闭防火墙及selinux
[root@node1 ~]# systemctl stop firewalld && systemctl disable firewalld
[root@node1 ~]#setenforce 0
3、mongo 版本
mongodb-linux-x86_64-rhel70-v3.6-latest.tgz
4、机器机器及对应hostname
10.0.52.201 node1
10.0.52.202 node2
10.0.52.203 node3

在root用户下安装mongo

#创建mongod用户
[root@node1 opt]#useradd -u1001 mongod
[root@node1 opt]#echo 123456|passwd --stdin mongod 
# 安装mongodb
[root@node1 opt]#mkdir -p /opt/mongodb/{bin,data,conf,log} -p
[root@node1 opt]#cd  /opt
[root@node1 opt]#tar xf   mongodb-linux-x86_64-rhel70-v3.6-latest.tgz 
[root@node1 opt]#cd mongodb-linux-x86_64-rhel70-3.6.6-18-g29945ae/bin/ &&\
[root@node1 opt]#cp * /opt/mongodb/bin
[root@node1 opt]#chown -R mongod.mongod /opt/mongodb
# 切换到mongod用户进行后续操作
[root@node1 opt]#su - mongod
[mongod@node1 conf]~ cat >/opt/mongodb/mongod.conf<<-EOF 
systemLog:
  destination: file
  path: /opt/mongodb/log/mongodb.log
  logAppend: true
storage:
  journal:
    enabled: true
  engine: wiredTiger
  dbPath: /opt/mongodb/data
  directoryPerDB: true
  wiredTiger:
    engineConfig:
      # cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
net:
  port: 28017
  bindIp: 10.0.52.201,127.0.0.1
replication:
  oplogSizeMB: 2048
  replSetName: my_repl
operationProfiling:
  slowOpThresholdMs: 100
  mode: slowOp
EOF

#设置环境变量并加载
[mongod@node1 conf]echo 'export PATH=/opt/mongodb/bin:$PATH'>>~/.bash_profile
[mongod@node1 conf]. ~/.bash_profile

启动服务
[mongod@node1 bin]$mongod -f /opt/mongodb/conf/mongod.conf
关闭服务
[mongod@node1 bin]$mongod --shutdown  -f /opt/mongodb/conf/mongod.conf
按照相同办法安装其他两台机器,注意修改bindIp为主机ip,并启动mongo

# 配置复制集

 [mongod@node1 ~]$  mongo --port 28017
#输入配置
config = {_id: 'my_repl', members: [
                          {_id: 0, host: '10.0.52.201:28017'},
                          {_id: 1, host: '10.0.52.202:28017'},
                          {_id: 2, host: '10.0.52.203:28017'}]
          }
#初始化配置
rs.initiate(config)
#查看集群配置 
rs.conf();
#查看副本集各成员的状态
rs.status()
#  新增从节点
rs.add("ip:port"); 
#  新增仲裁节点
rs.addArb("ip:port");
#  删除一个节点
rs.remove("ip:port");
#修改203为仲裁节点
cfg.members[2].arbiterOnly=true