副本集就是有自动故障恢复功能的主从集群。主从集群和副本集最为明显的区别就是副本集没有固定的主节点:整个集群会选举出一个主节点,当其不能工作时,则变更到其它节点。副本集总会有一个活跃节点和一个或多个备份节点。
副本集最好的优点就是全自动化的。
standard:常规节点,存储一份完整的数据副本,参与选举投票,可能称为活跃节点。
passive:存储完整的数据副本,参与投票,不能成为活跃节点。
arbiter:仲裁者只负责投票,不接受复制数据,也不能成为活跃节点。
用于replica set的参数有两个:
--replSet <setname>,复制集的名称。
--oplogSize <MB>,操作日志的大小,单位为MB。
一. MongoDB:创建Replica Set
1. 分别启动两台mongodb数据库
mongod --fork --dbpath /data/node2 --logpath /data/mongodb.log --port 10001 --logappend --replSet myrepl/test03:10002
mongod --fork --dbpath /data/node3 --logpath /data/mongodb.log --port 10002 --logappend --replSet myrepl/test02:10001
2. 初始化副本集
config = {"_id" : "myrepl",
"members" : [
{"_id" : 0, "host" : "test02:10001"},
{"_id" : 1, "host" : "test03:10002"}
]}
rs.initiate(config);
rs.status();
myrepl:SECONDARY> rs.status();
{
"set" : "myrepl",
"date" : ISODate("2014-02-25T02:17:39Z"),
"myState" : 2,
"syncingTo" : "test03:10002",
"members" : [
{
"_id" : 0,
"name" : "test02:10001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 968,
"optime" : Timestamp(1393294457, 1),
"optimeDate" : ISODate("2014-02-25T02:14:17Z"),
"errmsg" : "syncing to: test03:10002",
"self" : true
},
{
"_id" : 1,
"name" : "test03:10002",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 48,
"optime" : Timestamp(1393294457, 1),
"optimeDate" : ISODate("2014-02-25T02:14:17Z"),
"lastHeartbeat" : ISODate("2014-02-25T02:17:38Z"),
"lastHeartbeatRecv" : ISODate("2014-02-25T02:17:39Z"),
"pingMs" : 1,
"syncingTo" : "test02:10001"
}
],
"ok" : 1
}
3. 增加一个仲裁节点,只负责仲裁,不做数据存储。
mongod --fork --dbpath /data/node1 --logpath /data/mongodb.log --port 10003 --logappend --replSet myrepl/test02:10001,test03:10002
myrepl:PRIMARY> rs.addArb("test01:10003");
{ "ok" : 1 }
二. MongoDB:Replica Set 增加节点
1. 现有环境:
myrepl:PRIMARY> rs.conf();
{
"_id" : "myrepl",
"version" : 2,
"members" : [
{
"_id" : 0,
"host" : "test02:10001"
},
{
"_id" : 1,
"host" : "test03:10002"
},
{
"_id" : 2,
"host" : "test01:10003",
"arbiterOnly" : true
}
]
}
现有三个节点,两台standard节点,一台arbiter节点。
2. 增加节点
2.1 创建数据目录和日志文件:
mkdir -p /data/node/
touch /data/mongodb.log
2.2 安装mongodb:
tar zxf mongodb-linux-x86_64-2.4.9.tgz
mv mongodb-linux-x86_64-2.4.9 /opt/mongodb
echo "export PATH=$PATH:/opt/mongodb/bin" >>/etc/profile
source /etc/profile
mongod --config ~/.mongodb.conf
2.3 创建新从节点配置文件:
cat >> ~/.mongodb.conf <<EOF
fork = ture
port = 10005
dbpath = /data/node
logpath = /data/mongodb.log
logappend = true
replSet = myrepl
EOF
2.4 更改节点信息
cat /etc/sysconfig/network
cat >> /etc/hosts << EOF
192.168.27.214 test01
192.168.27.212 test02
192.168.27.213 test03
192.168.27.215 test04
192.168.27.216 test05
EOF
2.5 判断节点是否是主节点
myrepl:PRIMARY> rs.isMaster();
{
"setName" : "myrepl",
"ismaster" : true,
"secondary" : false,
"hosts" : [
"test02:10001",
"test03:10002"
],
"arbiters" : [
"test01:10003"
],
"primary" : "test02:10001",
"me" : "test02:10001",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"localTime" : ISODate("2014-02-25T19:23:22.286Z"),
"ok" : 1
}
2.6 增加新从节点到replSet
myrepl:PRIMARY> rs.add("192.168.27.215:10004");
# 增加arbiter节点的方法:myrepl:PRIMARY> rs.addArb("test01:10003");
2.7 再次查看Replica Set状态信息
myrepl:PRIMARY> rs.conf();
{
"_id" : "myrepl",
"version" : 3,
"members" : [
{
"_id" : 0,
"host" : "test02:10001"
},
{
"_id" : 1,
"host" : "test03:10002"
},
{
"_id" : 2,
"host" : "test01:10003",
"arbiterOnly" : true
},
{
"_id" : 3,
"host" : "192.168.27.215:10004"
}
]
}
3. 测试
3.1 主节点插入数据
myrepl:PRIMARY> db.test.insert({"name" : "xiaohuan", "age" : 30});
3.2 从节点查询数据
myrepl:SECONDARY> rs.slaveOk();
myrepl:SECONDARY> db.test.find();
{ "_id" : ObjectId("530bfc79eee2c2ce39f9cd95"), "name" : "caoqing" }
{ "_id" : ObjectId("530bfd8f3627cb16c15dcb32"), "name" : "xiaobao" }
{ "_id" : ObjectId("530ceed64770e9f00a279900"), "name" : "xiaohuan", "age" : 30 }
4. 把standard节点变为passive节点
myrepl:PRIMARY> cfg = rs.conf()
{
"_id" : "myrepl",
"version" : 3,
"members" : [
{
"_id" : 0,
"host" : "test02:10001"
},
{
"_id" : 1,
"host" : "test03:10002"
},
{
"_id" : 2,
"host" : "test01:10003",
"arbiterOnly" : true
},
{
"_id" : 3,
"host" : "192.168.27.215:10004"
}
]
}
myrepl:PRIMARY> cfg.members[3].priority = 0;
0
myrepl:PRIMARY> rs.reconfig(cfg);
myrepl:PRIMARY> rs.conf();
{
"_id" : "myrepl",
"version" : 4,
"members" : [
{
"_id" : 0,
"host" : "test02:10001"
},
{
"_id" : 1,
"host" : "test03:10002"
},
{
"_id" : 2,
"host" : "test01:10003",
"arbiterOnly" : true
},
{
"_id" : 3,
"host" : "192.168.27.215:10004",
"priority" : 0
}
]
}
转载于:https://my.oschina.net/u/1449160/blog/203343