(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
原文地址:https://www.cnblogs.com/gered/p/12643487.html