天天看点

mongodb-创建复制集(replSet)

架构:

mongodb-创建复制集(replSet)

复制集使用的异步同步方式,复制集成员直接每隔2s发送一次hearbeat(pings).当主节点与其它成员通信超时10s后,一个secondary节点将会被选举为primary节点.在新的版本中,如果存在多个secondary节点,当第一个节点被选举为primary后,其它的secondary节点将从它开始复制数据.

目标机器:

172.16.171.155 (仲裁节点)

172.16.171.156(从节点)

172.16.171.160(主节点)

1、安装mongodb

参考之前文章:http://blog.csdn.net/uevol14/article/details/52228329

2、创建复制集

1)关闭所有节点的mongod进程,加 --replSet 参数重新启动

mongod --replSet rs0 --fork --logpath /var/log/mongodb/mongod.log --dbpath /var/lib/mongo
#--fork 进程后台运行
#--logpath 加了--fork后必须配合--logpath,否则报错 BadValue: --fork has to be used with --logpath or --syslog
           

2)初始化复制集

在要作为主节点的主机上初始化复制集,这里选择172.16.171.160:

连接mongod服务

mongo
           

初始化复制集

MongoDB Enterprise > config={ _id:'myset', members:[ {_id:0,host:'172.16.171.160:27017'}, {_id:1,host:'172.16.171.155:27017'}, {_id:2,host:'172.16.171.156:27017',arbiterOnly:true}]}
{
        "_id" : "myset",
        "members" : [
                {
                        "_id" : 0,
                        "host" : "172.16.171.160:27017"
                },
                {
                        "_id" : 1,
                        "host" : "172.16.171.155:27017"
                },
                {
                        "_id" : 2,
                        "host" : "172.16.171.156:27017",
                        "arbiterOnly" : true
                }
        ]
}
MongoDB Enterprise > rs.initiate(config)
{ "ok" : 1 }
MongoDB Enterprise myset:OTHER> 
           

3)查看初始化配置文件

MongoDB Enterprise myset:PRIMARY> rs.conf()
{
        "_id" : "myset",
        "version" : 1,
        "protocolVersion" : NumberLong(1),
        "members" : [
                {
                        "_id" : 0,
                        "host" : "172.16.171.160:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 1,
                        "host" : "172.16.171.155:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                },
                {
                        "_id" : 2,
                        "host" : "172.16.171.156:27017",
                        "arbiterOnly" : true,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                }
        ],
        "settings" : {
                "chainingAllowed" : true,
                "heartbeatIntervalMillis" : 2000,
                "heartbeatTimeoutSecs" : 10,
                "electionTimeoutMillis" : 10000,
                "getLastErrorModes" : {

                },
                "getLastErrorDefaults" : {
                        "w" : 1,
                        "wtimeout" : 0
                },
                "replicaSetId" : ObjectId("57fd9e6a98bb6ad85838c09e")
        }
}
MongoDB Enterprise myset:PRIMARY> 
           

4)查看复制集信息

MongoDB Enterprise myset:PRIMARY> rs.status()
{
        "set" : "myset",
        "date" : ISODate("2016-10-12T02:40:24.781Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "heartbeatIntervalMillis" : NumberLong(2000),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "172.16.171.160:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 1218,
                        "optime" : {
                                "ts" : Timestamp(1476238966, 2),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2016-10-12T02:22:46Z"),
                        "electionTime" : Timestamp(1476238966, 1),
                        "electionDate" : ISODate("2016-10-12T02:22:46Z"),
                        "configVersion" : 1,
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "172.16.171.155:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 1069,
                        "optime" : {
                                "ts" : Timestamp(1476238966, 2),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2016-10-12T02:22:46Z"),
                        "lastHeartbeat" : ISODate("2016-10-12T02:40:23.205Z"),
                        "lastHeartbeatRecv" : ISODate("2016-10-12T02:40:24.156Z"),
                        "pingMs" : NumberLong(0),
                        "syncingTo" : "172.16.171.160:27017",
                        "configVersion" : 1
                },
                {
                        "_id" : 2,
                        "name" : "172.16.171.156:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",
                        "uptime" : 1069,
                        "lastHeartbeat" : ISODate("2016-10-12T02:40:23.205Z"),
                        "lastHeartbeatRecv" : ISODate("2016-10-12T02:40:20.376Z"),
                        "pingMs" : NumberLong(0),
                        "configVersion" : 1
                }
        ],
        "ok" : 1
}
MongoDB Enterprise myset:PRIMARY> 
           

5)在主节点上添加从节点

