文章目录
复制集
简介
MongoDB中的副本集是一组提供冗余和高可用性的mongod进程。复制集的成员有
- Primary:主节点是副本集中唯一接收写入操作的成员。MongoDB在主节点上进行写操作,然后在主节点的oplog上记录操作(幂等操作)。从节点复制此日志并将操作应用于其数据集。副本集的所有成员都可以接受读取操作。但是,默认情况下,应用程序将其读取操作定向到主成员。
- Secondaries:Secondaries节点从Primary节点进行复制操作,以维护相同的数据集。Secondaries节点根据根据配置可以成为特殊节点,比如:delay节点,hidden节点,arbiter节点。虽然客户端无法将数据写入从节点,但客户端可以进行配置在从节点成员读取数据。
当客户端执行写入操作,必须等到大多数节点写入才会返回确认,这里的多数(M
)计算为所有投票成员的大多数,而不仅仅是数据承载投票成员。例如,在3个成员的副本集中,操作将需要来自3个成员中的2个的确认。如果主服务器未在wtimeout
限制内返回写入确认 ,则写入操作将失败并出现写入错误。
特殊从节点
优先级为0的节点
优先级为0的节点不能触发选举,也不能成为主节点,其他与普通的从节点一样,维护数据集的副本,接受读取操作,并在选举中投票,一般将辅助节点配置为优先级为0以防止它成为主节点,这在多数据中心部署中特别有用
hidden节点
隐藏成员维护主节点数据集,但对客户端应用程序不可见。hidden节点必须始终优先为0,因此不能成为主节点,但是hidden节点可以在副本集选举中投票,db.isMaster()
方法不显示hidden节点。
初始化配置
{
"_id" : <num>
"host" : <hostname:port>,
"priority" : 0, # 优先级为0
"hidden" : true # 隐藏开关打开
}
动态配置方法
cfg = rs.conf()
cfg.members[0].priority = 0
cfg.members[0].hidden = true
rs.reconfig(cfg)
delay节点
延迟节点,数据落后于主库一段时间,也因为数据是延时的,不应该提供服务和参与选举,通常也是hidden节点(优先级为0,不能成为主,隐藏的,不接受客户端请求)
由于延迟成员是数据集的“滚动备份”或运行“历史”快照,因此它们可以帮助您从各种人为错误中恢复。例如,延迟成员可以从不成功的应用程序升级和操作员错误(包括丢弃的数据库和集合)中恢复。
实例配置:
延迟成员的 members[n].priority
等于0
, members[n].hidden
等于true
,members[n\].slaveDelay
等于延迟的秒数:
{
“ _ id” : < num > ,
“host” : < hostname :port > ,
“priority” : 0 ,
“slaveDelay” : < seconds > ,
“hidden” : true
}
也可以动态将某个节点转换成延迟节点
cfg = rs.conf()
cfg.members[0].priority = 0
cfg.members[0].hidden = true
cfg.members[0].slaveDelay = 3600
rs.reconfig(cfg)
arbiter节点
主要负责选主过程中投票,不存任何数据,也不提供服务
常用的架构
一主两从
当主节点dow了,会自动触发选举,得到一个新的主节点并告知客户端,对应用来说是透明的
一主一从一投票节点
Arbiter节点没有数据也不参与选举,只有一个功能就是投票。
当主down了,这时候投票节点就可以参与投票,如果网络没问题那么从节点就会提升为主继续对外提供服务
规划
由于机器不够,就用多实例来完成实验
操作系统版本 | IP:PORT | MongoDB版本 | 安装方式 |
---|---|---|---|
CentOS Linux release 7.6.1810 (Core) | 192.168.240.21:27017 | 3.6.13 | 二进制包解压 |
CentOS Linux release 7.6.1810 (Core) | 192.168.240.21:28018 | 3.6.13 | 二进制包解压 |
CentOS Linux release 7.6.1810 (Core) | 192.168.240.21:29019 | 3.6.13 | 二进制包解压 |
前期准备
关闭防火墙和selinux
systemctl stop firewalld
setenforce 0
安装MongoDB
创建用户
useradd mongo
echo "mongo" | passwd mongo --stdin
关闭hugepage大页内存
Transparent Huge Pages(THP)是一种Linux内存管理系统,通过使用更大的内存页面,可以减少具有大量内存的计算机上的Translation Lookaside Buffer(TLB)查找的开销。 但是,数据库工作负载通常在THP上表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。您应该在Linux机器上禁用THP以确保使用MongoDB获得最佳性能。
cat /etc/init.d/disable-transparent-hugepages
#!/bin/bash
### BEGIN INIT INFO
# Provides: disable-transparent-hugepages
# Required-Start: $local_fs
# Required-Stop:
# X-Start-Before: mongod mongodb-mms-automation-agent
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description: Disable Linux transparent huge pages, to improve
# database performance.
### END INIT INFO
case $1 in
start)
if [ -d /sys/kernel/mm/transparent_hugepage ]; then
thp_path=/sys/kernel/mm/transparent_hugepage
elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
thp_path=/sys/kernel/mm/redhat_transparent_hugepage
else
return 0
fi
echo 'never' > ${thp_path}/enabled
echo 'never' > ${thp_path}/defrag
re='^[0-1]+$'
if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
then
# RHEL 7
echo 0 > ${thp_path}/khugepaged/defrag
else
# RHEL 6
echo 'no' > ${thp_path}/khugepaged/defrag
fi
unset re
unset thp_path
;;
esac
关闭大页内存
chmod 755 /etc/init.d/disable-transparent-hugepages # 设置脚本权限
chkconfig --add disable-transparent-hugepages # 设置开机启动
/etc/init.d/disable-transparent-hugepages start # 关闭内存大页
验证
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
都出现
always madvise [never]
表示成功关闭
安装MongoDB3.6
创建目录
mkdir -p /mongodb/bin
mkdir -p /mongodb/{27017,28018,29019}/conf
mkdir -p /mongodb/{27017,28018,29019}/log
mkdir -p /mongodb/{27017,28018,29019}/data
上传MongoDB3.6到/usr/local/src目录下
cd /usr/local/src
tar xf mongodb-linux-x86_64-rhel70-3.6.13.tgz
cp /usr/local/src/mongodb-linux-x86_64-rhel70-3.6.13/bin/* /mongodb/bin/
echo 'PATH="$PATH:/mongodb/bin"' >> /etc/profile
source /etc/profile
创建配置文件
# cat /mongodb/27017/conf/mongodb.conf
processManagement:
fork: true # 在后台运行
net:
bindIp: 192.168.240.21 # 监听的IP地址
port: 27017 # 监听的端口地址
storage:
dbPath: "/mongodb/27017/data" # 数据存放路径
systemLog:
destination: file
path: "/mongodb/27017/log/mongodb.log" # 日志位置
logAppend: true # 追加形式写日志
storage:
journal:
enabled: true
replication:
replSetName: "rs0" # 设置复制集名称
不同的实例使用不同port,不同的log路径,以及不通的数据存放路径,其他可以不变
修改权限
chown -R mongo:mongo /mongodb/
启动多实例
sudo -u mongo /mongodb/bin/mongod -f /mongodb/27017/conf/mongodb.conf
sudo -u mongo /mongodb/bin/mongod -f /mongodb/28018/conf/mongodb.conf
sudo -u mongo /mongodb/bin/mongod -f /mongodb/29019/conf/mongodb.conf
配置复制集
连接其中一个实例,这里连接27017端口的实例
mongo --host 192.168.240.21 --port 27017
配置复制集
> config = {_id:'rs0',members:[
{_id:0,host: '192.168.240.21:27017'},
{_id:1,host: '192.168.240.21:28018'},
{_id:2,host: '192.168.240.21:29019'}
]}
> rs.initiate(config)
执行rs.initiate(config)
,结果如下,ok为1标识成功
> rs.initiate(config)
{
"ok" : 1,
"operationTime" : Timestamp(1562308842, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1562308842, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
复制集常用管理操作
查看复制集状态
rs.isMaster()
rs.status()
查看复制集配置
rs.config()
添加普通节点
rs.add("ip:port")
删除一个节点
rs.remove("ip:port")
新增仲裁节点
rs.addArb("ip:port")
调整副本集优先级(优先级为0的节点,无法成为主节点)
cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 2
cfg.members[2].priority = 2
rs.reconfig(cfg)
配置非投票节点(votes和priority必须为0)
cfg = rs.conf();
cfg.members[3].votes = 0;
cfg.members[3].priority = 0;
rs.reconfig(cfg);
更改Oplog大小
use local
db.oplog.rs.stats().maxSize
db.adminCommand({replSetResizeOplog: 1, size: 16000})
重新触发选主
rs.stepDown()
一段时间内不能成为主
rs.freeze(120)
启用链式复制
cfg = rs.config()
cfg.settings.chainingAllowed = true
rs.reconfig(cfg)