MongoDB复制集

复制集

简介

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等于0members[n].hidden等于truemembers[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了,这时候投票节点就可以参与投票,如果网络没问题那么从节点就会提升为主继续对外提供服务

[外链图片转存失败(img-l1DU4cCx-1562316574246)(https://docs.mongodb.com/v3.6/_images/replica-set-w-arbiter-trigger-election.bakedsvg.svg)]

规划

由于机器不够,就用多实例来完成实验

操作系统版本IP:PORTMongoDB版本安装方式
CentOS Linux release 7.6.1810 (Core)192.168.240.21:270173.6.13二进制包解压
CentOS Linux release 7.6.1810 (Core)192.168.240.21:280183.6.13二进制包解压
CentOS Linux release 7.6.1810 (Core)192.168.240.21:290193.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)

参考文档

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值