美文网首页MySQLjavaWeb学习
Mysql 高可用方案 Keepalived

Mysql 高可用方案 Keepalived

作者: LssTechnology | 来源:发表于2020-07-28 19:40 被阅读0次
    前言:当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 {                #关于邮件的设置
            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 脚本配置
    • 目录如下:


      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

        本文链接:https://www.haomeiwen.com/subject/vgkphktx.html