mongodb 副本集
mongodb的集群搭建方式主要有三种,主从模式,Replica set模式,sharding模式, 三种模式各有优劣,适用于不同的场合,属Replica set应用最为广泛,主从模式现在用的较少,sharding模式最为完备,但配置维护较为复杂。本节我们来看下Replica Set模式的搭建方法。
2.Replica Set模式
Replica Set模式主要包括3个部分,主节点,备节点,仲裁节点.
主节点相当于主库,所有插入,查询,修改操作都可以在主节点执行。
备节点相当于从库,用来做备份,也可以承担查询的功能,减轻主节点的压力,
仲裁节点用于当主节点宕机后,从众多备份节点中选择一个节点作为主节点,仲裁节点不承担数据的增删改查功能,主要用来选举主节点。
接下来我们看看Replica Set环境的搭建的搭建方法
1、 安装mongodb并负责三份
2、 配置三台mongodb配置
[root@jx-redis-02 mongodb-cluster]# cat mongodb-1/conf/monogdb.conf
dbpath=/data1/mongodb-cluster/mongodb-1/data/
#数据库日志存放目录
logpath=/data1/mongodb-cluster/mongodb-1/logs/mongod.log
#以追加的方式记录日志
logappend = true
#端口号 7
port=27017
#以后台方式运行进程
fork=true
#关闭http接口,默认关闭http端口访问
#nohttpinterface=true
#mongodb所绑定的ip地址
bind_ip=10.253.126.41
replSet=rs1
#启用日志文件,默认启用
journal=true
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
#quiet=true
[root@jx-redis-02 mongodb-cluster]# cat mongodb-2/conf/monogdb.conf
dbpath=/data1/mongodb-cluster/mongodb-2/data/
#数据库日志存放目录
logpath=/data1/mongodb-cluster/mongodb-2/logs/mongod.log
#以追加的方式记录日志
logappend = true
#端口号 7
port=27018
#以后台方式运行进程
fork=true
#关闭http接口,默认关闭http端口访问
#nohttpinterface=true
#mongodb所绑定的ip地址
bind_ip=10.253.126.41
replSet=rs1
#启用日志文件,默认启用
journal=true
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
#quiet=true
[root@jx-redis-02 mongodb-cluster]# cat mongodb-3/conf/monogdb.conf
dbpath=/data1/mongodb-cluster/mongodb-3/data/
#数据库日志存放目录
logpath=/data1/mongodb-cluster/mongodb-3/logs/mongod.log
#以追加的方式记录日志
logappend = true
#端口号 7
port=27019
#以后台方式运行进程
fork=true
#关闭http接口,默认关闭http端口访问
#nohttpinterface=true
#mongodb所绑定的ip地址
bind_ip=10.253.126.41
replSet=rs1
#启用日志文件,默认启用
journal=true
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
#quiet=true
3、启动
/data1/mongodb-cluster/mongodb-1/bin/mongod -f mongodb-1/conf/monogdb.conf
/data1/mongodb-cluster/mongodb-2/bin/mongod -f mongodb-2/conf/monogdb.conf
/data1/mongodb-cluster/mongodb-3/bin/mongod -f mongodb-3/conf/monogdb.conf
4、连接:
/data1/mongodb-cluster/mongodb-1/bin/mongo 10.253.126.41:27017
设置:
cfg={ _id:"rs1", members:[ {_id:0,host:'10.253.126.41:27017',priority:9}, {_id:1,host:'10.253.126.41:27018',priority:1}, {_id:2,host:'10.253.126.41:27019',arbiterOnly:true}] };
rs.initiate(cfg)
priority表示优先级别,数值越大,表示是主节点
arbiterOnly:true表示仲裁节点
可以执行rs.status()来检查执行配置结果信息。
结果里"stateStr" : "PRIMARY"表示主节点, "stateStr" : "SECONDARY"表示从节点, "stateStr" : "ARBITER",表示仲裁节点
添加一个节点 rs.add(“127.0.0.1:20180”)
删除一个节点 rs.remove(“127.0.0.1:20180”)
查看配置 rs.config()
至此副本集就创建好了,但此时副本集是任何服务器都可以连接的,并不安全。
以下开启auth认证
1、 切换到admin库创建账号
rs1:PRIMARY> use admin
rs1:PRIMARY> db.createUser({user:"root",pwd:"123456",roles:["root"]})
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
2、 生成密钥
- openssl rand -base64 666 > /data1/mongodb-cluster/mongodb-1/keyfile
3、 将密钥拷贝到其他mongodb
cp -f /data1/mongodb-cluster/mongodb-1/keyfile /data1/mongodb-cluster/mongodb-2/keyfile
cp -f /data1/mongodb-cluster/mongodb-1/keyfile /data1/mongodb-cluster/mongodb-3/keyfile
4、 设置keyfile权限为600,否则会报错,无法启动mongodb
chmod 600 /data1/mongodb-cluster/mongodb-1/keyfile
chmod 600 /data1/mongodb-cluster/mongodb-2/keyfile
chmod 600 /data1/mongodb-cluster/mongodb-3/keyfile
5、 在三台mongodb上更改monogdb.conf配置,添加如下俩句:
auth=true #开启认证
keyFile=/data1/mongodb-cluster/mongodb-1/keyfile #keyfile位置
6、 kill掉之前mongodb进程,重新启动
-----------------------<完>-----------------------------
添加仲裁者:rs.addArb(“192.168.0.1”:”123”)
或者rs.add(“_id”:3,host:”192.168.0.1:123”,arbiterOnly:true)
删除仲裁者:rs.remove (“192.168.0.1”:”123”)
副本集状态监控:https://www.cnblogs.com/kevingrace/p/8178549.html
优先级
优先级用于表示一个成员渴望成为主节点的程度。优先级的取值范围可以是0-100。默认是1,将优先级设为0,表示成员永远不能够成为主节点。这样的成员被成为被动节点。
rs.add({“_id“:4,host:”127.0.0.1:20180”,priority:99)
修改节点状态
将Primary节点降级为Secondary节点
myapp:PRIMARY> rs.stepDown()
这个命令会让primary降级为Secondary节点,并维持60s,如果这段时间内没有新的primary被选举出来,这个节点可以要求重新进行选举。
也可手动指定时间
myapp:PRIMARY> rs.stepDown(30)
冻结Secondary节点
如果需要对Primary做一下维护,但是不希望在维护的这段时间内将其它Secondary节点选举为Primary节点,可以在每次Secondary节点上执行freeze命令,强制使它们始终处于Secondary节点状态。
myapp:SECONDARY> rs.freeze(100)
注:只能在Secondary节点上执行
myapp:PRIMARY> rs.freeze(100)
{
"ok" : 0,
"errmsg" : "cannot freeze node when primary or running for election. state: Primary",
"code" : 95,
"codeName" : "NotSecondary"
}
如果要解冻Secondary节点,只需执行
myapp:SECONDARY> rs.freeze()