MySQLjavaWeb学习

Mysql 高可用方案 Keepalived

2020-07-28  本文已影响0人  LssTechnology
前言:当mysql有了主主或者主备配置后,数据备份有了保障,但是当其中一个master挂掉后,mysql还是无法使用,本文采用Keepalived来保障一个master挂掉后,另一个master立即切换使用

1、MHA和Keepalived

问题:mysql初学者,目前在mysql的高可用架构上有些疑问。我的理解:
  1. 只使用MHA(不用使用keepalived)可以实现自动故障切换,配合master_ip_failover_script等脚本可以实现透明故障切换,以及VIP的自动漂移.
  2. 只使用keepalived (不用MHA) 也可以配置"主--从" 或者"主--主"架构,并且实现VIP的自动漂移和故障切换
我的理解
  1. 那么要MHA和keepalived从高可用架构这个角度上来说应该是完成相同功能, 只是keepalived可以实现"双主"和"主--从"架构,MHA只能实现"主--从"架构,
  2. 什么情况下应该使用MHA,什么情况下使用keepalived?
    网上找的一句户:MHA,其实是实现了数据一致性的问题的,主要考虑在master宕机了后保证slave的数据损失最小;keepalived就是实现vip的高可用而已
一 、本文采用Keepalived搭建高可用,配合mysql使用(物理机)
1、查看本地ip
image.png
2、安装Keepalived
# 可直接用yum源安装
yum install keepalived

查看keepalived的配置文件位置,修改配置文件

3、keepalived.conf
! Configuration File for keepalived 
global_defs {
    notification_email {                #关于邮件的设置
        sachin_0906@183.com             #email send to
    }

    notification_email_from notice@keepalived.cn
        smtp_server 127.0.0.1 
        smtp_connect_timeout 30
        router_id MASTER-HA
}

vrrp_script chk_mysql_port {            #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/opt/chk_mysql.sh"          #这里通过脚本监测
    interval 2                          #脚本执行间隔,每2s检测一次
    weight -5                           #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                              #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                              #检测1次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
    state MASTER                        #master1 设置为MASTER
    interface eno1                      #指定虚拟ip的网卡接口
   # mcast_src_ip 192.168.40.127         #绑定的地址
    virtual_router_id 51                #路由器标识,MASTER和BACKUP必须是一致的
    priority 101                        #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来 
    advert_int 1         
    authentication {                    #认证类型PASS|AH(IPSEC)
        auth_type PASS 
        auth_pass 1111     
    }
    virtual_ipaddress {                 #虚拟IP的设置即vip
        192.168.200.100
    }

    track_script {                      #监控脚本
        chk_mysql_port             
    }
}
4、chk_mysql.sh 脚本
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    service keepalived stop
fi

chk_mysql.sh的目的是监控mysql是否还存活,如果mysql挂掉,则停止本机器的keepalived,keepalived会自动切换另一个mysql来使用

5、启动keepalived
image.png

查看ip后,发现vip已经生成,此时通过vip 192.168.200.100访问mysql

6、在另外一台局域网机器按1-5步骤通用部署keepalived,keepalived.conf 中除了priority配置,其他可保持一致,这样两台mysql的高可用配置已经完成。可通过主动停掉mysql来进行测试,发现keepalived可以主动漂移到另一台机器的mysql使用,对外统一暴露192.168.200.100虚拟ip
二、docker版keepalived和mysql
1、拉取keepalived镜像
# 拉取镜像
docker pull leishuaishuai/keepalived:2.0
2、运行容器
2.1 脚本配置
# BEGIN ANSIBLE MANAGED BLOCK
#!/bin/bash
HOME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
docker rm -f keepalived;
docker run -d --name keepalived --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW --net=host \
    -v $HOME/conf:/usr/local/etc/keepalived \
    leishuaishuai/keepalived:2.0 --copy-service
# END ANSIBLE MANAGED BLOCK
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    echo '!3306 挂了...' > /proc/1/fd/1
    pid=$(ps x | grep keepalived | grep -v grep | awk '{print $1}')
    echo $pid > /proc/1/fd/1
    for i in $pid
    do 
        kill  $i
    done
else
    echo '!3306正常运行...' > /proc/1/fd/1
fi

global_defs {
  default_interface eth0
}

vrrp_script chk_mysql_port {            #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/usr/local/etc/keepalived/chk_mysql.sh"          #这里通过脚本监测
    interval 2                          #脚本执行间隔,每2s检测一次
    weight -5                           #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                              #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                              #检测1次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
  interface eth0

  state BACKUP
  virtual_router_id 51
  priority 150
  nopreempt

  unicast_peer {
    192.168.1.10
    192.168.1.11
  }

  virtual_ipaddress {
    192.168.200.126
  }

  authentication {
    auth_type PASS
    auth_pass d0cker
  }
 track_script {                      #监控脚本
        chk_mysql_port             
 }

  notify "/container/service/keepalived/assets/notify.sh"
}

2.2 执行脚本

bash restart.sh
查看日志
docker logs -f --tail 100 keepalived

image.png
发现此时,虚拟ip192.168.200.126已构建,并且正常监控3306端口,此时外部访问mysql可以用192.168.200.126来访问
2.3 查看ip

ip a

image.png

此时也显示构建成功

结语:将keepalived配合mysql的master-master双主方案,即可实现mysql的高可用
希望对你有所帮助!
上一篇下一篇

猜你喜欢

热点阅读