Haproxy部署及控制台使用手册

一、介绍

1、简介

  • HAProxy是一个使用C语言编写开源软件,提供高可用,负载均衡,以及基于TCP(四层)和HTTP(七层)的应用程序代理;
  • HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
  • 官网:http://www.haproxy.org
  • 文档:https://cbonte.github.io/haproxy-dconv/

2、基础配置说明

HAProxy配置中分成五部分内容:

  • global:  设置全局配置参数,属于进程的配置,通常是和操作系统相关。
  • defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件;
  • frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend,相当于nginx中的server{}模块;
  • backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器,相当于nginx中的upstream{}模块;
  • listen:frontend和backend的组合体。

3、程序结构

以yum安装的haproxy为例

		yum install  haproxy
		rpm -ql haproxy
			/etc/haproxy
			/etc/haproxy/haproxy.cfg
			/etc/logrotate.d/haproxy
			/etc/rc.d/init.d/haproxy
			/etc/sysconfig/haproxy
			/usr/bin/halog
			/usr/bin/iprange
			/usr/sbin/haproxy
			/usr/share/doc/haproxy-1.5.18
			/usr/share/haproxy
			/var/lib/haproxy
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
Unit file :/usr/lib/systemd/system/haproxy.service

4、基本命令

以yum安装的为例

  • 检查配置文件语法
haproxy -c -f /etc/haproxy/haproxy.cfg
  • 以daemon模式启动,以systemd管理的daemon模式启动
haproxy -D -f /etc/haproxy/haproxy.cfg [-p /var/run/haproxy.pid]
haproxy -Ds -f /etc/haproxy/haproxy.cfg [-p /var/run/haproxy.pid]
  • 启动调试功能,将显示所有连接和处理信息在屏幕
haproxy -d -f /etc/haproxy/haproxy.cfg
  • restart。需要使用st选项指定pid列表
haproxy -f /etc/haproxy.cfg [-p /var/run/haproxy.pid] -st `cat /var/run/haproxy.pid`
  • graceful restart,即reload。需要使用sf选项指定pid列表
haproxy -f /etc/haproxy.cfg [-p /var/run/haproxy.pid] -sf `cat /var/run/haproxy.pid`
  • 显示haproxy编译和启动信息
haproxy -vv

二、环境部署

1、实验环境

本手册以HAProxy分别代理nginx,mariadb为例,以keepalived为心跳服务进行讲解
版本信息如下:

  • 操作系统:Centos7.6
  • Haproxy:1.8.16
  • Keepalived:
  • Nginx与mariadb使用yum安装
    架构信息:
10.4.7.100 Client mariadb
10.4.7.101 Client mariadb nginx HAProxy Keepalived
10.4.7.102 Client mariadb nginx HAProxy Keepalived

2、nging部署

服务器:10.4.7.101/102

~]# yum -y install nginx
~]# mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak
~]# vim /usr/share/nginx/html/index.html
This is 101
~]# systemctl start nginx && systemctl enable nginx
~]# curl 127.0.0.1
This is 101

3、mariadb部署

~]# rpm -qa|grep mariadb
mariadb-libs-5.5.60-1.el7_5.x86_64
~]# rpm -e mariadb-libs-5.5.60-1.el7_5.x86_64 --nodeps
~]# yum -y install mariadb mariadb-server
~]# systemctl start mariadb && systemctl enable mariadb

设置root登录密码

~]# mysql_secure_installation
  a)为root用户设置密码(y)
  b)删除匿名账号(y)
  c)取消root用户远程登录(n)
  d)删除test库和对test库的访问权限(n)
  e)刷新授权表使修改生效(y)

设置可远程登录数据库,否则可能会出现以下报错
ERROR 1130 (HY000): Host '...' is not allowed to connect to this MariaDB server

