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()
原文地址:https://www.cnblogs.com/liujitao79/p/6899385.html