天天看点

【MongoDB】02、MongoDB复制

一、mongodb复制

1、mongodb复制简介

mongodb复制的实现有两种类型:

  master/slave:和mysql主从复制非常近似,已经很少用了,

  replica set:复制集或副本集,能自动实现故障转移

副本集

   服务于同一数据集的一组mongodb实例

   一个复制集只能有一个主节点,能读写,其它从节点只能读

   主节点将数据修改操作保存至oplog(操作日志)中,各从节点通过oplog来复制数据并应用在本地 

        mongodb的复制至少需要两个节点,一般为3个节点或更多节点,即使只需要2个节点就够用时也应该使用令一个节点当做仲裁设备,可以不保存数据(如果只有一主一从的话,故障时不知道到底是主故障了还是从故障了)

         副本集中各节点之间不断通过心跳信息传递来判断健康状态,默认心跳信息每隔2s传递一次,一旦和主节点与其它节点中断通信超过10s,副本集就会触发重新选举,选举一个从节点成为新的主节点

副本集特征:

奇数个节点的集群,应至少为3个节点,

任何节点可作为主节点,且只能有一个主节点

所有写入操作都在主节点上

自动故障转移,自动恢复

副本集中节点分类:

  0优先级的节点:

     冷备节点,不会被选举为主节点,但能参与选举过程,并持有数据集,能被客户端访问;常用于异地容灾

 被隐藏的从节点:

     首先得是0优先级的节点,且对客户端不可见

 延迟复制的节点: 

     首先得是0优先级的节点,且复制时间落后于主节点一个固定时长

 arbiter:

     仲裁节点,不持有数据集

2、mongodb副本集

hearbeat:

  实现心跳信息传递,并触发选举

oplog:

  保存数据修改操作,是实现复制的基础工具

   大小固定的文件,存储在local数据库中,复制集中各节点都有oplog,但只有主节点才会写oplog,并同步给从节点,

   oplog具有幂等性,多次运行,结果不变

   因为oplog的大小是固定的,不可能保持主节点的所有操作,所以从节点添加进复制集会先初始化:从节点先从主节点的数据集复制数据,并跟上主节点,然后才从oplog复制数据

1个新从节点加入复制集合后的操作过程:

    初始同步(initial sync)

    回滚后追赶(post-rollback catch-up)

    切分块迁移(sharding chunk migrations)

local数据库: 

   local数据库本身不参与复制(不会复制到别的节点去)

   存放了副本集的所有元数据和oplog;用于存储oplog的是一个名为oplog.rs的collection(该节点加入了副本集后第一次启动时自动创建);

   oplog.rs的大小依赖于os及文件系统,默认为磁盘空间的5%(此值少于1g时为1g);但可以自定义其大小:使用oplogsize=n单位为m

3、mongo的数据同步类型

 1)初始同步

    从节点没有任何数据时,但主节点已有数据

    从节点丢失副本复制历史时

初始同步的步骤:

 a、克隆所有数据库

 b、应用数据集的所有改变:复制oplog并应用于本地

 c、为所有collection构建索引

 2)复制

二、副本集的配置

1、环境

node2: centos6.5 x86_64 

node5: centos6.5 x86_64  

node7: centos6.5 x86_64

2、配置过程

    应先关闭mongod

在配置文件中添加一下选项:

  replset=testset           # 副本集的名称,表示作为副本集中的节点

  replindexpprefetch=id_only    # 启用副本集索引预取(非必须),只在从节点有效 

添加主机进副本集:

  该主机需要监听在能副本集中其它节点通信的套接字上

  在配置文件中设置了副本集的名称要和当前副本集一样

连接从节点进行操作:

让副本集中主节点“下台”:触发选举

查看副本集oplog的信息:

3、选举

副本集的重新选举的影响条件:

  心跳信息

  优先级

     默认为1,0优先级不能触发选举过程,高优先级的节点能触发选举让自己“上台”

  optime

     成员节点最近一次应用于本地oplog的条目的时间戳

  网络连接

     副本集出现分区时,“多数方“才能选举出主节点

  网络分区

     同上 

选举机制:

   触发选举的事件:

      新副本集初始化时

      从节点联系不到主节点时

      主节点“下台”时

         主节点收到stepdown()命令时

         某从节点有更高的优先级且已经满足成主节点其它所有条件

         主节点无法联系到副本集的“多数方”

4、修改副本集节点的配置

先使用一个变量保存当前副本集的配置:

设置节点的优先级:需要在主节点配置

添加仲裁节点:

  在添加进副本集时,使用rs.addarb("hostportstr")

副本集中其它命令:

   rs.freeze(secs):让节点在指定时间内不能被选举为主节点

    rs.printslavereplicationinfo():查看从节点是否跟上了主节点,较低版本没有这个命令