MongoDB集群上副本集(replica set)建立

1副本集的配置
在单机上成功运行MongoDB后,要使用副本集来创建Mongodb集群,需要先关闭mongod守护进程,然后:

mongod --replSet setname --fork

来使用自己设置的副本集的名字setname并启动mongodb。注意,--fork可以不用,它的意义是让mongod 在后台执行,以方便在shell中运行别的程序。

如果要在配置文件中使用这些选项,可以在配置文件mongo.conf中加入

replSet=setname
fork=true
oplogSize=1024 #日志文件大小,兆(M)为单位。mongod启动时会创建相应大小的文件,如果设定太大会报磁盘空间不足的错误

然后使用 mongod -f mongo.conf 来启动进程

其他选项参见 #cli-mongod-replica-set


2.启动和增加节点
在各个节点上使用了1.中的配置启动后,有两种方法来建立副本集的连接:

1)初始化副本集,增加节点配置
用客户端登陆进入mongo使用

rs.initiate()

初始化副本集,等待一段时间(主要是创建日志文件oplog)后,看到提示符显示setname:PRIMARY> 也就是成功了,然后:

rs.config()

可以查看副本集的配置状态,比如:

{
        "_id" : "clover",
        "version" : 5,
        "members" : [
                {
                        "_id" : 0,
                        "host" : "host1:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

},
                        "slaveDelay" : 0,
                        "votes" : 1
                }
        ] ...

目前只有一个主节点(primary),在确保可以访问另外两个节点的mongo服务的情况下,在本机的mongo shell中输入:

rs.add("hostname:port")

来增加节点,成功后使用:


[html] view plain copy print?rs.status() 

rs.status()来查看副本状态。


2)使用集群配置文档来创建副本集

这个方法我没有验证,如果要利用配置文档,在进入mongod shell之后,先要创建一个文档:

config = {
 "_id"  : "setname",
 "members" : [
  {"_id" : 0, "host" : "host1:port"},
  {"_id" : 1, "host" : "host2:port"},
  {"_id" : 2, "host" : "host3:port"},
  ...
 ]
}

然后使用这个文档来启动副本集:

rs.initiate(config)

使用这种方法必须要用mongo shell来先创建配置文档,而不能使用配置文件。

3.测试副本集
首先,使用

rs.isMaster()

得到:

{
        "setName" : "clover",
        "setVersion" : 7,
        "ismaster" : true,
        "secondary" : false,
        "hosts" : [
                "host1:27017",
                "host2:27017",
                "host3:27017"
        ],
        "primary" : "host1:27017",
        "me" : "host1:27017",
        "electionId" : ObjectId("5535c57b872d670c6331e5bf"),
        "maxBsonObjectSize" : 16777216,
        "maxMessageSizeBytes" : 48000000,
        "maxWriteBatchSize" : 1000,
        "localTime" : ISODate("2015-04-21T05:01:31.370Z"),
        "maxWireVersion" : 3,
        "minWireVersion" : 0,
        "ok" : 1
}

这样来查看主节点和副本集的状态,值得一提的是,备份节点(secondary)如果设置属性hidden为0,则rs.isMaster()将不能观察到此节点,例如下面的代码:


[html] view plain copy print?cfg=rs.config() #获取当前的配置 
cfg.members[2].priority=0 #让_id为2的节点优先级降为0 
cfg.members[2].hidden=1 #设置此节点隐藏,仅当其优先级为0时有效 
rs.reconfig(cfg) #应用配置 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/db087417a46cf989db9b47462002ccf4.html