Mongodb高可用之复制集搭建
Mongodb复制集介绍
1、MongoDB复制集的主要意义在于实现服务高可用,它的现实依赖于两个方面的功能:
● 数据写入时将数据迅速复制到另一个独立节点上
● 在接受写入的节点发生故障时自动选举出一个新的替代节点【自动监控、自动选举、自动切换、自动恢复】
2、在实现高可用的同时,复制集实现了其他几个附加作用:
● 数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟
● 读写分离:不同类型的压力分别在不同的节点上执行
● 异地容灾:在数据中心故障时候快速切换到异地
Mongodb复制集架构
一个典型的复制集由3个以上具有投票权的节点组成,包括:
● 一个主节点(primary) :接受写入操作和选举时投票
● 两个(或多个)从节点(secondary) :复制主节点上的新数据和选举时投票
● Arbiter (投票节点):将某一个从库,设置为专用的投票节点,不存储数据,不负责数据复制。
数据是如何复制的?
当一个修改操作,无论是插入、更新或删除,到达主节点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();