美文网首页
MongoDB/主从/副本集

MongoDB/主从/副本集

作者: 米刀灵 | 来源:发表于2016-09-10 12:25 被阅读1599次

    主从复制:
    主节点写入数据,从通过读取主的oplog得到复制信息,开始复制数据并且将复制信息写入到自己的oplog。oplog是一个特殊的固定大小的collection,固定大小意味着,新的操作记录的写入会导致最老的操作记录的删除,以保证oplog的大小。这个值如果不去设置,会自动根据硬盘大小的5%来设定。
    Local库容量设置。我们知道Local库主要存放oplog,oplog用于数据的同步和复制,oplog同样要消耗内存的,因此选择一个合适的oplog值很重要。
    如果是高插入高更新,并带有延时从库的副本集需要一个较大的oplog值(比如50G);如果没有延时从库,并且数据更新速度不频繁,则可以适当调小oplog值(比如5G)。总之,oplog值大小的设置取决于具体业务应用场景。
    master启动配置文件:

    port=27018 #指定端口
    fork=true #后台运行
    dbpath=/home/map/mongodb/data #规定数据库的位置
    logpath=/home/map/mongodb/logs/mongodb.log #规定数据库的日志文件
    master=true #设置主
    # bind_ip=127.0.0.1,192.168.0.4 #允许的地址 为了安全
    nohttpinterface=true #禁止http访问
    

    slave启动配置文件:

    port=27018 #指定端口
    fork=true #后台运行
    dbpath=/home/map/mongodb/mongo #规定数据库的位置
    logpath=/home/map/mongodb/mlog/mongodb.log #规定数据库的日志文件
    slave=true #声明从
    source=192.168.0.4:27018 #规定从属于哪个ip  注意:ip是主服务器的  最好用内网ip
    # bind_ip=127.0.0.1,192.168.0.4 #允许的地址 为了安全
    nohttpinterface=true #禁止http访问
    

    测试:

    测试 主执行
    use word
    db.wsd.save({name:”aaa”})
    db.wsd.find()
    
    在从服务器执行
    show dbs;
    local  0.078GB
    word   0.078GB  #如果出现主的数据  说明同步成功
    use word
    db.wsd.find()  #查到数据说明同步成功
    { “_id” : ObjectId(“55cc43470278a3d7b1c6f2c0″), “name” : “aaa” }
    

    主从复制的其他设置项:

    • only 从节点指定复制某个数据库,默认是复制全部数据库
    • slavedelay 从节点设置主数据库同步数据的延迟(单位是秒)
    • fastsync 从节点以主数据库的节点快照为节点启动从数据库
    • autoresync 从节点如果不同步则从新同步数据库(即选择当通过热添加了一台从服务器之后,从服务器选择是否更新主服务器之间的数据)
    • oplogSize 主节点设置oplog的大小(主节点操作记录存储到local的oplog中)

    动态的添加或删除从节点:
    我们在我们上面的从节点的local数据库中,存在一个集合sources。这个集合就保存了我这个服务器的主服务器。


    挂接主服务:
    db.sources.insert({“host”:”127.0.0.1:8888”})
    删除已经挂接的主节点:
    db.sources.remove({“host”:”127.0.0.1:8888”})

    副本集:

    • 通常在部署 MongoDB 时, 哪怕目前只用到一个实例, 但为了方便扩展也可以将其部署为一个只有一个成员的副本集. 这样扩展规模时就不需要停机创建副本集而直接添加成员即可。
    • 副本集没有特定的主数据库。如果哪个Primary数据库宕机了,集群中就会推选出一个从属库作为主库。原来的Primary库恢复后成为从属库。
    • 在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,不能提供服务。所以最小的副本集也应该具备一个primary节点和两个secondary节点。两个节点的副本集不具备真正的故障转移能力。
    • 副本集要求参与选举投票(vote)的节点数为奇数,当我们只有两个(或偶数)的节点参与仲裁,这时需引入仲裁者(arbiter)。因为偶数情况下如果打成平局,那么每个成员都需要再等待30秒才能开始下一次选举。
    • 最大50节点,但是只能有7个投票节点,其他是non-voting节点。
    • 当集群中有1个primary节点,1个secondary节点和1个arbit节点,如果primary节点挂了,secondary节点也会自动成为primary节点。利用仲裁节点可以实现最少的机器开销达到两个节点热备的效果。
    • 挑有数据的机器进行初始化,如果一个副本集有大于一台机器有数据则不能创建副本集。
    • 默认情况下,Secondary是不提供服务的,即不能读和写。在特殊情况下需要读的话则需要:rs.slaveOk() ,只对当前连接有效。

    配置文件:

    port=27018 #指定端口
    fork=true #后台运行
    dbpath=/home/map/mongodb/data #规定数据库的位置
    logpath=/home/map/mongodb/logs/mongodb.log #规定数据库的日志文件
    replSet=replSetName #设置副本集的名字,同一个副本集成员都用一样的名字
    

    登录验证:
    当你的MongoDB启用了身份验证时,在多节点环境(副本、分片)下,mongoDB强制副本成员必要提供节点间验证的凭证才能相互通信。
    在初始化节点

    openssl rand -base64 21 > /usr/local/mongodb/keyfile
    chmod 600 /usr/local/mongodb/keyfile
    

    把keyfile文件复制到所有节点的/usr/local/mongodb/keyfile目录下,修改文件权限为600
    在上面的配置文件里添加

    auth=true
    keyFile=/usr/local/mongodb/keyfile
    

    初始化:

    config={"_id":"replSetName",
         "members":[
             {"_id":0,"host":"ip1:port1","priority":1},  
             {"_id":1,"host":"ip2:port2","priority":1},  
             {"_id":2,"host":"ip3:port3","priority":1},  
         ]
    }
    rs.initiate(config);//初始化副本集就完成了
    //"_id": 副本集的名称
    //"members": 副本集的服务器列表
    //"_id": 服务器的唯一ID
    //"host": 服务器主机
    //"priority": 是优先级,默认为1,优先级0为被动节点,不能成为活跃节点。//优先级不位0则按照有大到小选出活跃节点。
    //"arbiterOnly": true/false 仲裁节点,只参与投票,不接收数据,也不能成为活跃节点。
    //buildIndexes: 是否可以建立索引
    //slaveDelay:延迟多长时间开始复制最新数据
    

    增删节点:
    在活跃的主机上

    rs.status()
    //查看副本集状态
    rs.add("ip:port")
    //删除副本
    rs.remove("ip:port")
    //查看配置
    rs.config()
    #重新加载配置文件,强制了副本集进行一次选举,优先级高的成为Primary。
    cfg=rs.conf()
    cfg.members[1].priority=2
    rs.reconfig(cfg)
    

    读写分离:
    读写分离是通过修改程序的driver的,应用程序驱动通过read reference来设定如何对副本集进行读取操作,默认的,客户端驱动所有的读操作都是直接访问Primary节点。

    • primary
      主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。
    • primaryPreferred
      首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。
    • secondary
      从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。
    • secondaryPreferred
      首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。
    • nearest
      最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点。

    参考 :
    http://www.cnblogs.com/qiyebao/p/5157615.html
    http://www.cnblogs.com/zhoujinyi/p/3554010.html
    http://www.jianshu.com/p/5b97ec07a279

    相关文章

      网友评论

          本文标题:MongoDB/主从/副本集

          本文链接:https://www.haomeiwen.com/subject/kdhyettx.html