zoukankan      html  css  js  c++  java
  • MongoDB主从复制和副本集


    MongoDB有主从复制和副本集两种主从复制模式,主从复制最大的问题就是无法自动故障转移,MongoDB副本集解决了主从模式无法自动故障转义的特点,因此是复制的首选。
    对于简单的主从复制无法自动故障转移的缺陷,各个数据库都在改进,MySQL推出的MGR,Redis的哨兵,Mongodb的复制集。

    对于主从复制模式:
    mongodb的主从配置异常简单,
    如果是非安全认证模式,只需要在主节点增加master = true,
    从节点增加slave = true和source = ip:port两个节点,分别启动即可,不管主节点是否存在数据以及存在多少数据,从节点以slave的方式启动,就会自动同步主节点的数据。
    相比MySQL的主从模式(各种原因导致的主从事务不一致),简单的不是一点半点。

    port=12345 #端口 
    dbpath= /usr/local/mongodb/db #数据库存文件存放目录 
    logpath= /usr/local/mongodb/db/mongodb.log #日志文件存放路径 
    logappend=true #使用追加的方式写日志 
    fork=true #守护程序的方式启用,false即不在后台运行 
    maxConns=100 #最大同时连接数 
    journal=true #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
    storageEngine=wiredTiger #存储引擎有mmapv1、wiretiger、mongorocks
    bind_ip = 10.104.174.247 #这样就可外部访问了,例如从win10中去连虚拟机中的MongoDB
    #复制只需要增加master = true
    master = true
    #如果开启了安全认证,需要增加如下两个节点。
    auth=true #启用验证 
    keyFile= /usr/local/mongodb/db/keyfile #添加keyfile 
    oplogSize=2048 #oplog大小

    安全认证模式:

    关于安全认证模式,纠结了好久,mongodb是这样的:
    1,对于单实例的mongodb,(创建用户之后)开启安全认证需要增加auth = true配置即可,
    2,主从或者副本集模式下,(创建用户之后)如果要开启安全认证,必须要加上keyFile(设置可以file之后auth参数才有效),二者必须同时配置,否则(主从or副本集)就不成功。

    需要注意的是,如果在主节点创建了用户,主从节点以开启安全认证方式启动,主节点的用户信息同样可以同步到从节点,因此从节点并不需要再重新创建用户信息。

    副本的初始化:

    mongodb的副本在启动的时候会自动从主节点的oplog中读取数据,从而完成初始化,这一点非常省心。
    当然,可能存在主节点数据超过oplog大小或者说主节点oplog发生了重用(覆盖),那么就无法通过oplog自动做到主从的同步,此时可以可以:
    1,以autoresync = true的方式重启副本。
    2,删除从节点的数据文件然后重新启动从节点。
    3,删除从节点的数据文件,直接copy主节点的数据文件到从节点(个人认为这种方式更加简单高效),启动从节点即可。
    三种方式都可以达到完整同步主节点数据的目的。

    如下是mongodb slave节点同步数据的模式,来自于:https://www.cnblogs.com/daizhj/archive/2011/06/20/2050916.html

    副本集搭建

    由于MongoDB副本会自动从主节点(或者相邻的最近节点)同步数据,不会出现事务冲突之类错误,因此副本集的配置也很简单,这一点要比MySQL的各种配置简单太多。

    主节点生成keyfile:
    openssl rand -base64 100 > /usr/local/mongodb/db/keyfile --文件内容采base64编码,一共100个字符
    修改文件权限:
    chmod 600 /usr/local/mongodb/db/keyfile
    复制改keyfile至各个节点,然后启动各个节点。

    搭建副本集需要移除掉主从复制的一些配置项(主节点的master = true,从节点的slave,source等配置项),如下是一个最简单的配置项。

    port=8000 #端口  
    dbpath= /usr/local/mongodb/db #数据库存文件存放目录  
    logpath= /usr/local/mongodb/db/mongodb.log #日志文件存放路径  
    logappend=true #使用追加的方式写日志  
    fork=true #守护程序的方式启用,false即不在后台运行  
    maxConns=100 #最大同时连接数    
    auth=true #启用验证  
    journal=true #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
    #即使宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,然后重放后续的journal日志来恢复。
    storageEngine=wiredTiger  #存储引擎有mmapv1、wiretiger、mongorocks
    bind_ip = 10.104.174.247  
    
    keyFile= /usr/local/mongodb/db/keyfile #添加keyfile 
    #master = true
    oplogSize=2048  #oplog
    replSet = rstest #副本集名称
     
    主节点副本集初始化
    rs.initiate()
    (数秒之后)同时发现rstest:SECONDARY>变为rstest:PRIMARY>
    加入新节点
    rs.add("10.104.174.247:9000")
    rs.add("10.104.174.247:10000")
    rs.status() 查看副本集主从节点的状态

    "health" : 1, //1 表明正常; 0 表明异常
    "state" : 1, // 1 表明是Primary; 2 表明是Secondary;
    "stateStr" : "PRIMARY", //表明此机器是主库

    rs.isMaster()查看主节点信息
     

    副本集也可以通过定义主机集合的方式
    config_rs1={_id:'rs1',members:[
    {_id:1,host:'10.104.174.247:8000',priority:1},
    {_id:2,host:'10.104.174.247:9000'},
    {_id:3,host:'10.104.174.247:1000'}]}
    rs.initiate(config_rs1) //初始化配置

     

    参考:
    https://www.cnblogs.com/xsi640/p/3765911.html
    https://www.cnblogs.com/oubo/archive/2012/03/01/2394669.html
    https://www.cnblogs.com/daizhj/archive/2011/06/20/2050916.html

  • 相关阅读:
    快速幂模板
    部分有关素数的题
    POJ 3624 Charm Bracelet (01背包)
    51Nod 1085 背包问题 (01背包)
    POJ 1789 Truck History (Kruskal 最小生成树)
    HDU 1996 汉诺塔VI
    HDU 2511 汉诺塔X
    HDU 2175 汉诺塔IX (递推)
    HDU 2077 汉诺塔IV (递推)
    HDU 2064 汉诺塔III (递推)
  • 原文地址:https://www.cnblogs.com/wy123/p/10026381.html
Copyright © 2011-2022 走看看