其他分享
首页 > 其他分享> > Haproxy部署及控制台使用手册

Haproxy部署及控制台使用手册

作者:互联网

一、介绍

1、简介

2、基础配置说明

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

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
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
haproxy -f /etc/haproxy.cfg [-p /var/run/haproxy.pid] -st `cat /var/run/haproxy.pid`
haproxy -f /etc/haproxy.cfg [-p /var/run/haproxy.pid] -sf `cat /var/run/haproxy.pid`
haproxy -vv

二、环境部署

1、实验环境

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

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指定内核及版本,对应版本如下:

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、启动参数及热重载

基本参数:

具体启动参数请参考官方文档:
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

页面参数详解:

2、管理模式

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

各个模式详情如下:

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

查看数据面板,数据轮询流向后台服务器

现将10.4.7.101改为MAINT维护模式

测试10.4.7.101之前连接不受影响,不会接受新的连接
断开数据库连接,再次发起数据请求,所有数据流向10.4.7.102

改回READY状态,数据流重新轮询

4、命令行操作

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

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

参数详解:

五、部署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

标签:Haproxy,haproxy,10.4,HAProxy,keepalived,使用手册,usr,控制台,local
来源: https://www.cnblogs.com/wangyuanguang/p/15095058.html