美文网首页我爱编程
MongoDB 搭建副本集(Replica Set)

MongoDB 搭建副本集(Replica Set)

作者: oracleot | 来源:发表于2018-02-22 14:19 被阅读0次

    1.简介

    MongoDB集群有三种方式:Replica Set、Sharding、Master-Slaver。Replica Set是副本集的方式做高可用集群,Sharding是数据分片,如果数据量大可以使用这种方式。Master-Slaver官方已经不推荐使用了。

    本篇只介绍Replica Set的方式。数据分片将来单独写一篇介绍。

    1.2 Replica Set的两种节点

    Replica Set的节点分为两种:Primary和Secondary。他们都包含完整的数据,Primary节点为客户端提供读写服务,Secondary节点作为数据备份。如果Primary节点挂了,集群会选出一个Secondary节点作为Primary节点继续提供读写服务。

    1.3. Replica Set的读写分离

    默认Secondary节点不提供读服务,如果读的量非常大,并且允许客户端读取过时的脏数据,那么客户端可以直接连接到Secondary节点,设置Secondary节点可读(不设置读取会失败),就可以实现读写分离。

    2. 搭建Replica Set步骤

    2.1. 准备三台机器

    mongo01.dev.oracleot.com
    mongo02.dev.oracleot.com
    mongo03.dev.oracleot.com
    

    2.2. 使用docker启动mongodb

    三台机器分别执行下列命令

    # 创建volumn
    docker volumn create mongo_data_db
    
    # 创建证书
    docker run -rm -d mongo:3.6.1 bash
    cd /data/db/
    openssl rand -base64 756 > keyfile
    chmod 400 keyfile
    
    # 启动mongodb
    docker run --name mongo1 -p 27017:27017 -v mongo_data_db:/data/db --privileged -d mongo:3.6.1 mongod --replSet mongo-set --keyFile /data/db/keyfile
    

    2.3. 配置集群

    需要在primary机器上运行

    docker exec -it mongo1 mongo
    
    > config = {
        "_id" : "mongo-set",
        "members" : [
            {
                "_id" : 0,
                "host" : "mongo01.dev.oracleot.com:27017",
                "priority":2
            },
            {
                "_id" : 1,
                "host" : "mongo02.dev.oracleot.com:27017",
                "priority":1
            },
            {
                "_id" : 2,
                "host" : "mongo03.dev.oracleot.com:27017",
                "priority":1
            }
        ]
    }
    
    
    > rs.initiate(config)
    {
        "ok" : 1,
        "operationTime" : Timestamp(1515652730, 1),
        "$clusterTime" : {
            "clusterTime" : Timestamp(1515652730, 1),
            "signature" : {
                "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                "keyId" : NumberLong(0)
            }
        }
    }
    

    2.4 创建账户

    2.4.1 创建超级账户

    use admin
    > db.createUser(
      {
        user: "root",
        pwd: "mongo_root_test",
        roles: [ { role: "root", db: "admin" } ]
      }
    )
    

    2.4.2 创建管理员账户

    use admin
    > db.createUser(
      {
        user: "admin",
        pwd: "mongo_admin_test",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
      }
    )
    

    2.4.3 创建普通账户

    use mt
    db.createUser(
      {
        user: "mt",
        pwd: "mongo_mt_test",
        roles: [ { role: "readWrite", db: "mt" } ]
      }
    )
    

    2.5 解决警告

    启动后有可能会出现下面的警告

    2018-01-17T05:35:04.275+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
    2018-01-17T05:35:04.275+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
    2018-01-17T05:35:04.275+0000 I CONTROL  [initandlisten] 
    2018-01-17T05:35:04.275+0000 I CONTROL  [initandlisten] 
    2018-01-17T05:35:04.275+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
    2018-01-17T05:35:04.275+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
    2018-01-17T05:35:04.275+0000 I CONTROL  [initandlisten] 
    2018-01-17T05:35:04.275+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
    2018-01-17T05:35:04.275+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
    
    

    第一条WARNING: Access control is not enabled for the database.是没有创建用户导致的警告,如果创建了用户就可以了,不过mongodb的鉴权比较费CPU,如果应用使用短连接则不建议在mongodb中创建用户。

    第二三条是Centos7开启了transparent_hugepage导致的,虽然开启transparent_hugepage本意是提升内存性能,不过像orale、mongodb等厂商均建议关闭。下面是关闭方法

    禁用transparent_hugepage,重启后无效

    echo never > /sys/kernel/mm/transparent_hugepage/enabled  
    echo never> /sys/kernel/mm/transparent_hugepage/defrag  
    

    开机就禁用transparent_hugepage

    $ vim /etc/rc.d/rc.local
    
    # 加上下面的话
    if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
      echo never > /sys/kernel/mm/transparent_hugepage/defrag
    fi
    if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
      echo never > /sys/kernel/mm/transparent_hugepage/enabled
    fi
    

    设置执行权限

    $ chmod +x /etc/rc.d/rc.local
    

    相关文章

      网友评论

        本文标题:MongoDB 搭建副本集(Replica Set)

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