~]# mysql -uroot -p
MariaDB [(none)]> use mysql;
MariaDB [mysql]> update user set host = '%'  where user ='root';
ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'
出现上面报错属于正常现象,查看user表上root可被访问的host是否有%
MariaDB [mysql]> select user,host from user;
+------+------------+
| user | host       |
+------+------------+
| root | %          |
| root | 10.4.7.101 |
| root | 127.0.0.1  |
| root | ::1        |
+------+------------+
4 rows in set (0.00 sec)
MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> quit

4、Lua部署(2.0版本需要)

查看lua版本号

~]# lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

下载对应版本
下载地址:http://www.lua.org/ftp/

~]# cd /opt/
opt]# mkdir src
opt]# cd src/

安装依赖

src]# yum install -y libtermcap-devel ncurses-devel libevent-devel readline-devel gcc gcc-c++
src]# wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
src]# tar -zxvf lua-5.3.5.tar.gz -C /opt/
src]# cd /opt/lua-5.3.5/
lua-5.3.5]# make linux test
make[2]: Leaving directory `/opt/lua-5.3.5/src'
make[1]: Leaving directory `/opt/lua-5.3.5/src'
src/lua -v
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
lua-5.3.5]# ln -s /opt/lua-5.3.5/src/lua /usr/bin/lua
lua-5.3.5]# lua -v
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio

三、部署haproxy

1、编译安装

安装加速包(加快编译速度,可选)

~]# yum -y install glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel

下载地址:https://www.haproxy.org/#down

~]# mkdir /opt/src
[root@10 ~]# cd /opt/src/
src]# tar -zxvf haproxy-1.8.16.tar.gz
src]# cd haproxy-1.8.16/

查看linux内核信息

haproxy-1.8.16]# uname -a
Linux 10.4.7.102 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

编译
HAProxy 1.8及1.9版本编译参数:

make ARCH=x86_64 \
TARGET=linux2628 \
USE_PCRE=1 \
USE_OPENSSL=1 \
USE_ZLIB=1 \
USE_SYSTEMD=1 \
USE_CPU_AFFINITY=1 \
PREFIX=/usr/local/haproxy-1.8.16

注释:
ARCH=x86_64表示使用ARCH指定框架,可选项
TARGET=linux2628  #通用linux内核
USE_PCRE=1  #PCRE支持正则表达式,用于用户请求的uri
USE_OPENSSL=1   #https,证书
USE_ZLIB=1   #开启压缩
USE_SYSTEMD=1   #使用systemd启动haproxy主进程
PREFIX=/usr/local/haproxy-1.8.16 #指定安装路径
编译时需要使用TARGET指定内核及版本,对应版本如下:

  • linux22    for Linux 2.2
  • linux24    for Linux 2.4 and above (default)
  • linux24e    for Linux 2.4 with support for a working epoll (> 0.21)
  • linux26    for Linux 2.6 and above
  • linux2628  for Linux 2.6.28, 3.x, and above (enables splice and tproxy)
  • solaris    for Solaris 8 or 10 (others untested)
  • freebsd    for FreeBSD 5 to 10 (others untested)
  • netbsd      for NetBSD
  • osx        for Mac OS/X
  • openbsd    for OpenBSD 5.7 and above
  • aix51      for AIX 5.1
  • aix52      for AIX 5.2
  • cygwin      for Cygwin
  • haiku      for Haiku
  • generic    for any other OS or version.
  • custom      to manually adjust every setting

HAProxy 2.0编译参数:

cd /opt/haproxy-2.0.4
make ARCH=x86_64 \
TARGET=linux-glibc \
USE_PCRE=1 \
USE_OPENSSL=1 \
USE_ZLIB=1 \
USE_SYSTEMD=1 \
USE_CPU_AFFINITY=1 \
USE_LUA=1 LUA_INC=/opt/lua-5.3.5/src/ \
LUA_LIB=/opt/lua-5.3.5/src/ \
PREFIX=/usr/local/haproxy-2.3.10

安装

