ITPub博客

首页 > 数据库 > NoSQL > MongoDB系列二:Replica Sets安装与配置

MongoDB系列二:Replica Sets安装与配置

原创 NoSQL 作者:mikeliuy 时间:2016-09-02 16:13:38 0 删除 编辑
Replica Sets一般归入到高可用范畴内,提供服务的高度连续可用,降低服务的间断时间;而且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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-06-18

  • 博文量
    72
  • 访问量
    382615