Setting Up a Replica Set
Configuring a Replica Set
$ mongod --replSet spock -f mongod.conf --fork
登陆其他服务器
$ ssh server-2
server-2$ mongod --replSet spock -f mongod.conf --fork
server-2$ exit
$ ssh server-3
server-3$ mongod --replSet spock -f mongod.conf --fork
server-3$ exit
config为一个配置结构,格式如下:
> config = {
"_id" : "spock",
"members" : [
{"_id" : 0, "host" : "server-1:27017"},
{"_id" : 1, "host" : "server-2:27017"},
{"_id" : 2, "host" : "server-3:27017"}
]
}
members表示集合中的成员。
rs.initiate(config)
等价于
> db.adminCommand({"replSetInitiate" : config})
Changing Your Replica Set Configuration
添加成员
rs.add("server-4:27017")
删除成员
> rs.remove("server-1:27017")
Fri Sep 28 16:44:46 DBClientCursor::init call() failed
Fri Sep 28 16:44:46 query failed : admin.$cmd { replSetReconfig: {
_id: "testReplSet", version: 2, members: [ { _id: 0, host: "ubuntu:31000" },
{ _id: 2, host: "ubuntu:31002" } ] } } to: localhost:31000
Fri Sep 28 16:44:46 Error: error doing query:
failed src/mongo/shell/collection.js:155
Fri Sep 28 16:44:46 trying reconnect to localhost:31000
Fri Sep 28 16:44:46 reconnect localhost:31000 ok
修改某一个成员的配置
> var config = rs.config()
> config.members[1].host = "server-2:27017"
> rs.reconfig(config)
Majority
majority指在set中,超过全部成员一半的成员集合。
假设有5个成员,majority就是3,如果3个成员挂掉了,那么剩下的2个成员不能够选举primary。为什么剩下的2个不能够选举呢,因为有一种可能性,这3个成员在一个网络中,剩下的2个成员在一个网络中,两个网络之间的连接断掉了,3个成员可以选一个primary,如果剩下的2个成员也选一个primary的话,就会有连个primary,就会出现冲突问题。
How Elections Work
当一个Secondary (名为A)无法到达primary时,它会联系所有的其它成员,让它们选自己成为primary,其它成员会进行以下检查:它们自己是否能够到达A到达不了的primary?A是否up to date with replication
?是否有比A更高优先级的成员可以选为primary.
当A从大部分成员收到”ayes”,A就成为primary。但是如果有一个成员vetoes
这个选举,这个选取就被取消。
一个
vetoes
含有1000的选举数。
寻求选举的成员必须up to date with replication
,什么意思呢?举例来说:
假如成员A复制(replicated)的最新操作为123op
,它联系其它成员,但是里面有个成员B复制的最新操作胃124op
,那么成员B就会vetoes
这个选取。成员A就会继续同步直到同步到124op
,就会再次发起投票。
Member Configuration Options
Arbites
Arbiter是一种特殊的MongoDB成员,存在的目的就是为了参与投票,并不会存数据。
最多使用一个
arbiter
添加Arbiter
的命令
> rs.addArb("server-5:27017")
Priority
优先级从0到100,默认为1,优先级为0的成员永远不会被选举为primary
优先级最高的成员在它能够联系大部分的成员并且数据是most up to date
的情况下,会优先被选举为primary
设置优先级
> rs.add({"_id" : 4, "host" : "server-4:27017", "priority" : 1.5})
Hidden
用户不会把请求route
到hidden
成员,hidden
成员并不会作为replication sources
(复制源)。
> rs.isMaster()
{
...
"hosts" : [
"server-1:27107",
"server-2:27017",
"server-3:27017"
],
...
}
设置Hidden属性
> var config = rs.config()
> config.members[2].hidden = 0
> config.members[2].priority = 0
> rs.reconfig(config)
重新查看
> rs.isMaster()
{
...
"hosts" : [
"server-1:27107",
"server-2:27017",
"server-3:27017"
],
...
}
rs.status()
andrs.config()
will still show the member; it only disappears fromisMaster()
.