haproxy-1.8.16]# make install PREFIX=/usr/local/haproxy-1.8.16

安装完成后目录结构如下,其中sbin中只有一个haproxy主程序,配置文件需要自己编辑,示例文档在/opt/src/haproxy-1.8.16/examples中

haproxy-1.8.16]# ls /usr/local/haproxy-1.8.16/
doc  sbin  share

添加软连接,保障后期升级

haproxy-1.8.16]# ln -s /usr/local/haproxy-1.8.16 /usr/local/haproxy

添加进环境变量

haproxy-1.8.16]# cp haproxy /usr/sbin/

查看版本

haproxy]# haproxy -v
HA-Proxy version 1.8.16-5c3f237 2018/12/21
Copyright 2000-2018 Willy Tarreau <willy@haproxy.org>

2、编辑主配置文件

配置文件示例可以参考/opt/src/haproxy-1.8.16/examples/目录下的文件

haproxy-1.8.16]# cd /usr/local/haproxy
haproxy]# mkdir conf
haproxy]# vim /usr/local/haproxy/conf/haproxy.cfg
global                          #全局配置
        log 127.0.0.1 local0            #开启日志,日志等级为local0
        maxconn 6000                    #定义并发最大连接数6000
        chroot /usr/local/haproxy       #程序主目录
        user root                       #用户
        group root                      #用户组
        daemon                          #以守护进程的方式运行
        pidfile     /usr/local/haproxy/haproxy.pid      #pid文件生成位置


defaults                        #默认配置
        log global                      #日志与全局配置相同
        option  dontlognull             #日志中不记录空连接
        retries 3                       #定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
        option redispatch               #定义连接失败后将会话重新调度分发
        timeout connect 10000           #设置成功连接到一台服务器的最长等待时间,默认单位是毫秒
        timeout client 300000           #设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒
        timeout server 300000           #设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒
        maxconn 4000
        fullconn 4000

listen  nginx_status            #nginx的listen
        bind 0.0.0.0:7777       #定义frontend绑定监听端口
                                #定义backend,将被frontend调度
        mode    http                    #指定负载协议类型为http
        option  httplog                  #采用http日志格式
        option  httpchk GET /index.html
        balance roundrobin              #设置haproxy的调度算法为轮询
        server 10.4.7.101 10.4.7.101:80 check port 80 inter 5s rise 2 fall 3 maxconn 2000#根据调度分配到真实的后台地址,参数解释:port 80:检测端口80, inter 5s:5秒检测一次,rise 2:检测成功2次表示服务器>可用,fall 3:检测失败3次后表示服务器不可用
        server 10.4.7.102 10.4.7.102:80 check port 80 inter 5s rise 2 fall 3 maxconn 2000
        timeout server 300000           #设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒

listen  mariadb_cluster
        bind    0.0.0.0:3366
        mode    tcp
        balance roundrobin
        server 10.4.7.101 10.4.7.101:3306 check port 3306 inter 5s rise 2 fall 3 maxconn 2000
        server 10.4.7.102 10.4.7.102:3306 check port 3306 inter 5s rise 2 fall 3 maxconn 2000

listen admin_stats              #web页面的listen
        stats   enable                  #开启统计风能
        bind    *:8888                  #监听的ip端口号
        mode    http
        stats   refresh 30s             #(可选)统计页面自动刷新时间
        stats   uri  /haproxy           #访问的uri   ip:8888/haproxy
        stats   realm haproxy_admin     #(可选)密码框提示文本
        stats   auth admin:admin        #(可选)认证用户名和密码
        stats   hide-version            #(可选)隐藏HAProxy的版本号
        stats   admin if TRUE           #管理功能,需要开启stats auth成功登陆后可通过webui管理节点

检查配置文件

haproxy]# /usr/local/haproxy/sbin/haproxy -c -f /usr/local/haproxy/conf/haproxy.cfg
Configuration file is valid

3、开启日志记录

