mongodb replica sets功能
经验总结:
Replica Set是mongodb中数据集这一块的内容,何为数据集?简单的理解,就是把多个库集中一起去进行管理,这些库可能是一台机器上可能是多个服务器组成的服务器组。
主要的功能:
(1) 如果一个项目在一台机器上面只有一个库,一旦这个库坏了那么整个项目就瘫痪了。如果有多个库配置一下并且设置了主库和分库,那么一旦主库出现问题,会自动切换到分库上面,不会影响使用。
(2) 一旦mongodb进行了主库和分库的配置,那主库就有读、写、执行的权限,但是分库只有读取的权限。我们往主库中执行增删改的操作的时候,会自动同步到对应的分库,这样在每一个时间点只会有一个库可以操作,其他的库都是通过Replica Set的机制来修改的。既然分库提供了查询的权限,那么必定可以和主库分担一些访问,我们可以把大量的查询类的请求映射到分库上面。
(3)
配置的过程:
情景一:(window配置过程,一台机器上面配置多个库)
(1) 准备好mongodb 1.6版本以上的,当然1.8版本以上的更好啦。
(2) 创建好多个数据库文件夹。如:data1、data2(如果是1.8版本以上的有一个—keyFile参数,主要还是安全性方面会高点)。
(3) 启动mongodb的两个服务库分别制定data1和data2。
mongod –dbpath=../../data/data/data1 –port 28010 –replSet rs1 |
mongod –dbpath=../../data/data/data2 –port 28011 –replSet rs1 |
注意:replSet 后面的别字必须是一样的。
(4) 编写配置文件
>cfg={_id:’rs1’,members:[{_id:0,host:’localhost:28010’,priority:1},{_id:1,host:’localhost:28011’}]}; |
如果看到下面显示的配置信息说明成功了。
{ "_id" : "rs1", "members" : [ { "_id" : 0, "host" : "localhost:28010", “priority”:1 }, { "_id" : 1, "host" : "localhost:28011" } ] } |
(5) 初始化配置文件
rs.initiate(cfg); |
如果看到下面提示说明配置成功。
{ "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 } |
(6) 查看当前的数据集的配置情况。
rs.status(); |
下面是通过status()函数看到的配置信息:
{ "set" : "rs1", "date" : ISODate("2012-05-31T09:49:57Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "localhost:28010", "health" : 1, --1 表明正常; 0 表明异常 "state" : 1, -- 1 表明是Primary; 2 表明是Secondary; "stateStr" : "PRIMARY", --表明此机器是主库 "optime" : { "t" : 1338457763000, "i" : 1 }, "optimeDate" : ISODate("2012-05-31T09:49:23Z"), "self" : true }, { "_id" : 1, "name" : "localhost:28011", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 23, "optime" : { "t" : 1338457763000, "i" : 1 }, "optimeDate" : ISODate("2012-05-31T09:49:23Z"), "lastHeartbeat" : ISODate("2012-05-31T09:49:56Z") } ], "ok" : 1 } |
这时候我们可以通过往主库中插入记录
db.Test.save({name:’lalala’}); |
我们通过启动的mongodb的日志可以看到非但查到主库中添加了记录,分库中也添加了记录。我们也可以通过db.Test.find({name:’lalala’});查看到这条记录。
(7) 注意点:在配置主库和分库的时候主库中可以存在数据,但是分库中一定要是空空的,没有任何的数据。
情景二:(window配置过程,多台机器上面配置多个库)
如果这时候按照情景一的方式去配置你会一直出现初始化配置文件的时候出问题,那我们如何解决呢?差了好多资料,大多数资料上面前序工作可能没做,配置的时候会一路顺风。
解决方法一定要给主库新建一个角色,并且用指定的密码登陆才可以。(具体为什么这样做不太清楚,可能出去对安全性的考虑吧,毕竟mongodb的登陆是不需要用户名密码的)。
我们先要在主库中配置一个角色,db.addUser(“root”,”111”);然后db.auth(“root”,”111”);在启动的时候要加上-uroot –p参数。即:
mongod –dbpath=../../data/data/data1 –port 28010 – u root –p |
然后会提示让我们输入密码:(这边输入密码是看不到***之类的东西的,只管输就可以了)。
接下来按照情景一进行配置就可以了。
情景三:在linux下面配置
先看看linux的glibc的版本最好glibc2.5以上的版本的,因为glibc2.4是不支持mongodb1.8以上的,但是mongodb1.8以上的支持—keyFIle参数,让服务器组更安全。而glibc2.5以上才会支持mongodb1.8以上的版本。
其他的步骤按照上面情景一。
情景四:如果想数据集的配置安全(启动mongodb的时候加上--keyFile)。
Mongodb版本1.8.2以上,linux的glibc版本2.5以上。
(1) 在配置每个库的时候都要有自己对应的keyFile文件,并且这些keyFile中的文件里面的内容必须是一样的。如果我们把这两个keyFile放到data下面的key文件夹下,取名k1,k2
(2) 我们启动mongdb的时候:
mongod –dbpath ../../data/data/data1 –port 28010 –replSet rs1 –keyFile ../../data/key/k1 |
(3) 接下来按照情景一的步骤进行操作。
如何扩展数据集?
例如现在服务器有两个192.168.1.2:28010、192.168.1.3:28011,192.168.1.2是主库,这两个库是一直运行的,在添加库的时候肯定不能把这两个库停止了,从新配置。
Mongodb中也提供了rs.add();方法可以添加外面的服务器进来。参数:’192.168.1.4:28012’。
删除也是同样的方法。