Mysql 高可用方案 Keepalived

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

1、MHA和Keepalived

  • MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
  • 该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。
  • MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。
  • MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
问题: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使用(物理机)
  • 先在一台机器上部署keepalived和mysql(mysql已默认安装)
1、查看本地ip
image.png
2、安装Keepalived
# 可直接用yum源安装
yum install keepalived

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

3、keepalived.conf
! Configuration File for keepalived 
global_defs {
    notification_email {                #关于邮件的设置
        [email protected]             #email send to
    }

    notification_email_from [email protected]
        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 脚本配置
  • 目录如下:


    image.png
  • restart.sh
# 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
  • conf 目录


    image.png
  • chk_mysql.sh
#!/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

  • keepalived.conf (配置好后把监控脚本放开)
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

此时也显示构建成功

  • 另一台物理机同理构建
  • mysql、keepalived构建成功,停掉一台机器的mysql,keepalived也随着停止,keepalived的ip会自动切换到另一台机器上,实现mysql的高可用
结语:将keepalived配合mysql的master-master双主方案,即可实现mysql的高可用
希望对你有所帮助!

你可能感兴趣的:(Mysql 高可用方案 Keepalived)