zoukankan      html  css  js  c++  java
  • mongodb 3.4 学习 (三)复制集

    复制集(replica set)
    复制集是一组mongodb的进程维护同样的数据集,提供冗余与高可用性。最小的复制集由3台服务器(或者3个实例)组成,最多1个primary和2个secondary实例,其中只有primary允许读写,secondary只读。secondary和primary的数据完全一致,它们之间通过primary实例的oplog异步(asynchronous)方式同步数据。
    

    oplog(operations log)是专门的capped collection,保存所有数据库相关修改的回滚记录,secondary成员通过异步的方式拷贝和执行这些操作。
    当primary不可用时,复制集发起投票(elections),选择1台secondary做为primary,请注意priority这个参数,priority为0的secondary不能成为primary,不能触发投票。
    
    Oplog Size
    在Unix和Windows系统中, 如果存储引擎使用的是WiredTiger,将占用剩余使用空间的5%。
    

    # 生产环境部署
    kvm-70-101 10.0.70.101 # primary
    kvm-70-102 10.0.70.102 # secondary
    kvm-70-103 10.0.70.103 # secondary
    
    # 生成key
    openssl rand -base64 756 > mongodb_product_key
    
    # 拷贝到所有成员服务器,并对文件授权
    chmod 400 mongodb_product_key
    chown mongod mongodb_product_key
    
    # 变更/etc/mongod.conf,对复制集命名
    security:
      keyFile: /etc/mongodb_product_key
    
    replication:
      replSetName: myapp
    
    
    # primary初始化
    rs.initiate( {
       _id : 'myapp',
       members: [ { _id : 0, host : 'kvm-70-101:27017' },  { _id : 1, host : 'kvm-70-102:27017' },   { _id : 2, host : 'kvm-70-103:27017' } ]
    })
    
    {
        "info" : "try querying local.system.replset to see current configuration",
        "ok" : 0,
        "errmsg" : "already initialized",
        "code" : 23,
        "codeName" : "AlreadyInitialized"
    }
    
    # 建立超级用户admin
    use admin
    db.createUser(
      {
        user: 'admin',
        pwd: '@admin',
        roles: [ { role: 'root', db: 'admin' } ]
      }
    );
    
    
    # 建立app数据库的管理员app
    use app
    db.createUser(
      {
        user: 'app',
        pwd: '@app',
        roles: [ { role: 'dbOwner', db: 'app' } ]
      }
    );
    
    # 认证登录
    db.auth('admin', '@admin')
    
    # 如果另外增加secondary,使用以下命令
    rs.add('kvm-70-104:27017')
    rs.add('kvm-70-104:27017')
    
    # 查看配置
    rs.conf()
    {
        "_id" : "myapp",
        "version" : 3,
        "protocolVersion" : NumberLong(1),
        "members" : [
            {
                "_id" : 0,
                "host" : "kvm-70-101:27017",
                "arbiterOnly" : false,
                "buildIndexes" : true,
                "hidden" : false,
                "priority" : 1,
                "tags" : {
                    
                },
                "slaveDelay" : NumberLong(0),
                "votes" : 1
            },
            {
                "_id" : 1,
                "host" : "kvm-70-102:27017",
                "arbiterOnly" : false,
                "buildIndexes" : true,
                "hidden" : false,
                "priority" : 1,
                "tags" : {
                    
                },
                "slaveDelay" : NumberLong(0),
                "votes" : 1
            },
            {
                "_id" : 2,
                "host" : kvm-70-103:27017",
                "arbiterOnly" : false,
                "buildIndexes" : true,
                "hidden" : false,
                "priority" : 1,
                "tags" : {
                    
                },
                "slaveDelay" : NumberLong(0),
                "votes" : 1
            }
        ],
        "settings" : {
            "chainingAllowed" : true,
            "heartbeatIntervalMillis" : 2000,
            "heartbeatTimeoutSecs" : 10,
            "electionTimeoutMillis" : 10000,
            "catchUpTimeoutMillis" : 2000,
            "getLastErrorModes" : {
                
            },
            "getLastErrorDefaults" : {
                "w" : 1,
                "wtimeout" : 0
            },
            "replicaSetId" : ObjectId("59248e52d45510744805fb78")
        }
    }
    
    # 查看状态
     rs.status()
    {
        "set" : "myapp",
        "date" : ISODate("2017-05-23T20:37:08.946Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
            "lastCommittedOpTime" : {
                "ts" : Timestamp(1495571827, 1),
                "t" : NumberLong(1)
            },
            "appliedOpTime" : {
                "ts" : Timestamp(1495571827, 1),
                "t" : NumberLong(1)
            },
            "durableOpTime" : {
                "ts" : Timestamp(1495571827, 1),
                "t" : NumberLong(1)
            }
        },
        "members" : [
            {
                "_id" : 0,
                "name" : "kvm-70-101:27017",
                "health" : 1,
                "state" : 1,
                "stateStr" : "PRIMARY",
                "uptime" : 4968,
                "optime" : {
                    "ts" : Timestamp(1495571827, 1),
                    "t" : NumberLong(1)
                },
                "optimeDate" : ISODate("2017-05-23T20:37:07Z"),
                "electionTime" : Timestamp(1495567955, 2),
                "electionDate" : ISODate("2017-05-23T19:32:35Z"),
                "configVersion" : 3,
                "self" : true
            },
            {
                "_id" : 1,
                "name" : "kvm-70-102:27017",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 77,
                "optime" : {
                    "ts" : Timestamp(1495571827, 1),
                    "t" : NumberLong(1)
                },
                "optimeDurable" : {
                    "ts" : Timestamp(1495571827, 1),
                    "t" : NumberLong(1)
                },
                "optimeDate" : ISODate("2017-05-23T20:37:07Z"),
                "optimeDurableDate" : ISODate("2017-05-23T20:37:07Z"),
                "lastHeartbeat" : ISODate("2017-05-23T20:37:07.702Z"),
                "lastHeartbeatRecv" : ISODate("2017-05-23T20:37:06.951Z"),
                "pingMs" : NumberLong(0),
                "syncingTo" : "10.0.70.103:27017",
                "configVersion" : 3
            },
            {
                "_id" : 2,
                "name" : "kvm-70-103:27017",
                "health" : 1,
                "state" : 2,
                "stateStr" : "SECONDARY",
                "uptime" : 77,
                "optime" : {
                    "ts" : Timestamp(1495571827, 1),
                    "t" : NumberLong(1)
                },
                "optimeDurable" : {
                    "ts" : Timestamp(1495571827, 1),
                    "t" : NumberLong(1)
                },
                "optimeDate" : ISODate("2017-05-23T20:37:07Z"),
                "optimeDurableDate" : ISODate("2017-05-23T20:37:07Z"),
                "lastHeartbeat" : ISODate("2017-05-23T20:37:07.708Z"),
                "lastHeartbeatRecv" : ISODate("2017-05-23T20:37:07.733Z"),
                "pingMs" : NumberLong(0),
                "syncingTo" : "10.0.70.101:27017",
                "configVersion" : 3
            }
        ],
        "ok" : 1
    }
    
    # secondary验证
    # 授权从机允许读
    rs.slaveOk()
    
    
    
    use app
    db.auth('app', '@app')
    db.test.insert({'hello': 'world'})
    
    
    # 查看建立的数据库及用户
    rs0:SECONDARY> db.test.find().pretty();
    { "_id" : ObjectId("5ad6c7e574a09792011db5ee"), "hello" : "world" }
    
    
    # 进行一次新的投票
    rs.stepDown()
    
  • 相关阅读:
    IntelliJ IDEA 自定义 Generate POJOs.groovy 生成 POJO
    MyBatisPlus入门
    Angular中内置模块和自定义模块
    Angular跳转传值(get,动态路由,js)
    Angular路由配置
    Angular数据请求(get,post)
    Angular父子组件之间通讯传值
    Angular双向数据绑定
    Angular项目分析
    Angular环境搭建
  • 原文地址:https://www.cnblogs.com/liujitao79/p/6899385.html
Copyright © 2011-2022 走看看