• (5.19)Mysql+Keepalived+HAproxy读负载均衡


    【0】项目架构

    相关概念参考:(5.17)mysql集群技术概述(LVS、Keepalived、HAproxy)

    Keepalived,只需要在负载均衡机器上配置

    而HAproxy需要在所有的4台机器上配置

    OS:CentOS7.5

    MySQL:5.7.26

    Keepalived:1.4.5

    描述  IP 主机名
    HAproxy+Keepalived:主服务器1 192.168.1.201 db
    HAproxy+Keepalived:从服务器2 192.168.1.202 db1
    HAproxy+Keepalived的虚拟地址IP(VIP) 192.168.1.210 db/db1来回切换
    Mysql:从服务器1 192.168.1.203 db2
    Mysql:从服务器2 192.168.1.204 db3

    【1】keepalived 安装配置

    【1.1】前置环境配置(允许IP非本地绑定支持、防火墙、路由转发)

    复制代码
    #(1)添加非本机IP绑定支持
    echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf
    sysctl -p
    
    #(2)配置iptables,添加VRRP通讯支持
    -A INPUT -d 224.0.0.18 -j ACCEPT #允许组播地址访问本机,组播地址用于keepalived互相检测心跳
    -A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT #允许组播地址通信
    -A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协议)通信
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCPET #开发mysql3306端口
    
    #(3)开启路由转发功能
    #临时
    echo "1">/proc/sys/net/ipv4/ip_forward
    
    #永久路由转发
    echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
    sysctl -p
    复制代码

    【1.2】下载安装 Keepalived

    复制代码
    #(1)下载
    官网:https://www.keepalived.org/download.html
    wget https://www.keepalived.org/software/keepalived-1.4.5.tar.gz
    
    #(2)安装前置依赖包
    mount /dev/cdrom /mnt #加载本地源,有网络直接配置也可(参考:yum源配置、epel源配置)
    yum install kernel-devel openssl-devel popt-devel -y
    
    #(3)安装
    cd /soft/
    tar -zxvf keepalived-1.3.3.tar.gz
    cd keepalived-1.3.4
    ./configure --prefix=/usr/local/keepalived/
    make && make install
    
    #(4)设置keepalived开机自启
    systemctl enable keepalived

    #默认日志在 /var/log/messages
    ------------下面(5)(6)可以忽略------------------------ #(5)如果不设置自定义目录,默认目录如下 #cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ #cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ #mkdir /etc/keepalived #cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ #cp /usr/local/sbin/keepalived /usr/sbin/ #(5)构建keepalived 配置文件目录与文件 mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ #(6)基本配置文件复制 cp usr/local/keepalived/sbin/keepalived /usr/sbin/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    复制代码

    【1.3】修改 Keepalived 默认日志位置

    复制代码
    #默认错误日志位置:/var/log/messages
    #(1)修改keepalived的文件
    vim /usr/local/keepalived/etc/sysconfig/keepalived
    
    #左边改成右边
    KEEPALIVED_OPTIONS="-D" =》 KEEPALIVED_OPTIONS="-D -d -S 0"   
    
    # --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
    # --dump-conf         -d    Dump the configuration data.
    # --log-detail        -D    Detailed log messages.
    # --log-facility      -S    0-7 Set local syslog facility (default=LOG_DAEMON)
    
    #(2)修改日志级别参数文件
    vi /etc/rsyslog.conf
    
    #在最后一行加上
    local0.* /var/log/keepalived.log
    
    #(3)重启日志服务
    systemctl daemon-reload systemctl restart rsyslog

    【2】HAproxy的安装与配置

    【2.1】HAproxy下载与安装

    #下载地址:
    https://src.fedoraproject.org/repo/pkgs/haproxy/
    http://download.openpkg.org/components/cache/haproxy/haproxy-1.8.25.tar.gz :
    https://pan.baidu.com/s/1NzhZc85jxOJsx9plnXi6qQ
    
    #安装:
    tar -xvf haproxy-1.8.25.tar.gz
    cd haproxy-1.8.25/
    make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy make install PREFIX=/usr/local/haproxy

    #核验:
    /usr/local/haproxy/sbin/haproxy -v

    【2.2】HAproxy开启日志(如果主机性能差的话不建议开启)

    #添加不能登录的用户 haproxy
    useradd -r -s /sbin/nologin haproxy

    #先创建好日志文件
    touch /var/log/haproxy.log
    chmod 755 /var/log/haproxy.log

    #开启日志(新建这个文件)
    vim /etc/rsyslog.conf

    #文件内容
    $ModLoad imudp #找到这2个选项,把它们打开UDP的
    $UDPServerRun 514
    local0.* /var/log/haproxy.log #这行是新家的,放到文末

    #修改日志选项
    vim /etc/sysconfig/rsyslog
    =》内容改为
    SYSLOGD_OPTIONS="-r -m 0 -c 2"

    #重启系统日志
    systemctl restart rsyslog

    【3】整合keepalived 与 haproxy 的 keepalived.conf 文件配置

    【3.1】编辑配置文件 keepalived.conf

    mkdir /etc/keepalived
    mkdir /etc/keepalived/scripts vim /etc/keepalived/keepalived.conf
    vim /etc/keepalived/keepalived.conf

    【参考代码】

    global_defs {#全局定义
       router_id HAproxy-HA #全局路由ID,主从需要相同
    }
    
    vrrp_script check_haproxy {#VRRP自定义脚本,check_run自定义名称
      script "/etc/keepalived/scripts/check_haproxy.sh" #调用的脚本文件URL
      interval 60 #运行间隔,单位为秒
    }
    
    vrrp_sync_group VG1 {#vrrp同步组,VG1是自定义名称
    group {#组内成员
      VI_1
      }
    }
    
    vrrp_instance VI_1 {#vrrp虚拟实例
        state BACKUP #从
        interface ens34 #针对监听的网络接口
        virtual_router_id 51 #唯一路由ID,主从要一致
        priority 90 #权限
        advert_int 1 #广播频率,单位是秒
        nopreempt #非抢占模式
        authentication {#同一组keepalived的验证方式
            auth_type PASS
            auth_pass 1234
        }
        track_script {#定义跟踪使用脚本
          check_run #这里就是我们上面自己定义的脚本
    } 
    notify_master /etc/keepalived/script/haproxy_master.sh #当本机换为Master状态时,会呼叫执行 notify_master
    notify_stop   /etc/keepalived/script/haproxy_stop.sh   #当本机停止keepalived 时,会呼叫执行 notify_stop
    notify_backup /etc/keepalived/script/haproxy_backup.sh #当本机进入Backup状态时,会呼叫执行 notify_backup
    notify_fault   /etc/keepalived/script/haproxy_fault.sh  #当本机发现异常情况进入Fault状态时,会呼叫执行 notify_fault
    
    virtual_ipaddress { #设置虚拟IP
      192.168.1.210 
      } 
    }

    【我的实际】直接可用的代码

    #master 
    
    global_defs {#全局定义
       router_id HAproxy-HA #全局路由ID,主从需要相同
    }
    
    vrrp_script check_haproxy {#VRRP自定义脚本,check_run自定义名称
    script "/etc/keepalived/scripts/check_haproxy.sh" #调用的脚本文件URL
    interval 60 #运行间隔,单位为秒
    }
    
    vrrp_sync_group VG1 {#vrrp同步组,VG1是自定义名称
    group {#组内成员
      VI_1
      }
    }
    
    vrrp_instance VI_1 {#vrrp虚拟实例
        state BACKUP #从
        interface ens34 #针对监听的网络接口
        virtual_router_id 51 #唯一路由ID,主从要一致
        priority 100 #权限
        advert_int 1 #广播频率,单位是秒
        nopreempt #非抢占模式
        authentication {#同一组keepalived的验证方式
            auth_type PASS
            auth_pass 1234
        }
        track_script {#定义跟踪使用脚本
          check_haproxy #这里就是我们上面自己定义的脚本
    } 
    notify_master /etc/keepalived/scripts/haproxy_master.sh #当本机换为Master状态时,会呼叫执行 notify_master
    notify_stop   /etc/keepalived/scripts/haproxy_stop.sh   #当本机停止keepalived 时,会呼叫执行 notify_stop
    notify_backup /etc/keepalived/scripts/haproxy_backup.sh #当本机进入Backup状态时,会呼叫执行 notify_backup
    notify_fault   /etc/keepalived/scripts/haproxy_fault.sh  #当本机发现异常情况进入Fault状态时,会呼叫执行 notify_fault
    
    virtual_ipaddress { #设置虚拟IP
      192.168.1.210 
      } 
    }

    slave

    #slave
    
    global_defs {#全局定义
       router_id HAproxy-HA #全局路由ID,主从需要相同
    }
    
    vrrp_script check_haproxy {#VRRP自定义脚本,check_run自定义名称
    script "/etc/keepalived/scripts/check_haproxy.sh" #调用的脚本文件URL
    interval 60 #运行间隔,单位为秒
    }
    
    vrrp_sync_group VG1 {#vrrp同步组,VG1是自定义名称
    group {#组内成员
      VI_1
      }
    }
    
    vrrp_instance VI_1 {#vrrp虚拟实例
        state BACKUP #从
        interface ens34 #针对监听的网络接口
        virtual_router_id 51 #唯一路由ID,主从要一致
        priority 90 #权限
        advert_int 1 #广播频率,单位是秒
        nopreempt #非抢占模式
        authentication {#同一组keepalived的验证方式
            auth_type PASS
            auth_pass 1234
        }
        track_script {#定义跟踪使用脚本
          check_haproxy #这里就是我们上面自己定义的脚本
    } 
    notify_master /etc/keepalived/scripts/haproxy_master.sh #当本机换为Master状态时,会呼叫执行 notify_master
    notify_stop   /etc/keepalived/scripts/haproxy_stop.sh   #当本机停止keepalived 时,会呼叫执行 notify_stop
    notify_backup /etc/keepalived/scripts/haproxy_backup.sh #当本机进入Backup状态时/即从库状态,会呼叫执行 notify_backup
    notify_fault   /etc/keepalived/scripts/haproxy_fault.sh  #当本机发现异常情况进入Fault状态时,会呼叫执行 notify_fault
    
    virtual_ipaddress { #设置虚拟IP
      192.168.1.210 
      } 
    }

    【3.2】-【3.6】在200、201这两台机器上都需要配置

    【3.2】check_haproxy.sh

    vim /etc/keepalived/scripts/check_haproxy.sh

    #!/bin/bash
    STARTHAPROXY="/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg"
    #STOPKEEPALIVED="systemctl stop keepalived"
    LOGFILE="/etc/keepalived/scripts/keepalived-haproxy-state.log"
    echo "[check_haproxy_status]" >> ${LOGFILE}
    A=`ps -C haproxy --no-header |wc -l`
    date "+%F_%T" >>${LOGFILE}
    if [ $A -eq 0 ];then
        echo ${STARTHAPROXY} >> ${LOGFILE}
        ${STARTHAPROXY} >> ${LOGFILE} 2>&1
        sleep 5
    fi
    if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
        exit 1
    else
        exit 0
    fi

    【3.3】haproxy_master.sh

    vim /etc/keepalived/scripts/haproxy_master.sh

    #!/bin/bash
    STARTHAPROXY=`/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg`
    STOPHAPROXY=`ps -ef|grep sbin/haproxy|grep -v grep|awk '{print $2}'|xargs kill -s 9`
    LOGFILE="/etc/keepalived/scripts/keepalived-haproxy-state.log"
    echo "[master]">>${LOGFILE}
    date "+%F_%T">>${LOGFILE}
    echo "Beging master......" >> ${LOGFINLE} 2>&1
    echo "Stop haproxy......" >>${LOGFILE} 2>&1
    ${STOPHAPROXY} >>${LOGFILE} 2>&1
    echo "Start haproxy">>${LOGFILE} 2>&1
    ${STARTHAPROXY} >> ${LOGFILE} 2>&1
    if [ $? -eq 0 ];then
    echo "haproxy started......">>${LOGFILE} 2>&1
    else 
    echo "[error] haproxy start failed......">>${LOGFILE} 2>&1
    fi

    【3.4】haproxy_backup.sh

    vim /etc/keepalived/scripts/haproxy_backup.sh

    #!/bin/bash
    STARTHAPROXY=`/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg`
    STOPHAPROXY=`ps -ef|grep sbin/haproxy|grep -v grep|awk '{print $2}'|xargs kill -s 9`
    echo "[master=》backup]">>${LOGFILE}
    date "+%F_%T">>${LOGFILE}
    echo "Beging master......" >> ${LOGFINLE} 2>&1
    echo "Stop haproxy......" >>${LOGFILE} 2>&1
    ${STOPHAPROXY} >>${LOGFILE} 2>&1
    echo "Start haproxy">>${LOGFILE} 2>&1
    ${STARTHAPROXY} >> ${LOGFILE} 2>&1
    if [ $? -eq 0 ];then
    echo "haproxy started......">>${LOGFILE} 2>&1
    else 
    echo "[error] haproxy start failed......">>${LOGFILE} 2>&1
    fi

    【3.5】haproxy_fault.sh

    vim /etc/keepalived/scripts/haproxy_fault.sh

    #!/bin/bash
    LOGFILE="/etc/keepalived/scripts/keepalived-haproxy-state.log"
    echo "[fault]" >>${LOGFILE}
    date "+%F_%T">>${LOGFILE}

    【3.6】haproxy_stop.sh

    vim /etc/keepalived/scripts/haproxy_stop.sh

    #!/bin/bash
    LOGFILE="/etc/keepalived/scripts/keepalived-haproxy-state.log"
    echo "[stop]" >>${LOGFILE}
    date "+%F_%T">>${LOGFILE}
    chmod 755 /etc/keepalived/scripts/*

    【4】Haproxy配置(200.201都需要)

    【4.1】参数文件 haproxy.cfg

    vim /usr/local/haproxy/haproxy.cfg

    global #全局配置参数
    log 127.0.0.1 local0 notice #设置定义日志,notice通知级别
    #user haproxy
    #group haproxy
    daemon #以后台形式运行haproxy
    #quiet
    nbproc 1 #后台运行的进程数量,可以设置多个进程提高性能(根据CPU)
    pidfile /usr/local/haproxy/haproxy.pid #haproxy的pid进程文件存放路径
    
    defaults #一些默认参数
    log global #全局日志
    retries 3 #最多重试次数,3次连接失败,就认为服务器不可用
    option dontlognull #保证haproxy不记录上次负载均衡发送过来的,用于检测存活状态但没有实际数据的心跳包。
    option redispatch #serverid 对应的服务器挂掉以后,强制执行到其他健康的服务器
    maxconn 2000 #默认最大连接数
    timeout queue 1m #等待最大时长
    timeout http-request 10s #客户端建立连接但又不请求数据的时候,超过10s,就关闭该客户端连接
    timeout connect 10s #haproxy将客户端请求转发至后端服务器所等待的超时时长
    timeout server 1m #服务端非活动状态的超时时间
    timeout client 1m #客户端非活动状态的超时时间
    timeout http-keep-alive 10s #设置 http-keep-alived的超时时间
    timeout check 10s #健康监测、心跳检测的超时时间
    balance roundrobin #负载均衡算法方式(默认就是这个RR,即轮询),(保存会话session的话,使用 源地址/cookies,针对web应用)
    
    #定义负载均衡配置
    listen mysql_slave_wgpt_lb1
      bind 192.168.1.210:3306 #绑定ip和端口(官方建议:bind *:3306,即本机所有IP通过3306均可访问负载均衡服务器)
      mode tcp  #模式是TCP(还可以7层http,4层tcp,如果是mysql用tcp,如果是weblogic/was/tomcat之类的就用http)
          option mysql-check user haproxy_check #使用haproxy_check用户去检测mysql是否存活/是否可以访问,mysql-check参数有其自己的一套检测方案,无需担心。
          stats hide-version #隐藏统计页面上的haproxy的版本信息
          balance roundrobin
     #服务器定义,check inter 2000 检测心跳评率(单位是毫秒,即2s一次),rise 2(检测2次,2次均为正常则可用),fall 5(5次失败,认为服务器不可用),maxconn 300(服务器的最大连接数300个)
          server mysql202 192.168.1.202:3306 weight 1 check inter 2000 rise 2 fall 5 maxconn 300
          server mysql203 192.168.1.203:3306 weight 1 check inter 2000 rise 2 fall 5 maxconn 300
    
    #定义自带的监控服务器页面参数配置
    listen  haproxy_stats
      mode http
      bind *:8888 #使用本机任意IP地址及8888端口可以访问
      option httplog #定义http日志
      stats refresh 5s #定义数据状态5s刷新一次
      stats uri /haproxy-stats
      stats realm haproxy monitor #页面上显示的主页文本 haproxy monitor
      stats realm Haproxy Manager #同上
      stats auth haproxy:haproxy #进入监控页面的账户密码

    【4.2】为配置文件里的配置创建mysql用户

    在mysql的master执行,比如我们这里主从是202/203,所以我们在202上执行,会通过复制传递到从库上去的

    create user haproxy_check@'192.168.1.%';
    grant usage on *.* to haproxy_check@'192.168.1.%';
    flush privileges;
    -- 查看账户
    select user,host from mysql.user;

    【4.3】启动、查看 Keepalived

    systemctl daemon-reload #重新装载服务
    systemctl start keepalived #启动服务
    systemctl enable keepalived #设置服务开机自启
    systemctl status keepalived #查看服务状态,有没有报错最快可以看这里
    ps -ef|grep keepalived|grep -v "grep" #查看服务进程

    【4.4】测试负载均衡

    mysql -uroot -p123456 -h192.168.1.210 -e"select @@hostname;"
    mysql -uroot -p123456 -h192.168.1.210 -e"show variables like 'server_id';"



     

    【4.5】通过web方式查看haproxy状态

    http://192.168.1.210:8888/haproxy-stats

       

     【4.6】宕机之后连接会定向到存活机器

      我把202主库机器的Mysql服务停掉之后,比LVS好多了,LVS坑的一批

        

    【5】keepalived状态检测脚本(防止keepalived死掉之后,切换后,原主keepalived程序不启动,导致无法再次故障转移)

    【5.1】keepcheck.sh(200.201都需要)

    vim /etc/keepalived/keepcheck.sh

    #!/bin/bash
    while [ 1 -eq 1 ]
    do
    keepalivedcheck=`ps -C keepalived --no-header |wc -l`
    if [ ${keepalivedcheck} -eq 0 ];then
        systemctl start keepalived
    fi
    sleep 5
    done

    【5.2】添加到开启自动启动

    #注意,如果用/etc/init.d/keepalived start  或者 systemctl start keepalived 起不来,可以使用 /usr/local/keepalived/sbin/keepalived start 方式来启动脚本
    
    #启动脚本
    chmod +x /etc/keepalived/keepcheck.sh
    nohup /etc/keepalived/keepcheck.sh &
    
    #写入开机自动启动
    echo "nohup /etc/keepalived/keepcheck.sh &" >>/etc/rc.local

    (可忽略)【6】定义haproxy手动启动脚本(我们之前在keepalived里已经定义启动了,这里只是方便单独使用)

    【6.1】haproxy

    vim /etc/rc.d/init.d/haproxy

    #!/bin/sh
    set -e
    PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin
    PROGDIR=/usr/local/haproxy
    PROGNAME=haproxy
    DAEMON=$PROGDIR/sbin/$PROGNAME
    CONFIG=$PROGDIR/${PROGNAME}.cfg
    PIDFILE=$PROGDIR/$PROGNAME.pid
    DESC="HAproxy daemon"
    SCRIPTNAME=/etc/init.d/$PROGNAME
    
    #Gracefully exit if the package has been removed
    test -x $DAEMON || exit 0
    
    start()
    {
    echo -n "Starting ${DESC}:${PROGNAME}"
    $DAEMON -f $CONFIG
    echo "."
    }
    
    stop()
    {
    echo -n "stopping ${DESC}:${PROGNAME}"
    haproxy_id=`cat ${PIDFILE}`
    kill -9 ${haproxy_id}
    echo "."
    }
    
    restart()
    {
    echo -n "restarting ${DESC}:${PROGNAME}"
    $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat ${PIDFILE})
    echo "."
    }
    
    case "$1" in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    restart
    ;;
    *)
    echo "Usage:$SCRIPTNAME {start|stop|restart}" >&2
    exit 1
    ;;
    esac
    exit 0

    【6.2】授权、添加到开机启动脚本

    chmod +x /etc/rc.d/init.d/haproxy
    echo "nohup /etc/rc.d/init.d/haproxy start &" >> /etc/rc.d/rc.local
  • 相关阅读:
    springboot整合springmvc原理
    springboot Thymeleaf
    springboot 首页处理
    springboot整合Druid
    springboot 整合JDBC
    CentOS安装Mysql
    springboot 多环境切换
    springboot JSR303数据校验
    【转载】WEB架构师成长之路
    一些想法
  • 原文地址:https://www.cnblogs.com/gered/p/12643487.html
Copyright © 2020-2023  润新知