HAProxy默认是不生成日志的,所以需要使用系统日志rsyslog服务来记录日志,配置文件中已经开启log 127.0.0.1 local0
在rsyslog配置中打开UPD功能,添加local0

haproxy]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
#haproxy
local0.*                                   /usr/local/haproxy/logs/haproxy.log
haproxy]# mkdir /usr/local/haproxy/logs

重启rsyslog生效配置

haproxy]# systemctl restart rsyslog

4、启动参数及热重载

基本参数:

  • -f:加载的配置文件,或者后面跟文件所在的目录;

  • -D :作为守护进程启动;

  • -p :在启动期间将所有进程的 pid 写入

  • -sf * :优雅启动一个新的进程,重载配置文件,启动后向旧进程发送“完成”信号 (SIGUSR1)完成要求他们完成他们正在做的事情并离开;

  • -st * : 发送“终止”信号 (SIGTERM) 到旧进程,启动完成立即终止它们而不完成它们;

  • -Ws : master-worker 模式,支持 notify 类型的 systemd 服务。
    此选项仅在使用 USE_SYSTEMD 构建 HAProxy 时可用,构建选项已启用。

具体启动参数请参考官方文档:
https://www.haproxy.org/download/2.5/doc/management.txt

启动haproxy

haproxy]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -D -p /usr/local/haproxy/haproxy.pid -sf $(cat /usr/local/haproxy/haproxy.pid)

在1.8版本之后引入了热启动-sf及-st的参数,相当于reload,这样就解决了我们在修改配置后关停服务期间导致的数据流量异常,超时连接等问题;
当我们使用-sf进行启动的时候,会发现原来的进程会继续工作,但是不会介入新的流量,直到之前的线程全部结束后自动关闭,这样新的进程启动后不会影响之前旧的进程,只会处理新的流量;
当我们使用-st的时候。新进程启动后悔强制直接杀死旧进程,不会等待它完成之前的工作,可能会造成连接异常等问题;
所以生产上建议使用-sf参数重载配置。

查看日志

haproxy]# tail -100f /usr/local/haproxy/logs/haproxy.log
Jun 18 10:32:49 localhost haproxy[27492]: Proxy nginx_status started.
Jun 18 10:32:49 localhost haproxy[27492]: Proxy mariadb_cluster started.
Jun 18 10:32:49 localhost haproxy[27492]: Proxy admin_stats started.

5、配置systemd启动

针对习惯选择是否加入system
编译时需要加入USE_SYSTEMD=1参数
编辑systemd文件,将haproxy加入到系统服务

~]# vim /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=rsyslog.target network.target
[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /usr/local/haproxy/conf/haproxy.cfg -D -p /usr/local/haproxy/haproxy.pid -sf $(cat /usr/local/haproxy/haproxy.pid)
[Install]
WantedBy=multi-user.target
~]# systemctl daemon-reload
~]# systemctl start haproxy && systemctl enable haproxy
~]# systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-06-18 16:58:23 CST; 1min 7s ago
  Process: 29246 ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -c -q (code=exited, status=0/SUCCESS)
 Main PID: 29248 (haproxy)
   CGroup: /system.slice/haproxy.service
           ├─29248 /usr/local/haproxy/sbin/haproxy -Ws -f /usr/local/haproxy/conf/haproxy.cfg
           └─29250 /usr/local/haproxy/sbin/haproxy -Ws -f /usr/local/haproxy/conf/haproxy.cfg 

