mongodb中文社区:http://www.mongoing.com/docs/tutorial/add-replica-set-arbiter.html
MongoDB支持多个机器中通过异步复制达到故障转移和实现冗余。多机器中同一时刻只 有一台是用于写操作。正是由于这个情况,为 MongoDB 提供了数据一致性的保障。担当 Primary 角色(负责写入)的机器能把读操作分发给 slave。
本次搭建用三台机器来搭建这个复制集,其中一台primary(192.168.1.142:27017),一台secondary(192.168.1.140:27077),一台ARBITER(192.168.1.129:27088)。有一点要注意,如果复制集节点是偶数,一定要设置投票节点,不然无法确认主节点。
一、创建文件存储路径
三台机器都配置一样的路径,所以分别在三台机器创建对应目录:
mkdir -p /usr/local/mongodb/data
mkdir -p /usr/local/mongodb/logs
二、创建内部验证keyFile
1、用ssl生成key
openssl rand -base64 756 > /usr/local/mongodb/data/key/mongokey
2、设置只读权限,否则可能导致启动失败
chmod 400 /usr/local/mongodb/data/key/mongokey
3、只需生成一次keyFile文件,然后拷到对应的其他机器上,保证机器都用的同一份keyFile,权限都是只读
三、创建配置文件
配置1:primary(192.168.1.142:27017)
vi /usr/local/mongodb/bin/mongodb.cnf
dbpath = /usr/local/mongodb/data/db #数据文件存放目录
logpath = /usr/local/mongodb/logs/mongodb.log #日志文件存放目录
port = 27017 #端口
fork = true#以守护程序的方式启用,即在后台运行
#auth=true #需要认证。如果放开注释,就必须创建MongoDB的账号,使用账号与密码才可远程访问>,第一次安装建议注释
replSet=rss
bind_ip=0.0.0.0 #允许远程访问,或者直接注释,127.0.0.1是只允许本地访问.
keyFile=/usr/local/mongodb/data/key/mongokey
配置2:secondary(192.168.1.140:27077)
vi /usr/local/mongodb/bin/mongodb.cnf
dbpath = /usr/local/mongodb/data/db #数据文件存放目录
logpath = /usr/local/mongodb/logs/mongodb.log #日志文件存放目录
port = 27077 #端口
fork = true#以守护程序的方式启用,即在后台运行
#auth=true #需要认证。如果放开注释,就必须创建MongoDB的账号,使用账号与密码才可远程访问>,第一次安装建议注释
replSet=rss
bind_ip=0.0.0.0 #允许远程访问,或者直接注释,127.0.0.1是只允许本地访问.
keyFile=/usr/local/mongodb/data/key/mongokey
配置3:ARBITER(192.168.1.129:27088)
vi /usr/local/mongodb/bin/mongodb.cnf
dbpath = /usr/local/mongodb/data/db #数据文件存放目录
logpath = /usr/local/mongodb/logs/mongodb.log #日志文件存放目录
port = 27088 #端口
fork = true#以守护程序的方式启用,即在后台运行
#auth=true #需要认证。如果放开注释,就必须创建MongoDB的账号,使用账号与密码才可远程访问>,第一次安装建议注释
replSet=rss
bind_ip=0.0.0.0 #允许远程访问,或者直接注释,127.0.0.1是只允许本地访问.
keyFile=/usr/local/mongodb/data/key/mongokey
三、分别启动三个mongod,进入需要设置为主的机器上执行初始化
./mongod -f mongodb.cnf
./mongod -f mongodb.cnf
./mongod -f mongodb.cnf
mongo -port 27017
mongo -port 27077
mongo -port 27088
在27017设置主机器并初始化
mongo -port 27017
> cfg={ _id:"rss", members:[ {_id:0,host:'192.168.1.142:27017',priority:2}, {_id:1,host:'192.168.1.140:27077',priority:1}, {_id:2,host:'192.168.1.129:27088',arbiterOnly:true}] };
初始化:> rs.initiate(cfg)
四、查看状态
rs:PRIMARY> rs.status();
"stateStr" : "PRIMARY" 可以看出谁是主库
注意:如果出现报错 "codeName" : "Unauthorized",说明权限不够,需要创建权限用户,然后授权认证就可以了
use admin
db.createUser({user: "root",pwd: "2222",roles: [ { role: "root", db: "admin" } ]})
use admin
db.auth('root','2222')
五、管理维护 Replica Sets
一开始在主库27017插入数据,从库27077是查不到数据的比如:
1、先向主库插入数据
[root@localhost bin]# mongo -port 27017
rs:PRIMARY> db.c1.insert({age:30})
rs:PRIMARY> db.c1.find()
{ "_id" : ObjectId("5dba993160e80fccf5f22611"), "age" : 30 }
2、在从库进行查询等操作
[root@localhost bin]# mongo -port 27077
rs2:SECONDARY> show collections
或报错 "not master and slaveok=false"
所以执行 db.getMongo().setSlaveOk(), 我们就可查询从库了。
六、故障转移
复制集比传统的 Master-Slave 有改进的地方就是他可以进行故障的自动转移,如果我们停掉 复制集中的一个成员,那么剩余成员会再自动选举出一个成员,做为主库
七、增减节点
增加节点:重复步骤一、二,第三步骤改为在主库执行 rs.add("localhost:27074")
减少节点: rs.remove("localhost:27074")
带认证登录客户端 ./mongo -authenticationDatabase admin -u root -p 123456