MongoDB复制集(Replica Set)

基本原理

复制集是一组MongoDB维护相同数据集的实例。它的基本构成是1主2从的结构,自带互相监控投票机制,如果主库发生宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知客户端程序主库已经发生切换,应用就会连接到新的主库。
在这里插入图片描述

复制集成员

Primary:接收所有写操作的唯一成员
Secondaries:复制主服务器的oplog并操作应用于数据集以保持数据一致
在这里插入图片描述
arbiter:arbiter不存储数据集的副本也不可能成为primary。然而,仲裁者参与primary选举但一个arbiter仅有1票。

特殊从节点

  • arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务。
  • hidden节点:隐藏节点。不参与选主,也不对外提供服务。
  • delay节点:延时节点。数据会落后于主库一段时间,由于数据是延时的,也不应该提供服务或参与选主。一般配合hidden节点配置使用。

oplog

oplog(操作日志)是一个特殊的有上限的集合,它保存着所有修改存储在数据库中的数据的操作的滚动记录。MongoDB在主服务器上应用数据库操作,然后在主服务器的oplog上记录操作。secondary然后在异步进程中复制和应用这些操作,使得数据同步极大地提高,缺点是oplog有大小限制,默认是空闲磁盘的5%。

复制集作用

  • 冗余和增加数据可用性。对于不同数据库服务器上的多个数据副本,复制提供了对单个数据库服务器丢失的一定程度容错能力。
  • 自动故障切换。 如果主库发生宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。
    在这里插入图片描述

环境搭建

准备多套目录:

su - mongod
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
mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log

多套配置文件内容:

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:
bindIp: 192.168.8.131,127.0.0.1
port: 27017
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/
\cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/
sed ‘s#28017#28018#g’ /mongodb/28018/conf/mongod.conf -i
sed ‘s#28017#28019#g’ /mongodb/28019/conf/mongod.conf -i
sed ‘s#28017#28020#g’ /mongodb/28020/conf/mongod.conf -i

启动多实例:

mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf

配置普通复制集:

mongo --port 28017 admin
config = {_id: ‘my_repl’, members: [
{_id: 0, host: ‘192.168.8.131:27017’},
{_id: 1, host: ‘192.168.8.131:27018’},
{_id: 2, host: ‘192.168.8.131:27019’}]
}

rs.initiate(config) //初始化配置
rs.status() //检查状态

配置1主1从一个arbiter

mongo -port 28017 admin
config = {_id: ‘my_repl’, members: [
{_id: 0, host: ‘10.0.0.51:28017’},
{_id: 1, host: ‘10.0.0.51:28018’},
{_id: 2, host: ‘10.0.0.51:28019’,“arbiterOnly”:true}]
}
rs.initiate(config)

复制集管理操作:

查看复制集状态
rs.status(); //查看整体复制集状态
rs.isMaster() // 查看当前是否是主节点
rs.conf() //查看复制集配置信息
添加删除节点
rs.remove(“ip:port”); // 删除一个节点
rs.add(“ip:port”); // 新增从节点
rs.addArb(“ip:port”); // 新增仲裁节点

配置延时节点(一般延时节点也配置成hidden)

cfg=rs.conf()
cfg.members[2].priority=0 =1取消配置
cfg.members[2].hidden=true =false取消
cfg.members[2].slaveDelay=120 =0取消
rs.reconfig(cfg) //使其生效

猜你喜欢

转载自blog.csdn.net/nmb_jiang/article/details/105684260