Jun 18 16:58:23 10.4.7.102 systemd[1]: Unit haproxy.service entered failed state.
Jun 18 16:58:23 10.4.7.102 systemd[1]: haproxy.service failed.
Jun 18 16:58:23 10.4.7.102 systemd[1]: Starting HAProxy Load Balancer...
Jun 18 16:58:23 10.4.7.102 systemd[1]: Started HAProxy Load Balancer.
~]# ps -ef|grep haproxy
root      29248      1  0 16:58 ?        00:00:00 /usr/local/haproxy/sbin/haproxy -Ws -f /usr/local/haproxy/conf/haproxy.cfg -D -p /usr/local/haproxy/haproxy.pid -sf 40896
root      29250  29248  0 16:58 ?        00:00:00 /usr/local/haproxy/sbin/haproxy -Ws -f /usr/local/haproxy/conf/haproxy.cfg -D -p /usr/local/haproxy/haproxy.pid -sf 38626

四、HAProxy管理控制平台

1、数据面板

访问管理页面,可以看到散客listen的控制面板
http://10.4.7.102:8888/haproxy
Haproxy部署及控制台使用手册

页面参数详解:

  • Queue(等待队列)
    Cur: 当前队列等待请求数
    Max:队列最大等待请求数
    Limit:队列中等待处理的最大请求阈值(只能用于 server 字段)。若队列中等待请求的数量超过该阈值,则下一个请求将被定向到其他服务器。默认为0,表示没有限制;
  • Session rate(每秒的连接会话):
    cur: 当前每秒建立的会话数
    max:从 HAProxy 启动到现在,每秒建立的最大会话数;
    lim:每秒最多建立的会话阈值,只能用于 global 字段;
  • Sessions (当前会话数)
    Total:从 HAProxy 启动到现在,总共建立的会话数;
    Cur:当前建立连接的会话数;
    Max:从 HAProxy 启动到现在,最多同时建立的会话数;
    Limit: 最大并发会话数;
    Lbtot: 从 HAProxy 启动到现在,服务器被负载命中次数;
    Last:最新的会话创建于多久之前;
  • Bytes(出入流量)
    In:输入字节数; 
    Out:输出字节数;
  • Denied
    Req:拒绝请求的次数
    Resp:拒绝响应的次数
  • Errors
    Req:错误请求数
    Conn:错误连接数
    Resp: 错误响应数
  • Warnings
    Retr: retries重新尝试连接次数
    Redis:redispatches 重新分配次数(当 real server 挂掉后,强制定向到其他健康的服务器 );
  • Server:
    Status:状态以及该状态的持续时间,包括 UP 和 DOWN 两种状态;
    LastChk:最近一次对后端服务器进行健康检查是在多久以前、检查结果。若出错,会提示错误原因;
    Wght: (weight) : 权重
    Act: 服务器是否处于活动状态(即非备份机,服务器),活动服务器(活动状态且非宕机)的数量(backend)。活动状态完全由属性 backup 决定,就算服务器宕机,只要未指定该字段,就算活动状态。
    Bck: 服务器是否为备用机(Y:是),备用服务器(备用状态且非宕机)的数量(Backend);
    正常情况下,备用机是不对外提供服务的,只有当所有非备用机都宕机之后,备用机才会提供服务。;
    Chk:从HAProxy启动到现在,健康检测失败的累计次数;
    Down:从HAProxy启动到现在,服务器宕机的累计次数;
    Downtime: 从HAProxy启动到现在,服务器宕机的累计时间;
    Throttle: 慢启动状态;

2、管理模式

如下,可以对各个backend项的后端服务器进行管理
在左侧勾选好对应的后端节点,选择需要转换的模式,点击APPLY应用即可
Haproxy部署及控制台使用手册

