Mongodb高可用之复制集搭建

 

Mongodb复制集介绍

 

1、MongoDB复制集的主要意义在于实现服务高可用,它的现实依赖于两个方面的功能:

● 数据写入时将数据迅速复制到另一个独立节点上

● 在接受写入的节点发生故障时自动选举出一个新的替代节点【自动监控、自动选举、自动切换、自动恢复】

 

2、在实现高可用的同时,复制集实现了其他几个附加作用:

● 数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟

● 读写分离:不同类型的压力分别在不同的节点上执行

● 异地容灾:在数据中心故障时候快速切换到异地

 

Mongodb复制集架构

 

一个典型的复制集由3个以上具有投票权的节点组成,包括:

● 一个主节点(primary) :接受写入操作和选举时投票

● 两个(或多个)从节点(secondary) :复制主节点上的新数据和选举时投票

● Arbiter (投票节点):将某一个从库,设置为专用的投票节点,不存储数据,不负责数据复制。

使用mongotemplate完成数据库复制_分布式

数据是如何复制的?

 

当一个修改操作,无论是插入、更新或删除,到达主节点master时,它对数据的操作将被记录下来(经过一些必要的转换),这些日志记录称为oplog。

mongodb的oplog,你可以当成mysql的binlog,oracle的redo。区别在于oplog是一张表(集合collection),json格式记录的。

从节点secondary通过在主节点上打开一个tailable的游标,不断获取(抽取)新进入主节点的oplog, 并在自己的数据上回放,以此保持跟主节点的数据一致。

【RS只有 异步模式,没有同步模式的】

 

 

下面就演示一下搭建Mongodb高可用复制集(一主两副本-PSS):

--使用的是目前最新版本Mongodb 4.2.8

https://www.mongodb.com/try/download/community

 

创建目录

su - mongodb
mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log

 

创建配置文件mongod.conf

 

cat > /mongodb/28017/conf/mongod.conf <<EOF
systemLog:
  destination: file
  path: /mongodb/28017/log/mongodb.log
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/28017/data
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
net:
   port: 28017
   bindIp: 0.0.0.0
replication:
  oplogSizeMB: 2048
  replSetName: my_repl
EOF  
cp  /mongodb/28017/conf/mongod.conf  /mongodb/28018/conf/
cp  /mongodb/28017/conf/mongod.conf  /mongodb/28019/conf/
sed -i 's#28017#28018#g' /mongodb/28018/conf/mongod.conf
sed -i 's#28017#28019#g' /mongodb/28019/conf/mongod.conf

mongod命令启动节点

mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
[mongodb@mongodb01 conf]$ netstat -tulnp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name      
tcp        0      0 0.0.0.0:28017           0.0.0.0:*               LISTEN      2009/mongod         
tcp        0      0 0.0.0.0:28018           0.0.0.0:*               LISTEN      2047/mongod         
tcp        0      0 0.0.0.0:28019           0.0.0.0:*               LISTEN      2085/mongod

 

配置复制集

1主2从(PSS):

_id: 'my_repl' 是复制集的名字,要和配置文件中的replSetName参数一致。

config = {_id: 'my_repl', members: [
                          {_id: 0, host: '192.168.1.150:28017'},
                          {_id: 1, host: '192.168.1.150:28018'},
                          {_id: 2, host: '192.168.1.150:28019'}]
          }
rs.initiate(config)

 

开放从节点的只读权限

 

从节点默认是:不能读、不能写

一般业务上,从节点是做只读库,所以我们要开放从节点的只读权限。

登录端口为28018、28019的从库:
mongo --host 192.168.1.150:28018  或者 mongo --port 28018
my_repl:SECONDARY> rs.slaveOk()
mongo --host 192.168.1.150:28019   或者 mongo --port 28019
my_repl:SECONDARY> rs.slaveOk()

复制集的数据同步测试

主节点:
use test
db.movies.insert([ { "title" : "Jaws", "year" : 1975, "imdb_rating" : 8.1 },
{ "title" : "Batman", "year" : 1989, "imdb_rating" : 7.6 },
] );
从节点:
use test
db.movies.find().pretty();