zoukankan      html  css  js  c++  java
  • Mongodb-副本集部署

    一、简单理解MongoDB副本集

    1.概念:

    MongoDB副本集相当于MySQL的主从复制,一主多从,单与MySQL不同的是,MongoDB的副本集实例的数量至少有三个。

    2.结构

    (1)一个主节点,多个从节点

    (2)本次部署采用一主两从的结构

    参考【http://www.mongoing.com/docs/core/replica-set-architecture-three-members.html】

    (3)优点:可以实现故障转移

    二、部署副本集

    参考文档【https://github.com/johnnian/Blog/issues/8】

    注:本次因资源限制,所以在一台服务器上运行三个实例

    1.部署MongoDB实例

    请参考【http://www.cnblogs.com/dingkailinux/p/9007057.html】

    (1)实例端口

    实例01:27017
    
    实例02:27018
    
    实例03:27019

    (2)创建应用目录

    # mkdir -p /opt/mongo/{27017,27018,27019}/{mongo_data,mongo_log,etc}
    # mkdir -p /opt/mongo/mongokeyfile
    # usermod -d /opt/mongo mongod
    # chown -R mongod.mongod /opt/mongo/

    (3)修改mongo配置文件

    标红部分,需要根据实际情况更改

    # cat << EOF >> /opt/mongo/27017/mongo_27017.conf  #生成配置文件,或者在原有的配置文件里做更改
    # mongod.conf, Percona Server for MongoDB
    # for documentation of all options, see:
    #   http://docs.mongo.org/manual/reference/configuration-options/
    
    # Where and how to store data.
    storage:
      dbPath: /opt/mongo/27017/mongo_data/
      journal:
        enabled: true
      engine: wiredTiger
    
    # Storage engine various options
    #  More info for wiredTiger: https://docs.mongo.com/v3.4/reference/configuration-options/#storage-wiredtiger-options
      wiredTiger:
        engineConfig:
          cacheSizeGB: 1  #内存的70%,单位是G
    #      checkpointSizeMB: 1000
    #      statisticsLogDelaySecs: 0
    #      journalCompressor: snappy
    #      directoryForIndexes: false
    #    collectionConfig:
    #      blockCompressor: snappy
    #    indexConfig:
    #      prefixCompression: true
    
    
    # Two options below can be used for wiredTiger and inMemory storage engines
    #setParameter:
    #    wiredTigerConcurrentReadTransactions: 128
    #    wiredTigerConcurrentWriteTransactions: 128
    
    # where to write logging data.
    systemLog:
     destination: file
     logAppend: true
     logRotate: rename
     path: /opt/mongo/27017/mongo_log/mongod.log
    
    processManagement:
      fork: true
      pidFilePath: /opt/mongo/27017/mongo_log/mongod.pid
    
    # network interfaces
    net:
      port: 27017  #监听端口
      bindIp: 10.140.0.4
      http:
        JSONPEnabled: false
        RESTInterfaceEnabled: false
      maxIncomingConnections: 100000
      wireObjectCheck : true
    
    #security:
    #  authorization: enabled
    #  keyFile: /opt/mongo/mongo_key/mongokeyfile  #集群节点间必须使用同一个文件
      
    
    #operationProfiling:
    
    replication:
      replSetName: "repset01"    #副本集的名称,同一内所有实例必须使用同一个名称
    
    #sharding:
    
    ## Enterprise-Only Options:
    
    #auditLog:
    
    #snmp:
    
    EOF


    # cp /opt/mongo/27017/mongo_27017.conf /opt/mongo/27018/mongo_27018.conf
    # cp /opt/mongo/27017/mongo_27017.conf /opt/mongo/27019/mongo_27019.conf

    (4)生成systemd相关配置

    生成system启动文件
    # /usr/lib/systemd/system
    # cp mongod.service mongod27017.service
    # cp mongod.service mongod27018.service
    # cp mongod.service mongod27019.service
    ------------------------------------------------------------- # cp /etc/sysconfig # cp mongod mongod_27017 # cp mongod mongod_27018 # cp mongod mongod_27019 修改以下标红部分 OPTIONS="-f /opt/mongo/27017/mongo_27017.conf" STDOUT="/opt/mongo/27017/mongo_log/mongod.stdout" STDERR="/opt/mongo/27017/mongo_log/mongod.stderr" NUMACTL="numactl --interleave=all"

    (5)修改systemd相关配置

    分别修改mongod27017.service、mongod27018.service、mongod27019.service以下标红部分
    # cd /usr/lib/systemd/system/
    # vim mongod27017.service
    [Unit]
    Description=High-performance, schema-free document-oriented database
    After=time-sync.target network.target
    
    [Service]
    Type=forking
    User=mongod
    Group=mongod
    PermissionsStartOnly=true
    LimitFSIZE=infinity
    LimitCPU=infinity
    LimitAS=infinity
    LimitNOFILE=64000
    LimitNPROC=64000
    EnvironmentFile=-/etc/sysconfig/mongod_27017  #进程启动环境变量定义文件
    ExecStartPre=/usr/bin/percona-server-mongodb-helper.sh
    ExecStart=/usr/bin/env bash -c "${NUMACTL} /usr/bin/mongod ${OPTIONS} > ${STDOUT} 2> ${STDERR}"
    PIDFile=/opt/mongo/27017/mongo_log/mongod.pid  #进程pid文件位置
    
    [Install]
    WantedBy=multi-user.target

    #######################################
    分别修改mongod_27017、mongod mongod_27018、mongod mongod_27019中标红部分
    # cd /etc/sysconfig/
    # vim
    mongod_27017

    OPTIONS="-f /opt/mongo/27017/mongo_27017.conf"  #指定实例的配置文件
    STDOUT="/opt/mongo/27017/mongo_log/mongod.stdout"  #指定实例启动的输出日志
    STDERR="/opt/mongo/27017/mongo_log/mongod.stderr"  #指定实例启动的报错日志
    NUMACTL="numactl --interleave=all"

    (6)启动实例

    # systemctl start mongod27017
    # systemctl start mongod27018
    # systemctl start mongod27019
    # systemctl enable mongod27017
    # systemctl enable mongod27018
    # systemctl enable mongod27019

    2.配置副本集

    (1)配置副本集

    # mongo --host 10.140.0.4 --port 27017
    > config = {_id: 'repset01', members: [{_id: 0, host: '10.140.0.4:27017'},{_id: 1, host: '10.140.0.4:27018'},{_id: 2, host:'10.140.0.4:27019'}]} { "_id" : "repset01", "members" : [ { "_id" : 0, "host" : "10.140.0.4:27017" }, { "_id" : 1, "host" : "10.140.0.4:27018" }, { "_id" : 2, "host" : "10.140.0.4:27019" } ] } > rs.initiate(config)  #副本集初始化 { "ok" : 1 } repset01:OTHER> rs.status()  #查看副本集状态 { "set" : "repset01", "date" : ISODate("2018-05-11T07:01:58.428Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "optimes" : { "lastCommittedOpTime" : { "ts" : Timestamp(1526022117, 1), "t" : NumberLong(1) }, "appliedOpTime" : { "ts" : Timestamp(1526022117, 1), "t" : NumberLong(1) }, "durableOpTime" : { "ts" : Timestamp(1526022117, 1), "t" : NumberLong(1) } }, "members" : [ { "_id" : 0, "name" : "10.140.0.4:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 158, "optime" : { "ts" : Timestamp(1526022117, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-05-11T07:01:57Z"), "infoMessage" : "could not find member to sync from", "electionTime" : Timestamp(1526022095, 1), "electionDate" : ISODate("2018-05-11T07:01:35Z"), "configVersion" : 1, "self" : true }, { "_id" : 1, "name" : "10.140.0.4:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 34, "optime" : { "ts" : Timestamp(1526022117, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1526022117, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-05-11T07:01:57Z"), "optimeDurableDate" : ISODate("2018-05-11T07:01:57Z"), "lastHeartbeat" : ISODate("2018-05-11T07:01:57.333Z"), "lastHeartbeatRecv" : ISODate("2018-05-11T07:01:58.168Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.140.0.4:27019", "configVersion" : 1 }, { "_id" : 2, "name" : "10.140.0.4:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 34, "optime" : { "ts" : Timestamp(1526022117, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1526022117, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2018-05-11T07:01:57Z"), "optimeDurableDate" : ISODate("2018-05-11T07:01:57Z"), "lastHeartbeat" : ISODate("2018-05-11T07:01:57.333Z"), "lastHeartbeatRecv" : ISODate("2018-05-11T07:01:58.153Z"), "pingMs" : NumberLong(0), "syncingTo" : "10.140.0.4:27017", "configVersion" : 1 } ], "ok" : 1 }

    (2)创建用户

     在主节点上,用客户端连接,创建用户权限(主节点,可以用 rs.status() 查看)
    # mongo --host 10.140.0.4 --port 27018
    > use admin
    > db.createUser({user:"admin", pwd:"admin", roles:[{role: "userAdminAnyDatabase", db:"admin" }]})
    > db.createUser({user:"clusterAdmin", pwd:"clusterAdmin", roles:[{role: "clusterAdmin", db:"admin" }]})
    > db.createUser({user:"root", pwd:"dingkai.123", roles:[{role: "root", db:"admin" }]})

    3.开启数据库认证

    (1)生成密钥文件

    # openssl rand -base64 504 -out  /opt/mongo/mongo_key/mongokeyfile
    # chmod 600 /opt/mongo/mongo_key/mongokeyfile
    # chown -R mongod.mongod opt/mongo/mongo_key/mongokeyfile

    (2)开启MongoDB的认证配置

    #关闭副本集:分别关闭每个节点的mongod
    理论上应该这样关闭
    # mongo --host 10.140.0.4 --port 27017
    > use admin
    > db.shutdownServer()
    但是
    db.shutdownServer()无法关闭,所以本人粗暴的使用了:
    # systemctl stop mongod27017
    # systemctl stop mongod27018
    # systemctl stop mongod27019


    #开启配置文件中以下选项
    security:
    authorization: enabled
    keyFile: /opt/mongo/mongo_key/mongokeyfile  #集群节点间必须使用同一个文件
    #重启所有实例
    # systemctl restart mongod27017
    # systemctl restart mongod27018
    # systemctl restart mongod27019

    (3)验证复制集可用性

    在主节点创建数据
    # mongo --host 10.140.0.4 --port 27017 Percona Server for MongoDB shell version v3.4.14-2.12 connecting to: mongodb://10.140.0.4:27017/ Percona Server for MongoDB server version: v3.4.14-2.12 repset01:PRIMARY> use admin switched to db admin repset01:PRIMARY> db.auth("admin","admin") 1 repset01:PRIMARY> use test003 switched to db test003 repset01:PRIMARY> db.createUser({user:"test003", pwd:"test003", roles:[{role: "readWrite", db:"test003" }]}) Successfully added user: { "user" : "test003", "roles" : [ { "role" : "readWrite", "db" : "test003" } ] } repset01:PRIMARY> db.auth("test003","test003") 1 repset01:PRIMARY> db.runoob.insert({"name":"丁凯"}) WriteResult({ "nInserted" : 1 }) repset01:PRIMARY> show dbs admin 0.000GB local 0.000GB test001 0.000GB test002 0.000GB test003 0.000GB 查看从节点是否有数据 # mongo --host 10.140.0.4 --port 27018 Percona Server for MongoDB shell version v3.4.14-2.12 connecting to: mongodb://10.140.0.4:27018/ Percona Server for MongoDB server version: v3.4.14-2.12 repset01:SECONDARY> use admin switched to db admin repset01:SECONDARY> db.auth("admin","admin") 1 repset01:SECONDARY> rs.slaveOk() repset01:SECONDARY> show dbs admin 0.000GB local 0.000GB test001 0.000GB test002 0.000GB test003 0.000GB repset01:SECONDARY>
  • 相关阅读:
    Python笔记 #17# Pandas: Merge
    MVC相关资料收集
    Python笔记 #16# Pandas: Operations
    Least slack time scheduling
    Python笔记 #15# Pandas: Missing Data
    Python笔记 #14# Pandas: Selection
    C++中const引用的是对象的时候只能调用该对象的f()const方法
    模板与泛型编程
    c++中的单例模式
    C/C++异常处理机制
  • 原文地址:https://www.cnblogs.com/dingkailinux/p/9025310.html
Copyright © 2011-2022 走看看