Replica Sets一般归入到高可用范畴内,提供服务的高度连续可用,降低服务的间断时间;而且
Replica Sets
也可以用在容灾、备份/恢复、负载均衡等方面。
1、Slave可以执行查询,降低Master压力;
2、在Slave上进行备份,避免备份中将Master锁定,造成Master不可方面的情况;
3、Master出现故障,可以快速切换到Slave上,使得服务不间断;
4、多台Slave可以和负载均衡器组合,提供高性能的可访问服务。
一、规划:
按照上图,安装配置3节点的Replica Sets,使用的操作系统是RHEL6.4,具体安装软件请参见“MongoDB系列一”。
相应的存储路径和端口定义,如下表:
二、准备:
# echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
# echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
如果不执行,启动mongod,日志中会显示相应的警告。
三、创建相关目录
# su - mongodb
$ mkdir /mongodb/data/r{0,1,2}
$ mkdir /mongodb/log
四、启动每个节点的mongod
$ mongod --replSet rs1 --fork --port 28010 --dbpath /mongodb/data/r0/ --logpath /mongodb/log/r0.log --logappend --smallfiles --oplogSize 128
about to fork child process, waiting until server is ready for connections.
forked process: 11552
child process started successfully, parent exiting
$ mongod --replSet rs1 --fork --port 28011 --dbpath /mongodb/data/r1/ --logpath /mongodb/log/r1.log --logappend --smallfiles --oplogSize 128
$ mongod --replSet rs1 --fork --port 28012 --dbpath /mongodb/data/r2/ --logpath /mongodb/log/r2.log --logappend --smallfiles --oplogSize 128
说明:
--replSet Replica Sets的名称
--fork 以创建子进程的方式运行
--port 服务使用的端口
--dbpath 数据文件存储的路径
--logpath 日志文件存储的路径
--logappend 日志写入日志问题的方式“追加”
--smallfiles 使用小文件的默认大小
--oplogSize 复制日志的空间大小(MB)
五、配置Replica Sets
连接R0,在R0做配置。
$ mongo --port 28010
MongoDB shell version: 3.2.6
connecting to: 127.0.0.1:28010/test
> rsconf = {
"_id" : "rs1",
"members" : [
{
"_id" : 0,
"host" : "localhost:28010"
}
]
}
> rs.initiate(rsconf);
{ "ok" : 1 }
rs1:OTHER> rs.conf();
{
"_id" : "rs1",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "localhost:28010",
"arbiterOnly" : false,
"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("57c9095e7bf8b5d9980b2e9d")
}
}
rs1:PRIMARY> rs.add("localhost:28011");
{ "ok" : 1 }
rs1:PRIMARY> rs.add("localhost:28012");
{ "ok" : 1 }
rs1:PRIMARY> rs.conf();
{
"_id" : "rs1",
"version" : 3,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "localhost:28010",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "localhost:28011",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "localhost:28012",
"arbiterOnly" : false,
"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("57c9095e7bf8b5d9980b2e9d")
}
}
配置完成。
六、查看状态,以及检查Replica Sets部署是否成功
1)查看状态
rs1:PRIMARY> rs.status();
{
"set" : "rs1",
"date" : ISODate("2016-09-02T05:12:10.162Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "localhost:28010",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 450,
"optime" : {
"ts" : Timestamp(1472793094, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-09-02T05:11:34Z"),
"electionTime" : Timestamp(1472792926, 2),
"electionDate" : ISODate("2016-09-02T05:08:46Z"),
"configVersion" : 3,
"self" : true
},
{
"_id" : 1,
"name" : "localhost:28011",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 39,
"optime" : {
"ts" : Timestamp(1472793094, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-09-02T05:11:34Z"),
"lastHeartbeat" : ISODate("2016-09-02T05:12:08.894Z"),
"lastHeartbeatRecv" : ISODate("2016-09-02T05:12:09.898Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "localhost:28010",
"configVersion" : 3
},
{
"_id" : 2,
"name" : "localhost:28012",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 35,
"optime" : {
"ts" : Timestamp(1472793094, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-09-02T05:11:34Z"),
"lastHeartbeat" : ISODate("2016-09-02T05:12:08.894Z"),
"lastHeartbeatRecv" : ISODate("2016-09-02T05:12:06.897Z"),
"pingMs" : NumberLong(0),
"configVersion" : 3
}
],
"ok" : 1
}
2)检查
(a)插入记录
rs1:PRIMARY> use test
switched to db test
rs1:PRIMARY> db.t1.insert({name:"john",age:10});
WriteResult({ "nInserted" : 1 })
rs1:PRIMARY> db.t1.find();
{ "_id" : ObjectId("57c923dc296d0a6382e17195"), "name" : "john", "age" : 10 }
(b)检查同步日志
rs1:PRIMARY> use local
switched to db local
rs1:PRIMARY> db.oplog.rs.find();
{ "ts" : Timestamp(1472792926, 1), "h" : NumberLong("-1551070289351464931"), "v" : 2, "op" : "n", "ns" : "", "o" : { "msg" : "initiating set" } }
{ "ts" : Timestamp(1472792927, 1), "t" : NumberLong(1), "h" : NumberLong("-6644373458713625013"), "v" : 2, "op" : "n", "ns" : "", "o" : { "msg" : "new primary" } }
{ "ts" : Timestamp(1472793091, 1), "t" : NumberLong(1), "h" : NumberLong("-3467321571589321913"), "v" : 2, "op" : "n", "ns" : "", "o" : { "msg" : "Reconfig set", "version" : 2 } }
{ "ts" : Timestamp(1472793094, 1), "t" : NumberLong(1), "h" : NumberLong("5469898305152102871"), "v" : 2, "op" : "n", "ns" : "", "o" : { "msg" : "Reconfig set", "version" : 3 } }
{ "ts" : Timestamp(1472799708, 1), "t" : NumberLong(1), "h" : NumberLong("-2309306902204899951"), "v" : 2, "op" : "c", "ns" : "test.$cmd", "o" : { "create" : "t1" } }
{ "ts" : Timestamp(1472799708, 2), "t" : NumberLong(1), "h" : NumberLong("-7169457093293246964"), "v" : 2, "op" : "i", "ns" : "test.t1", "o" : { "_id" : ObjectId("57c923dc296d0a6382e17195"), "name" : "john", "age" : 10 } }
注意:红色部分即是插入的记录数据,在此出现,说明在Master插入的记录,已经进入同步日志,进行同步,需要到Slave去验证是否接收到该记录。
(c)连接Slave,检查该记录是否可以查询
$ mongo --port 28011
MongoDB shell version: 3.2.6
connecting to: 127.0.0.1:28011/test
rs1:SECONDARY> use test
switched to db test
rs1:SECONDARY> db.t1.find();
Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }
注:MongoDB默认Slave是不能读的,所以需要进行如下配置。
rs1:SECONDARY> db.getMongo().setSlaveOk();
查询:
rs1:SECONDARY> db.t1.find();
{ "_id" : ObjectId("57c923dc296d0a6382e17195"), "name" : "john", "age" : 10 }
至此,可以证明Replica Sets是安装配置成功的。
1、Slave可以执行查询,降低Master压力;
2、在Slave上进行备份,避免备份中将Master锁定,造成Master不可方面的情况;
3、Master出现故障,可以快速切换到Slave上,使得服务不间断;
4、多台Slave可以和负载均衡器组合,提供高性能的可访问服务。
一、规划:
按照上图,安装配置3节点的Replica Sets,使用的操作系统是RHEL6.4,具体安装软件请参见“MongoDB系列一”。
相应的存储路径和端口定义,如下表:
| R0 | R1 | R2 |
数据存储路径 | /mongodb/data/r0 | /mongodb/data/r1 | /mongodb/data/r2 |
日志存储路径 | /mongodb/log/r0.log | /mongodb/log/r1.log | /mongodb/log/r2.log |
Port | 28010 | 28011 | 28012 |
二、准备:
# echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
# echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
如果不执行,启动mongod,日志中会显示相应的警告。
三、创建相关目录
# su - mongodb
$ mkdir /mongodb/data/r{0,1,2}
$ mkdir /mongodb/log
四、启动每个节点的mongod
$ mongod --replSet rs1 --fork --port 28010 --dbpath /mongodb/data/r0/ --logpath /mongodb/log/r0.log --logappend --smallfiles --oplogSize 128
about to fork child process, waiting until server is ready for connections.
forked process: 11552
child process started successfully, parent exiting
$ mongod --replSet rs1 --fork --port 28011 --dbpath /mongodb/data/r1/ --logpath /mongodb/log/r1.log --logappend --smallfiles --oplogSize 128
$ mongod --replSet rs1 --fork --port 28012 --dbpath /mongodb/data/r2/ --logpath /mongodb/log/r2.log --logappend --smallfiles --oplogSize 128
说明:
--replSet Replica Sets的名称
--fork 以创建子进程的方式运行
--port 服务使用的端口
--dbpath 数据文件存储的路径
--logpath 日志文件存储的路径
--logappend 日志写入日志问题的方式“追加”
--smallfiles 使用小文件的默认大小
--oplogSize 复制日志的空间大小(MB)
五、配置Replica Sets
连接R0,在R0做配置。
$ mongo --port 28010
MongoDB shell version: 3.2.6
connecting to: 127.0.0.1:28010/test
> rsconf = {
"_id" : "rs1",
"members" : [
{
"_id" : 0,
"host" : "localhost:28010"
}
]
}
> rs.initiate(rsconf);
{ "ok" : 1 }
rs1:OTHER> rs.conf();
{
"_id" : "rs1",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "localhost:28010",
"arbiterOnly" : false,
"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("57c9095e7bf8b5d9980b2e9d")
}
}
rs1:PRIMARY> rs.add("localhost:28011");
{ "ok" : 1 }
rs1:PRIMARY> rs.add("localhost:28012");
{ "ok" : 1 }
rs1:PRIMARY> rs.conf();
{
"_id" : "rs1",
"version" : 3,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "localhost:28010",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "localhost:28011",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "localhost:28012",
"arbiterOnly" : false,
"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("57c9095e7bf8b5d9980b2e9d")
}
}
配置完成。
六、查看状态,以及检查Replica Sets部署是否成功
1)查看状态
rs1:PRIMARY> rs.status();
{
"set" : "rs1",
"date" : ISODate("2016-09-02T05:12:10.162Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "localhost:28010",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 450,
"optime" : {
"ts" : Timestamp(1472793094, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-09-02T05:11:34Z"),
"electionTime" : Timestamp(1472792926, 2),
"electionDate" : ISODate("2016-09-02T05:08:46Z"),
"configVersion" : 3,
"self" : true
},
{
"_id" : 1,
"name" : "localhost:28011",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 39,
"optime" : {
"ts" : Timestamp(1472793094, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-09-02T05:11:34Z"),
"lastHeartbeat" : ISODate("2016-09-02T05:12:08.894Z"),
"lastHeartbeatRecv" : ISODate("2016-09-02T05:12:09.898Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "localhost:28010",
"configVersion" : 3
},
{
"_id" : 2,
"name" : "localhost:28012",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 35,
"optime" : {
"ts" : Timestamp(1472793094, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-09-02T05:11:34Z"),
"lastHeartbeat" : ISODate("2016-09-02T05:12:08.894Z"),
"lastHeartbeatRecv" : ISODate("2016-09-02T05:12:06.897Z"),
"pingMs" : NumberLong(0),
"configVersion" : 3
}
],
"ok" : 1
}
2)检查
(a)插入记录
rs1:PRIMARY> use test
switched to db test
rs1:PRIMARY> db.t1.insert({name:"john",age:10});
WriteResult({ "nInserted" : 1 })
rs1:PRIMARY> db.t1.find();
{ "_id" : ObjectId("57c923dc296d0a6382e17195"), "name" : "john", "age" : 10 }
(b)检查同步日志
rs1:PRIMARY> use local
switched to db local
rs1:PRIMARY> db.oplog.rs.find();
{ "ts" : Timestamp(1472792926, 1), "h" : NumberLong("-1551070289351464931"), "v" : 2, "op" : "n", "ns" : "", "o" : { "msg" : "initiating set" } }
{ "ts" : Timestamp(1472792927, 1), "t" : NumberLong(1), "h" : NumberLong("-6644373458713625013"), "v" : 2, "op" : "n", "ns" : "", "o" : { "msg" : "new primary" } }
{ "ts" : Timestamp(1472793091, 1), "t" : NumberLong(1), "h" : NumberLong("-3467321571589321913"), "v" : 2, "op" : "n", "ns" : "", "o" : { "msg" : "Reconfig set", "version" : 2 } }
{ "ts" : Timestamp(1472793094, 1), "t" : NumberLong(1), "h" : NumberLong("5469898305152102871"), "v" : 2, "op" : "n", "ns" : "", "o" : { "msg" : "Reconfig set", "version" : 3 } }
{ "ts" : Timestamp(1472799708, 1), "t" : NumberLong(1), "h" : NumberLong("-2309306902204899951"), "v" : 2, "op" : "c", "ns" : "test.$cmd", "o" : { "create" : "t1" } }
{ "ts" : Timestamp(1472799708, 2), "t" : NumberLong(1), "h" : NumberLong("-7169457093293246964"), "v" : 2, "op" : "i", "ns" : "test.t1", "o" : { "_id" : ObjectId("57c923dc296d0a6382e17195"), "name" : "john", "age" : 10 } }
注意:红色部分即是插入的记录数据,在此出现,说明在Master插入的记录,已经进入同步日志,进行同步,需要到Slave去验证是否接收到该记录。
(c)连接Slave,检查该记录是否可以查询
$ mongo --port 28011
MongoDB shell version: 3.2.6
connecting to: 127.0.0.1:28011/test
rs1:SECONDARY> use test
switched to db test
rs1:SECONDARY> db.t1.find();
Error: error: { "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 }
注:MongoDB默认Slave是不能读的,所以需要进行如下配置。
rs1:SECONDARY> db.getMongo().setSlaveOk();
查询:
rs1:SECONDARY> db.t1.find();
{ "_id" : ObjectId("57c923dc296d0a6382e17195"), "name" : "john", "age" : 10 }
至此,可以证明Replica Sets是安装配置成功的。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26812308/viewspace-2124412/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26812308/viewspace-2124412/