Replica sets replace master-slave replication for most use cases. If possible, use replica sets rather than master-slave replication for all new production deployments. This documentation remains to support legacy deployments and for archival purposes only.
副本集中的副本节点在主节点挂掉后通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。看起来很牛X的样子,我们赶紧操作部署一下!
官方推荐的副本集机器数量为至少3个,那我们也按照这个数量配置测试。
1、准备三台机器
192.168.18.10、192.168.18.11、192.168.18.12。
192.168.18.10当作副本集主节点,
192.168.18.11、192.168.18.12作为副本集副本节点。
2、分别在每台机器上建立mongodb副本集测试文件夹
#存放整个mongodb文件
mkdir -p /data/mongodbtest/replset
#存放mongodb数据文件
mkdir -p /data/mongodbtest/replset/data
#进入mongodb文件夹
cd /data/mongodbtest
我用的是从这里下载的最新版,大家也可以去下载
E:\mongodb\mongodb\mongod.exe --port 27017 --dbpath E:\mongodb\data --replSet mongolist
--replSet mongolist
rs.initiate({
_id: "mongolist",
members: [
{
_id: 0,
host: "192.168.18.10:27017",
priority :5
},
{
_id: 1,
host: "192.168.18.11:27017",
priority: 2
},
{
_id: 2,
host: "192.168.18.12:27017",
priority: 2 //权重值1到10越大成为主节点的机会就越大
}
]
})
rs.status()
{
"set" : "repset",
"date" : ISODate("2014-07-30T14:33:21Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "192.168.18.12:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1682,
"optime" : Timestamp(1388319973, 1),
"optimeDate" : ISODate("2014-07-30T14:33:21Z"),
"lastHeartbeat" : ISODate("2014-07-30T14:33:21Z"),
"lastHeartbeatRecv" : ISODate("2014-07-30T14:33:21Z"),
"pingMs" : 1,
"syncingTo" : "192.168.1.138:27017"
},
{
"_id" : 1,
"name" : "192.168.18.11:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1682,
"optime" : Timestamp(1388319973, 1),
"optimeDate" : ISODate("2014-07-30T14:33:21Z"),
"lastHeartbeat" : ISODate("2014-07-30T14:33:21Z"),
"lastHeartbeatRecv" : ISODate("2014-07-30T14:33:21Z"),
"pingMs" : 1,
"syncingTo" : "192.168.1.138:27017"
},
{
"_id" : 2,
"name" : "192.168.18.10:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2543,
"optime" : Timestamp(1388973, 1),
"optimeDate" : ISODate("2014-07-30T14:33:21Z"),
"self" : true
}
],
"ok" : 1
}
rs.config(..内容)
rs.initiate({
_id: "mongolist",
members: [
{
_id: 0,
host: "192.168.18.10:27017",
priority :5
},
{
_id: 1,
host: "192.168.18.11:27017",
arbiterOnly : true
},
{
_id: 2,
host: "192.168.18.12:27017",
priority: 2 //权重值1到10越大成为主节点的机会就越大
}
]
})
其中的仲裁节点不存储数据,只是负责故障转移的群体投票,这样就少了数据复制的压力。是不是想得很周到啊,一看mongodb的开发兄弟熟知大数据架构体系,其实不只是主节点、副本节点、仲裁节点,还有Secondary-Only、Hidden、Delayed、Non-Voting。
Secondary-Only:不能成为primary节点,只能作为secondary副本节点,防止一些性能不高的节点成为主节点。
Hidden:这类节点是不能够被客户端制定IP引用,也不能被设置为主节点,但是可以投票,一般用于备份数据。
Delayed:可以指定一个时间延迟从primary节点同步数据。主要用于备份数据,如果实时同步,误删除数据马上同步到从节点,恢复又恢复不了。
Non-Voting:没有选举权的secondary节点,纯粹的备份数据节点。
到此整个mongodb副本集搞定了两个问题:
还有这两个问题后续解决:
做了副本集发现又一些问题:
mongodb://192.168.18.10:27017,192.168.18.11:27017,192.168.18.12:27017/?connect=replicaSet;replicaSet=mongolist;readPreference=SecondaryPreferred;connectTimeout=30s;maxPoolSize=200
// 摘要:
// Represents read preference modes.
public enum ReadPreferenceMode
{
// 默认参数,只从主节点上进行读取操作;
Primary = 0,
// 大部分从主节点上读取数据,只有主节点不可用时从secondary节点读取数据。
PrimaryPreferred = 1,
// 只从secondary节点上进行读取操作,存在的问题是secondary节点的数据会比primary节点数据“旧”。
Secondary = 2,
// 优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据;
SecondaryPreferred = 3,
// 不管是主节点、secondary节点,从网络延迟最低的节点上读取数据。
Nearest = 4,
}
switch (strReadPreference)
{
case "Nearest":
set.ReadPreference = new ReadPreference(ReadPreferenceMode.Nearest); //优先读取secondary 不存在时读取primary
break;
case "Primary":
set.ReadPreference = new ReadPreference(ReadPreferenceMode.Primary);
break;
case "PrimaryPreferred":
set.ReadPreference = new ReadPreference(ReadPreferenceMode.PrimaryPreferred);
break;
case "Secondary":
set.ReadPreference = new ReadPreference(ReadPreferenceMode.Secondary);
break;
case "SecondaryPreferred":
set.ReadPreference = new ReadPreference(ReadPreferenceMode.SecondaryPreferred);
break;
default:
set.ReadPreference = new ReadPreference(ReadPreferenceMode.Nearest); //优先读取secondary 不存在时读取primary
break;
}
rs.add("192.168.18.99:27017",false) 默认是FAlse
rs.remove("192.168.18.99:27017")
佐υ佑 发表于 2014-7-30 14:42
沙发沙发,招租。。。哈哈哈,这个数据库最近很火啊
inghot 发表于 2014-7-30 14:48
哈哈,没有接触过,应该搞个从头开始的
欢迎光临 苏飞论坛 (http://www.sufeinet.com/) | Powered by Discuz! X3.4 |