各个模式详情如下:

  • Set state to READY:正常模式。若后端服务正常,则此操作后,后端服务将对外提供服务。
  • Set state to DRAIN:排干模式,新的请求不再接收,旧的请求继续等待执行完毕。
  • Set state to MAINT:维护模式。维护模式下,后端服务不再对外提供服务,并等待已有的请求结束连接,此操作会影响服 务器宕机次数 Dwn(+1)、宕机时间 Dwntme。
  • Health: disable checks:停止健康检查。
  • Health: enable checks: 启用健康检查。
  • Health: force UP:强制将健康检查结果设置为 UP。指令执行后,服务器状态会马上变成 UP, 若后续健 康检查出错,服务器仍会变成 Down。
  • Health: force NOLB:强制将服务剔除负载均衡。功能类似于 Health: force DOWN,区别在于 此操作不会影 响服务器宕机次数 Dwn、宕机时间 Dwntme。指令执行后,后端服务不 再参与负载均衡,即不对 外提供服务,若后续后端服 务恢复正常,则服务器状态会自动 转变成 UP,并继续对外提供服务。
  • Health: force DOWN: 强制将健康检查结果设置为 Down,此操作会影响服务器宕机次数 Dwn(+1)、宕机时间 Dwntme。指令执行后,后端服务会被强制下线,将不再对外提供服务,若后续后端服务恢复正常,则服务器状态会自动转变成 UP,并继续对外提供 服务。
  • kill Session:杀死所有会话。

3、服务上下线

通过更改Haproxy配置,然后热重启Haproxy(-st 指令)来上下线节点,是非常不错的方案!不过,在高频业务场景中,剔除后端节点再热重启Haproxy,可能出现业务请求异常问题,所以我们可以通过控制平台操作节点的在线状态来配合节点的平滑升级。
现在已知10.4.7.101/102安装了mariadb(3306),同时被10.4.7.101/102的haproxy(3366)代理,测试访问10.4.7.102:3366,查看访问数据流,以及haproxy控制情况

~]# mysql -u root -h 10.4.7.102 -P 3366 -p

查看数据面板,数据轮询流向后台服务器
Haproxy部署及控制台使用手册

现将10.4.7.101改为MAINT维护模式
Haproxy部署及控制台使用手册

测试10.4.7.101之前连接不受影响,不会接受新的连接
断开数据库连接,再次发起数据请求,所有数据流向10.4.7.102
Haproxy部署及控制台使用手册

改回READY状态,数据流重新轮询
Haproxy部署及控制台使用手册

4、命令行操作

~]# curl -u admin:admin -d "s=10.4.7.101&b=mariadb_cluster&action=maint" http://10.4.7.102:8888/haproxy

Haproxy部署及控制台使用手册

~]# curl -u admin:admin -d "s=10.4.7.101&b=mariadb_cluster&action=ready" http://10.4.7.102:8888/haproxy

Haproxy部署及控制台使用手册

参数详解:

  • s 表示后端标签名
  • b 表示backend标签名
  • action 表示状态

五、部署keepalived

本手册使用yum安装,二进制安装请自行解决
两台主机上都设置

haproxy]# yum -y install keepalived

1、编辑haproxy检测脚本:

用于检测haproxy是否存活,若无进程则尝试一次启动haproxy,再次检测无进程则将keepalived杀死,VIP漂移到备上

haproxy]# vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
Log=/usr/local/haproxy/logs/keepalived-ha-state.log
Pid1=`ps aux|grep /usr/local/haproxy/sbin/haproxy | grep -v grep | grep -v bash | wc -l`
if [ "$Pid1" = "0" ]; then
        echo "===========================================" >> $Log
        date  +%Y%m%d-%H:%M:%S  >> $Log
        echo "Ready to start haproxy....."  >> $Log
        /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -D -p /usr/local/haproxy/haproxy.pid -sf $(cat /usr/local/haproxy/haproxy.pid)
##启动Haproxy
        sleep 1
        Pid2=`ps aux|grep /usr/local/haproxy/sbin/haproxy | grep -v grep | grep -v bash | wc -l`
    if [ "$Pid2" = "0"  ]; then
        echo "Haproxy failed to start !!! So,stop keepalived!!!"  >> $Log
        systemctl stop keepalived
        else
        echo "Haproxy start success........." >> $Log
        fi
fi
haproxy]# chmod +x chk_haproxy.sh

2、编辑keepalived主配置文件

生产上建议采用非抢占模式,这样故障主机在修复重启keepalived后VIP不会再次漂移

