mongodb2.6.1和2.4变化很大,网上很多中文教程都是基于2.4来做主从设置,但是2.6完全不一样,只有参考mongodb官网的教程来推测和设置,但是英语太差,有可能有很多没理解正确。
我需要mongodb做主从设置,并且要开启认证,在2.4中,只要主从的local库有一样的用户,然后admin库里面有用户,就可以很好的开启认证。但是在2.6中,local库不能单独添加用户了,用户必须有能访问所有数据库的权限,才能访问local库,所以2.6中不能像2.4那样设置主从并且开启认证。而且2.6里面也好像基本不再推荐以前的master/slave方式,而是用replica来实现。replica再加上key认证,才能实现和主从一样的方式,并且开启了安全认证。
下面是案例:
master:127.0.0.1:30010
slave:127.0.0.1:30020
- 用openssl生成认证使用的key
Shell
1 | openssl rand-base64741>mongodb-keyfile |
系统没有openssl命令的先安装下,yum或者apt安装下。
我这里把mongodb-keyfile放到了/etc/mongodb/下面,用于认证使用。
- 生成配置文件和数据库目录
Shell
1 2 | mkdir-p/data/db_master mkdir-p/data/db_slave |
mongodb master 的配置master.conf,放在/etc/mongodb下面:
YAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | net: bindIp: 127.0.0.1
port: 30010
storage:
dbPath: "/data/db_master"
directoryPerDB: true
journal:
enabled: true
syncPeriodSecs: 15
systemLog:
destination: file
path: "/data/db_master/mongodb.log"
quiet: true
logAppend: true
security:
keyFile: "/etc/mongodb/mongodb-keyfile"
authorization: enabled
processManagement:
fork: true
operationProfiling:
slowOpThresholdMs: 100
mode: slowOp
replication:
replSetName: rs0
oplogSizeMB: 10240 |
slave的配置文件和master完全一样,只是数据库和日志文件的path修改/data/db_master/为/data/db_slave/
- 分别启动master和slave:
Shell
1 2 | numactl--interleave=all mongod--config/etc/mongodb/master.conf numactl--interleave=all mongod--config/etc/mongodb/slave.conf |
numactl –interleave=all传说可以提高mongodb在多核cpu环境下的性能,测试的时候不加也可以。
- 设置主从的replica:
下面的操作都只需要在master上操作,登陆到master:
Shell
在mongo终端下,初始化replica:
Shell
1 2 | rsconf={_id:"rs0",members:[{_id:0,host:"127.0.0.1:30010",priority:1},{_id:1,host:"127.0.0.1:30020",priority:0,votes:0}]} rs.initiate(rsconf) |
priority设置为0,这个节点就永远不会自动变成primary,也就相当于是slave了,votes为0的情况下,可以设置更多的slave节点。
- 开启认证:
这里和mongo2.4有区别,2.4需要先不用auth启动,添加admin库的用户后,再用auth启动才可以,2.6的直接刚开始就以auth启动,添加admin库的用户后,自动就开始启用auth了,还是在刚才的mongo终端下:
Shell
1 2 | useadmin db.adddUser('admin','123456') |
会提示不建议使用createUser来代替addUser,不过我觉得addUser简单点,反正能用,就用以前的命令了。现在执行show dbs会发现,已经不能查看数据库了,提示要进行认证,使用db.auth(‘admin’,’123456′)后,show dbs就可以了,这说明auth已经自动打开了。
- 主从数据同步测试:
在master上添加数据库,collection,还有一些记录进去,到slave上面去查看是否存在。
PS:slave上面必须先执行re.slaveOK()才能查看slave的数据,这也算是区分master/slave的办法之一。 --转自