zoukankan      html  css  js  c++  java
  • [MongoDB] 安装MongoDB配置Replica Set

    MongoDB的环境主要包括StandAlone,Replication和Sharding。

    • StandAlone:单机环境,一般开发测试的时候用。
    • Replication:主从结构,一个Primary,多个Secondary,可能会有Arbitry。
      • Primary挂掉之后,会选举出一个Secondary作为Primary,与zookeeper类似。
      • Arbitry上面不存数据,只是为了凑数。选举算法要求节点数必须是奇数个,如果Primary+Secondary不是奇数个,就要用Arbitry凑数。
      • 写数据只能在Primary,读数据默认也在Primary,可以配置成从Secondary读,可以选最近的节点。
      • 数据在Primary上写成功之后,会将操作记录在oplog中,Secondary将oplog拷贝过去,然后照着操作一遍,就有数据了。
      • Primary和Secondary上面的数据保证最终一致性,可以为写操作配置write concern,有几个级别:在Primary上写完就认为写成功;写到oplog后认为写成功;写到一个/多个/某个/某几个Secondary之后认为写成功,等等。
    • Sharding:share nothing的结构,每台机器只存一部分数据。mongod服务器存数据,mongos服务器负责路由读写请求,元数据存在config数据库中。

    因为数据量和机器量的原因,项目最终用了一个Primary,一个Secondary,一个Arbitry。我自己的开发环境是Ubuntu,测试环境是CentOS。安装的是64位的MongoDB。

    Ubuntu上的安装

    sudo apt-get install mongodb

    CentOS上的安装

    配置yum源,创建文件:/etc/yum.repos.d/mongodb.repo

    [mongodb]
    name=MongoDB Repository
    baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
    gpgcheck=0
    enabled=1

    安装命令:

    yum install mongo-10gen mongo-10gen-server

    配置

    每台机器上面的配置文件/etc/mongod.conf修改成下面的:

    #数据库文件所在位置(默认)
    dbpath=/var/lib/mongo
    #日志所在位置(默认)
    logpath=/var/log/mongo/mongod.log
    #pid所在位置(默认)
    pidfilepath = /var/run/mongodb/mongod.pid
    #keyFile所在位置,生成方式在后面(添加)
    keyFile=/var/lib/mongo/key
    
    #端口(默认)
    port=27017
    
    #每次启动后日志追加在后面,不会新建日志文件(默认)
    logappend=true
    #用deamon方式启动(添加)
    fork=true
    #打开操作日志,用于故障恢复和持久化(默认)
    journal=true
    
    #replica set的名字(添加)
    replSet=test-set

    在每台机器上运行:

    sudo mongod -f /etc/mongod.conf

    我的环境里面,Primary ip: 192.168.1.1,Secondary ip: 192.168.1.2,Arbitary ip: 192.168.1.3。在单机上可以将多个mongodb设置成不同端口,我测试了一下也是可以的。

    在Primary上运行“mongo”,打开命令行,设置Replica Set:

    rs.initiate(
        {"_id" : "test-set",
         "members" : [
            {"_id" : 1, "host" : "192.168.1.1"},
            {"_id" : 2, "host" : "192.168.1.2"},
            {"_id" : 3, "host" : "192.168.1.3", "arbiterOnly" : true}
        ]
    });
    
    { 
    "info" : "Config now saved locally. Should come online in about a minute.", 
    "ok" : 1 
    }

    历史成功后需要等一段时间,他会选举Primary,然后查看Replica Set的状态:

    test-set:PRIMARY> rs.status()
    {
            "set" : "test-set",
            "date" : ISODate("2014-02-21T10:28:55Z"),
            "myState" : 7,
            "members" : [
                    {
                            "_id" : 1,
                            "name" : "192.168.1.1:27017",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            "uptime" : 4086,
                            "optime" : Timestamp(1392972480, 1),
                            "optimeDate" : ISODate("2014-02-21T08:48:00Z"),
                            "lastHeartbeat" : ISODate("2014-02-21T10:28:54Z"),
                            "lastHeartbeatRecv" : ISODate("2014-02-21T10:28:53Z"),
                            "pingMs" : 0
                    },
                    {
                            "_id" : 2,
                            "name" : "192.168.1.2:27017",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                            "uptime" : 3997,
                            "optime" : Timestamp(1392972480, 1),
                            "optimeDate" : ISODate("2014-02-21T08:48:00Z"),
                            "lastHeartbeat" : ISODate("2014-02-21T10:28:54Z"),
                            "lastHeartbeatRecv" : ISODate("2014-02-21T10:28:55Z"),
                            "pingMs" : 0,
                            "syncingTo" : "192.168.131.15:27017"
                    },
                    {
                            "_id" : 3,
                            "name" : "192.168.1.3:27017",
                            "health" : 1,
                            "state" : 7,
                            "stateStr" : "ARBITER",
                            "uptime" : 5781,
                            "self" : true
                    }
            ],
            "ok" : 1
    }

    这样整个replica set就配置成功了,还是比较简单的。

    KeyFile的设置

    KeyFile是机器间用来进行权限认证的,如果没有设置KeyFile,在rs.initiate()的时候,会提示有其他机器没有ready,大概这个意思记不清了,反正有个error...

    网上搜了一下这个错误,很多解释都是说,服务器异常关闭或者mongodb异常退出的时候,会留下一个锁文件"/var/lib/mongo/mongo.lock",需要把这个锁文件删除之后重启mongodb。我试了一下这个方法对我无效。

    查看了一台机器上的log文件,发现里面说,有其他机器给他发送消息,但是需要在每台机器上配置key file。大概是这个意思,忘记截图了。

    创建Key File用下面的语句:

    openssl rand -base64 741

    产生的字符串存到一个文本文件中,然后把这个文件的权限chmod成600(如果权限过高不行,log里面会告诉你权限过高),然后在配置里面加上“keyFile=keyfile的路径”,重启mongodb就行了。

    NUMA的问题

    测试机的CPU是NUMA的,于是在运行mongod的时候命令行和log里面会有下面的提示:

    WARNING: You are running on a NUMA machine.
    We suggest launching mongod like this to avoid performance problems:
    numactl –-interleave=all mongod [other options]

    于是要把启动命令改成:

    sudo numactl --interleave=all mongod -f /etc/mongod.conf
  • 相关阅读:
    解决ie下vue列表数据不能即时刷新的问题
    redis的几个知识点
    oracle查找某个字符在字符串中的个数的技巧
    程序员必看书籍
    eclipse彻底去除validation(彻底解决编辑js文件的卡顿问题)
    eclipse强行停止buliding workspace
    [Ljava.lang.String是一个字符串数组的字节码表示
    javascript合并两个数组
    css隐藏页面元素的方法
    配置IIS使用Python
  • 原文地址:https://www.cnblogs.com/hiddenfox/p/mongodb-install-config-replica-set.html
Copyright © 2011-2022 走看看