~]# vim /etc/keepalived/keepalived.conf
global_defs {
   smtp_connect_timeout 30  #连接超时时间
   router_id LVS_DEVEL  #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
}
global_defs {
   smtp_connect_timeout 30  #连接超时时间
   router_id LVS_DEVEL1  #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
}
vrrp_script chk_haproxy {       #自定义的监控脚本
        script "/etc/keepalived/check_haproxy.sh"
        interval 2
        #weight 2
}
vrrp_instance VI_1 {
    state BACKUP     #指定当前节点主备关系,非抢占模式都要设置为BACKUP
    interface ens33    #承载漂移ip的网卡
    virtual_router_id 51   #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority 100          #主服务器优先级要比备服务器高,非抢占模式这个参数没有用
    nopreempt           #开启非抢占模式
    advert_int 1          #1秒互相通告一次,检查对方死了没。
    authentication {
        auth_type PASS    #认证类型
        auth_pass 1111    #认证密码
    }
    track_script {
        chk_haproxy     #自定义的监控脚本
    }
    virtual_ipaddress {
        10.4.7.99    #漂移ip
    }
}

备102上

~]# vim /etc/keepalived/keepalived.conf
global_defs {
   smtp_connect_timeout 30  #连接超时时间
   router_id LVS_DEVEL2  #运行keepalived的机器的一个标识,多个节点标识可以相同,也可以不同
}
vrrp_script chk_haproxy {       #自定义的监控脚本
        script "/etc/keepalived/check_haproxy.sh"
        interval 2
        #weight 2
}
vrrp_instance VI_1 {
    state BACKUP     #指定当前节点主备关系,非抢占模式都要设置为BACKUP
    interface ens33    #承载漂移ip的网卡
    virtual_router_id 51   #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
    priority 99          #主服务器优先级要比备服务器高,非抢占模式这个参数没有用
    nopreempt           #开启非抢占模式
    advert_int 1          #1秒互相通告一次,检查对方死了没。
    authentication {
        auth_type PASS    #认证类型
        auth_pass 1111    #认证密码
    }
    track_script {
        chk_haproxy     #自定义的监控脚本
    }
    virtual_ipaddress {
        10.4.7.99    #漂移ip
    }
}
haproxy]# systemctl start keepalived && systemctl enable keepalived

3、验证

针对haproxy进程故障:
开启keepalived后关闭haproxy进程,查看是否重新启动,并查看日志

[root@102 ~]# tail -100f /usr/local/haproxy/logs/keepalived-ha-state.log
===========================================
20210630-17:28:42
Ready to start haproxy.....
Haproxy start success.........

针对keepalived故障后VIP归属
关闭有VIP服务器上的keepalived,VIP漂移至备服务器上;
重新启动原master上的keepalived后VIP未发生漂移。

六、关于haproxy日志
由于haproxy服务的日志是系统日志产生,需要重启rsyslog,再重启haproxy后才会重新重新定向到新的文件中,否则无论是重新命名还是移动到其他目录下还是直接删除文件,都不会重新生成新的文件,也就是haproxy的一个进程在其存活过程中只会将日志输入到一个文件中,所以要做日志轮滚的话需要重启rsyslog和haproxy服务,生产上不建议这么做。

七、参考资料
Haproxy的部署及配置文件说明 - yaowx - 博客园 https://www.cnblogs.com/yaokaka/p/14241868.html
HAProxy用法详解 全网最详细中文文档 – 运维生存时间 http://www.ttlsa.com/linux/haproxy-study-tutorial/
(34条消息) HAProxy 管理控制平台_傲然君-CSDN博客_haproxy控制台 https://blog.csdn.net/u010601662/article/details/104835092
Haproxy进阶管理:命令行控制后端节点上下线 | 张戈博客 https://zhang.ge/5131.html

上一篇:Linux云计算-05_Linux软件包管理


下一篇:LVS+Keepalived群集