Modify by lyc at 2019-12-23:Write
Modify by lyc at 2019-12-23:优化文档
HAProxy 官网
CQ.HAProxy 1.8入门指南
骏马金龙-安装haproxy和haproxy命令

1.查看系统内核版本

查看当前操作系统内核版本

1
2
3
4
5
$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)

$ uname -r
3.10.0-1062.9.1.el7.x86_64

HAProxy 1.8支持的 OS

make时需要使用TARGET指定内核及版本,版本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
To build haproxy, you have to choose your target OS amongst the following ones
and assign it to the TARGET variable :

- 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) #<== CentOS7 匹配该版本
- 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

2.HAProxy 安装

How to install HAProxy load balancer on CentOS

配置内核参数

(转)haproxy启动故障:Starting proxy:cannot bind socke

haproxy备机上无法监听vip,因为vip在主机上

1
2
3
4
5
$ vim /etc/sysctl.conf 
net.ipv4.ip_nonlocal_bind = 1 # 启动haproxy的时候,允许忽视VIP的存在
net.ipv4.ip_forward = 1 # 打开linux内核转发功能

$ sysctl -p

安装 HAProxy

openssl升级到最新版 yum update -y openssl openssl-devel

1
2
3
4
5
6
7
8
9
10
$ useradd -s /sbin/nologin -M haproxy
$ yum install -y gcc pcre pcre-devel openssl openssl-devel make psmisc systemd-devel
$ cd /usr/local/src
$ wget https://www.haproxy.org/download/1.8/src/haproxy-1.8.28.tar.gz
$ tar xf haproxy-1.8.28.tar.gz && cd /usr/local/src/haproxy-1.8.28
$ make TARGET=linux2628 USE_OPENSSL=1 ADDLIB=-ldl USE_ZLIB=1 USE_PCRE=1 USE_SYSTEMD=1
$ make install PREFIX=/usr/local/haproxy-1.8.28
$ ln -s /usr/local/haproxy-1.8.28 /usr/local/haproxy
$ mkdir -p {/usr/local/haproxy/etc,/var/lib/haproxy}
$ chown haproxy:haproxy -R /usr/local/haproxy-1.8.28

3.配置文件

Haproxy 1.8.x 的安装与配置解析
haproxy配置文件详解和ACL功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$ vim /usr/local/haproxy/etc/haproxy.cfg
global
daemon
log 127.0.0.1 local3 warning
chroot /usr/local/haproxy
pidfile /usr/local/haproxy/run/haproxy.pid
maxconn 50000
user haproxy
group haproxy

defaults
log global
mode tcp
balance roundrobin
retries 3
option redispatch
option dontlognull
option abortonclose
option http-server-close
# option forwardfor except 127.0.0.0/8
timeout connect 60s
timeout client 600s
timeout server 600s
timeout check 5s


#####==================== tandy mysql =====================
listen tandy_mysql_read_3306
bind *:3306
mode tcp
timeout client 10800s
timeout server 10800s
balance leastconn
server mysql_slave1_000001_3306 10.19.0.1:3306 check inter 3s rise 5 fall 6 weight 10
server mysql_slave2_000002_3306 10.19.0.2:3306 check inter 3s rise 5 fall 6 weight 10
server mysql_master_000003_3306 10.19.0.3:3306 check inter 3s rise 5 fall 6 weight 10 backup

4.HAProxy 配置独立日志(可选)

HAproxy开启日志记录

默认HAProxy的日志会记录到 /var/log/messages 中。可以配置HAProxy使其记录到其它文件中,便于排障。

配置 /etc/rsyslog.conf

由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听

1
2
3
4
$ vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
local3.* /var/log/haproxy.log

配置 /etc/sysconfig/rsyslog

1
2
3
4
5
6
$ vim /etc/sysconfig/rsyslog
# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-r -m 0 -c 2"

参数说明:

  • -r 开启远程日志
  • -m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能
  • -c 2 使用兼容模式,默认是 -c 5

rsyslogd 重启

1
2
$ rsyslogd -N1
$ systemctl restart rsyslog

5.harpoxy 服务管理

启动脚本

1
2
$ cp /usr/local/src/haproxy-1.8.21/contrib/systemd/haproxy.service.in /etc/systemd/system/haproxy.service
$ chmod +x /etc/systemd/system/haproxy.service

修改启动脚本

这里使用 restart 的方式来 reload 加载配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat /etc/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=network.target

[Service]
Environment="CONFIG=/usr/local/haproxy/etc/haproxy.cfg" "PIDFILE=/var/run/haproxy.pid"
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f $CONFIG -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE
ExecReload=/usr/local/haproxy/sbin/haproxy -f $CONFIG -p $PIDFILE -st $MAINPID
#ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
Restart=always
SuccessExitStatus=143
Type=notify

[Install]
WantedBy=multi-user.target

启动服务

1
2
3
$ systemctl daemon-reload
$ systemctl enable haproxy
$ systemctl start haproxy

6.haproxy 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 检查配置文件语法
$ /usr/local/haproxy/sbin/haproxy -c -f /usr/local/haproxy/etc/haproxy.cfg

# 以daemon模式启动,以systemd管理的daemon模式启动
$ /usr/local/haproxy/sbin/haproxy -W -f /usr/local/haproxy/etc/haproxy.cfg [-p /var/run/haproxy.pid]
$ /usr/local/haproxy/sbin/haproxy -Ws -f /usr/local/haproxy/etc/haproxy.cfg [-p /var/run/haproxy.pid]

# 启动调试功能,将显示所有连接和处理信息在屏幕
$ /usr/local/haproxy/sbin/haproxy -d -f /usr/local/haproxy/etc/haproxy.cfg

# restart。需要使用st选项指定pid列表
$ /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg [-p /var/run/haproxy.pid] -st `cat /var/run/haproxy.pid`

# reload(graceful restart)需要使用sf选项指定pid列表
$ /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg [-p /var/run/haproxy.pid] -sf `cat /var/run/haproxy.pid`

# 显示haproxy编译和启动信息
$ /usr/local/haproxy/sbin/haproxy -vv
  • restart 会直接关掉旧进程并建立新进程,所以会丢弃大量已建立的连接。
  • reload 会启动新进程,但旧进程会先处理完当前已建立连接然后再关闭。但是,reload仍然会丢弃极少量的连接,虽然大多数情况下这足够完美了,但是在极度严格的环境下,这是不允许的。

我们使用haproxy来做mysql,redis 四层读写分离中间件时,必须使用restart命令来进行切换。否则如果切Write,连接没有完全断开,那么两边mysql都会写入,后果不堪设想。