21.33 mongodb副本集介绍mysql
21.34 mongodb副本集搭建linux
21.35 mongodb副本集测试git
21.33 mongodb副本集介绍sql
像mysql主宕机以后,咱们可让从成为新的主,可是须要手动去改的,甚至新的主从关系都是要手动去改。可是mongodb副本集中他彻底都是自动的,主宕机以后,从成为了新的主,从也能够自动的识别新的主。这是他更高级的地方,很智能mongodb
1.早期版本使用master-slave,一主一从和MySQL相似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主数据库
2.目前已经淘汰master-slave模式,改成副本集,这种模式下有一个主(primary),读写,和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主vim
#目的也是实现mongodb的高可用、保证数据的安全。读写仅仅是在主上,从不须要提供服务centos
3.在此架构中还能够创建一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据安全
#arbiter用来决定你的主宕机以后,很准确的告诉你他的主断掉了。像keepalived当主挂掉以后是怎么决定主当掉了,会容易出现脑裂的状况。因此为了防止脑裂的状况就出现了arbiter这样的角色。数据库是坚定不容许出现脑裂的状况架构
4.再此架构中读写数据都是在主上,要想实现负载均衡的目的须要手动指定读库的目标server
#另外一种方式。在代码里面实现读写分离,让读的时候去其中一个从库上去读。这样也能够实现负载均衡
在从上也能够增长一个所谓的lvs这样的代理,固然从不少的状况下
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.34 mongodb副本集搭建
一.
三台机器: 192.168.133.130(primary) 192.168.133.132(secondary) 192.168.133.133(secondary)
二.
编辑三台机器的配置文件(/etc/mongod.conf ),更改或增长:
!1replication://把此行前面的#删除
oplogSizeMB: 20//前面有两个空格,加上这一行。
#这个日志相似于mysql的主从的binlog日志
#oplog大小
replSetName: aminglinux//前面有两个空格,加上这一行
#定义副本集的名字,如上为aminglinux
#复制集名称
!2还要检查bindIp: 127.0.0.1,192.168.208.128。
bindIp有没有监听本身 (内网IP)192.168.xxx.xxx
三.
分别重启三台机器
四.
链接主,在主上运行命令mongo(!哪台为主,就在哪台上操做!)
!1.>use admin
!2.>config={_id:"aminglinux",members:[{_id:0,host:"192.168.208.128:27017"},{_id:1,host:"192.168.208.130:27017"},{_id:2,host:"192.168.208.133:27017"}]}
#"aminglinux"为副本集的名字
#members:指定他的成员
!3.>rs.initiate(config)
#显示ok:1就表明成功了
!4.rs.status() //查看状态
五.
若是两个从上的状态为"stateStr" : "STARTUP"(表明还没起来),或者三台机器都是secondary并无primary。 则须要进行以下操做(从新配置一下)
> var config={_id:"aminglinux",members:[{_id:0,host:"192.168.133.130:27017"},{_id:1,host:"192.168.133.132:27017"},{_id:2,host:"192.168.133.133:27017"}]}
>rs.reconfig(config)
此时再次查看rs.status()会发现从的状态变为SECONDARY
实例:
[root@axinlinux-01 ~]# cd /etc/yum.repos.d/ #01咱们已经安装后mongodb了,把yum源拷贝在0二、03 上便可
[root@axinlinux-01 yum.repos.d]# cat mongo.repo #先cat出来
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
[root@axinlinux-02 ~]# vim /etc/yum.repos.d/mongo.repo #02 03均复制上面一段
[root@axinlinux-03 ~]# vim /etc/yum.repos.d/mongo.repo
[root@axinlinux-02 ~]# yum install -y mongodb-org #02 03yum安装便可
[root@axinlinux-03 ~]# yum install -y mongodb-org
若是下载速度太慢,到这来下载到linux上,在所有rpm -ivh安装一下就能够了
https://coding.net/u/aminglinux/p/yuanke_centos7/git/tree/master/21NOSQL/mongodb_rpm%E5%8C%85
[root@axinlinux-01 yum.repos.d]# vim /etc/mongod.conf #修改配置文件,改动后以下
replication:
oplogSizeMB: 20
replSetName: aminglinux
[root@axinlinux-01 yum.repos.d]# systemctl restart mongod #重启mongodb
[root@axinlinux-01 yum.repos.d]# ps aux |grep mongod #检查进程
mongod 4652 38.3 2.6 1018308 49688 ? Sl 14:59 0:08 /usr/bin/mongod -f /etc/mongod.conf
root 4687 0.0 0.0 112720 976 pts/0 S+ 15:00 0:00 grep --color=auto mongod
#此处须要注意,由于以前作过用户认证(--auth),要把它去掉,操做以下:(
[root@axinlinux-01 yum.repos.d]# vim /usr/lib/systemd/system/mongod.service #编辑他的启动脚本
Environment="OPTIONS=--auth -f /etc/mongod.conf" #这一行的--auth去掉便可。一旦咱们更改了这个配置文件,他会提示咱们执行daemon reload的命令,复制执行一下便可)
修改配置文件,02 03 上也要如此,直接复制过去便可,还要设置bindIp 也监听本机内网IP。这里就不作演练了
[root@axinlinux-02 ~]# systemctl start mongod #02 03均启动一下
[root@axinlinux-03 ~]# systemctl start mongod
[root@axinlinux-03 ~]# netstat -lntp #01 02 03都要监听这两个ip才能够
tcp 0 0 192.168.208.133:27017 0.0.0.0:* LISTEN 2995/mongod
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 2995/mongod
三台均关闭firewalld和selinux
[root@axinlinux-01 yum.repos.d]# mongo #直接链接主(本机上直接mongo便可进入)。即01为主
> use admin
> config={_id:"aminglinux",members:[{_id:0,host:"192.168.208.128:27017"},{_id:1,host:"192.168.208.130:27017"},{_id:2,host:"192.168.208.133:27017"}]}
{
"_id" : "aminglinux",
"members" : [
{
"_id" : 0,
"host" : "192.168.208.128:27017"
},
{
"_id" : 1,
"host" : "192.168.208.130:27017"
},
{
"_id" : 2,
"host" : "192.168.208.133:27017"
}
]
}
> rs.initiate(config)
{ "ok" : 1 }
aminglinux:OTHER> rs.status()
{
"set" : "aminglinux", #集合的名字
。。。。。
"members" : [ #成员
{
"_id" : 0,
"name" : "192.168.208.128:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", #状态为primary,就是主
。。。。。
{
"_id" : 1,
"name" : "192.168.208.130:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", #状态为secondary,就是为从
。。。。。
{
"_id" : 2,
"name" : "192.168.208.133:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY", #状态为secondary,这台也是从
。。。。。
"ok" : 1
}
aminglinux:PRIMARY> #咱们再次看命令行的前缀就自动变成了主
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.35 mongodb副本集测试
1.主上建库,建集合
>use mydb
#mydb库
>db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
#acc为测试的集合,而且插入(insert)一些数据
>show dbs
2.从上查看
>show dbs
3.若出现错误Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" },须要执行
>rs.slaveOk()
副本集更改权重模拟主宕机
1.默认三台机器权重都为1,若是任何一个权重设置为比其余的高,则该台机器立刻切换为primary角色,因此咱们预设三台机器的权重分别为:128:3,130:2,133:1
2.在主上执行
cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg) #使他生效
3.这样的话,第二个节点将会成为候选主节点。
4.主上执行 iptables -I INPUT -p tcp --dport 27017 -j DROP
实例:
测试
aminglinux:PRIMARY> use mydb
switched to db mydb
aminglinux:PRIMARY> db.acc.insert({AccountID:1,UserName:"123",password:"123456"}) #主上写数据才能够
WriteResult({ "nInserted" : 1 })
aminglinux:PRIMARY> show dbs
admin 0.000GB
db1 0.000GB
local 0.000GB
mydb 0.000GB
test 0.000GB
aminglinux:PRIMARY> use mydb
switched to db mydb
aminglinux:PRIMARY> show tables
acc
aminglinux:SECONDARY> show dbs #咱们在一个从上查看一下是否有数据
2018-11-20T16:20:00.424+0800 E QUERY [thread1] Error: listDatabases failed:{
"ok" : 0,
"errmsg" : "not master and slaveOk=false", #报错了是由于不是主。并且slaveok=false
。。。。。
aminglinux:SECONDARY> rs.slaveOk() #根据他的提示这样执行就能够了
aminglinux:SECONDARY> show dbs #咱们再来show dbs,就能够了
admin 0.000GB
db1 0.000GB
local 0.000GB
mydb 0.000GB
test 0.000GB
aminglinux:SECONDARY> use mydb
switched to db mydb
aminglinux:SECONDARY> show tables #查看集合
acc
副本集更改权重模拟主宕机
aminglinux:PRIMARY> rs.config() #rs.config()能够查看权重
。。。。。
"members" : [
{
"_id" : 0,
"host" : "192.168.208.128:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1, #能够看到权重都是1
"_id" : 1,
"host" : "192.168.208.130:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
"_id" : 2,
"host" : "192.168.208.133:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
aminglinux:PRIMARY> cfg = rs.conf()
aminglinux:PRIMARY> cfg.members[0].priority = 3
3
aminglinux:PRIMARY> cfg.members[1].priority = 2
2
aminglinux:PRIMARY> cfg.members[2].priority = 1
1
aminglinux:PRIMARY> rs.reconfig(cfg)
{ "ok" : 1 }
aminglinux:SECONDARY> rs.config() #再来查看一下新的权重。此时已经变为secondary
"_id" : 0,
"host" : "192.168.208.128:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 3,
"_id" : 1,
"host" : "192.168.208.130:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 2,
"_id" : 2,
"host" : "192.168.208.133:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,