6)在主节点添加仲裁节点

MongoDB Enterprise rs0:PRIMARY> rs.addArb('172.16.171.155:27017')
{ "ok" : 1 }
MongoDB Enterprise rs0:PRIMARY>
           

3、复制集参数解释

_id:是用来标识复制集,参数内容和数据库启动的时候设置的rplSet参数一致

version:用来表示config参数的新旧,每次修改了config然后使用rs.reconfig重新配置的时候version的值会自动加1

protocolversion:是协议版本

members是一个数组,数组成员表示每个节点的信息.下面结束members的主要内容.

_id:用来标识节点号,唯一

host:表示节点的地址和端口信息

arbiterOnly:这是一个bool型,默认为false,用来表示这个节点是否是arbiter节点,只是用来投票

buildIndexes:这也是一个bool型,默认为true.用来表示同步的时候是否同步索引.一般设置为true.如果要设置为false,则必须将priority设置为0

hidden:这也是bool型,默认问false,用来表示这个节点是否为隐藏节点,如果是隐藏节点将不对外服务,只是单纯的同步信息,而且如果设置为了隐藏节点,使用rs.isMaster()方法将无法查看到隐藏节点的信息,但是可以使用rs.status()查看.设置隐藏节点必须首先将节点的priority设置为0

priority:表示权重,默认为1,如果将priority设置为0那么这个节点将永远无法成为primary节点,现在新的版本可以设置为超过1的数

slaveDelay:复制延迟,这个是整数,单位为秒,用来设置复制的延时.一般用来防止误操作,延迟节点必须优先级设置为0,hidden设置为true,然后设置slaveDelay值,

votes:表示这个节点是否有权利进行投票.

tags:表示标记,例如可以标记这个节点的作用等

settings是一些配置信息

chainingAllowed:表示是否允许链式复制,即某个secondary可以作为其它的secondary的源,默认是true.

heartbeatIntervalMillis:表示heartbeat的间隔时间,默认是没个两秒钟发送一个hearbeat包.

heartbeatTimeoutSecs:表示心跳检测超时时间,默认是10秒.

electionTimeoutMillis:表示选举超时时间,默认是10秒.

4、复制集参数修改

1)复制当前参数

cfg=rs.conf()
           

2)修改参数

cfg.member = new value
           

3)reconfig配置

rs.reconfig(cfg)
           

5、管理复制集

使用rs.help()来查看所有的复制方法

MongoDB Enterprise myset:PRIMARY> rs.help()
        rs.status()                                { replSetGetStatus : 1 } checks repl set status
        rs.initiate()                              { replSetInitiate : null } initiates set with default settings
        rs.initiate(cfg)                           { replSetInitiate : cfg } initiates set with configuration cfg
        rs.conf()                                  get the current configuration object from local.system.replset
        rs.reconfig(cfg)                           updates the configuration of a running replica set with cfg (disconnects)
        rs.add(hostportstr)                        add a new member to the set with default attributes (disconnects)
        rs.add(membercfgobj)                       add a new member to the set with extra attributes (disconnects)
        rs.addArb(hostportstr)                     add a new member which is arbiterOnly:true (disconnects)
        rs.stepDown([stepdownSecs, catchUpSecs])   step down as primary (disconnects)
        rs.syncFrom(hostportstr)                   make a secondary sync from the given member
        rs.freeze(secs)                            make a node ineligible to become primary for the time specified
        rs.remove(hostportstr)                     remove a host from the replica set (disconnects)
        rs.slaveOk()                               allow queries on secondary nodes


        rs.printReplicationInfo()                  check oplog size and time range
        rs.printSlaveReplicationInfo()             check replica set members and replication lag
        db.isMaster()                              check who is primary


        reconfiguration helpers disconnect from the database so the shell will display
        an error, even if the command succeeds.
MongoDB Enterprise myset:PRIMARY>