1.7和1.8版本的haproxy 略有不同,从1.8.3版本开始,haproxy支持单主进程多子进程模式,类似于的Nginx的单master process进程多worker process结构,haproxy 1.8.3之前的版本是多个主进程,haproxy 1.8.3安装的时候需要安装systemd-devel提供底层编译支持,否则编译安装haproxy 的时候会报错,并且使用Ws参数启动haproxy主进程,之前的版本没有此参数,具体过程参考如下:
1.1:下载并编译安装haproxy-1.8.3:
[root@bj-zw-comm-lb-h-25-3 ~]# cd /usr/local/src/#安装基础依赖包,必须安装system-devel,如果不安装会报错 [root@bj-zw-comm-lb-h-25-3 src]# yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate [root@bj-zw-comm-lb-h-25-3 src]# tar xvf haproxy-1.8.3.tar.gz [root@bj-zw-comm-lb-h-25-3 src]# cd haproxy-1.8.3/#USE_CPU_AFFINITY=1 为开启haproxy进程与CPU核心绑定,USE_SYSTEMD=1为支持使用 -Ws参数(systemd-aware master-worker 模式)启动Haproxy,从而实现单主进程多子进程运行模式。 [root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# 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 [root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# make install PREFIX=/usr/local/haproxy [root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# cp haproxy /usr/sbin/
1.2:准备启动脚本文件:
[root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# vim /usr/lib/systemd/system/haproxy.service [Unit] Description=HAProxy Load BalancerAfter=syslog.target network.target [Service] #支持多配置文件读取,类似于从侧面是实现配置文件的include功能。 ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -c -q ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -p /run/haproxy.pid ExecReload=/bin/kill -USR2 $MAINPID [Install]WantedBy=multi-user.target
1.3:验证haproxy版本:
[root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# haproxy -v HA-Proxy version 1.8.3-205f675 2017/12/30 Copyright 2000-2017 Willy Tarreau <willy@haproxy.org>
1.4:定义简单haproxy配置文件:
[root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# mkdir /etc/haproxy [root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# mkdir /etc/haprox/conf [root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# cat /etc/haproxy/haproxy.cfg global maxconn 100000 chroot /usr/local/haproxy #stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin uid 99 gid 99 daemon nbproc 4 cpu-map 1 0 cpu-map 2 1 cpu-map 3 2 cpu-map 4 3 pidfile /usr/local/haproxy/run/haproxy.pid log 127.0.0.1 local3 info defaults option http-keep-alive option forwardfor maxconn 100000mode http timeout connect 300000ms timeout client 300000ms timeout server 300000ms listen stats mode http bind 0.0.0.0:9999 stats enable log global stats uri /haproxy-status stats auth admin:admin #状态页登录用户名:密码
[root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# cat /etc/haproxy/conf/tomcat-web.cfg #注意此处配置文件必须以.cfg结尾 listen web_port bind 0.0.0.0:80 mode http log global server web1 127.0.0.1:8080 check inter 3000 fall 2 rise 5
1.5:启动验证haproxy状态:
1.5.1:以下是1.8.3版本的单主进程多子进程模式:
[root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# systemctl daemon-reload [root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# systemctl restart haproxy [root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# cat /run/haproxy.pid 41998 [root@bj-zw-comm-lb-h-25-3 haproxy-1.8.3]# ps -ef | grep haproxy root 41998 1 0 16:27 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid nobody 41999 41998 0 16:27 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid nobody 42000 41998 0 16:27 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid nobody 42001 41998 0 16:27 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid nobody 42002 41998 0 16:27 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid root 42186 10580 0 16:28 pts/14 00:00:00 grep --color=auto haproxy
1.5.2:以下是1.7版本的传统多进程的haproxy模式:
[root@docker-server4 ~]# ps -ef | grep haproxy root 118786 1 0 17:10 ? 00:00:00 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid root 118787 118786 0 17:10 ? 00:00:00 [haproxy] <defunct> nobody 118788 1 6 17:10 ? 00:00:00 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds nobody 118789 1 6 17:10 ? 00:00:00 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds nobody 118790 1 3 17:10 ? 00:00:00 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds nobody 118791 1 5 17:10 ? 00:00:00 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds root 118814 99636 0 17:10 pts/0 00:00:00 grep --color=auto haproxy
1.5.3:以下是Nginx的单主进程多子进程模式,此模式和1.8.3版本的haproxy工作模式是类似的:
[root@docker-server5 ~]# ps -ef | grep nginx root 13399 1 0 Jan06 ? 00:00:01 nginx: master process /apps/tengine/sbin/nginx -s start devops 22165 22122 0 16:20 pts/0 00:00:00 grep --color=auto nginx zceo 22915 13399 0 Jan13 ? 00:41:41 nginx: worker process zceo 22916 13399 0 Jan13 ? 00:41:59 nginx: worker process zceo 22917 13399 0 Jan13 ? 00:41:38 nginx: worker process zceo 22918 13399 0 Jan13 ? 00:41:32 nginx: worker process zceo 22919 13399 0 Jan13 ? 00:41:22 nginx: worker process zceo 22920 13399 0 Jan13 ? 00:41:40 nginx: worker process zceo 22921 13399 0 Jan13 ? 00:42:07 nginx: worker process zceo 22922 13399 0 Jan13 ? 00:41:40 nginx: worker process
1.5.4:以下是apache的单主进程多子进程模式,也和1.8.3版本的haproxy工作模式类似:
[root@ztouch-cluster12-web1 ~]# ps -ef | grep apache root 6758 1 0 11:01 ? 00:00:00 /usr/local/apache2.2.17/bin/httpd -k start webshop 6760 6758 0 11:01 ? 00:00:00 /usr/local/apache2.2.17/bin/httpd -k start webshop 6761 6758 0 11:01 ? 00:00:02 /usr/local/apache2.2.17/bin/httpd -k start webshop 6762 6758 0 11:01 ? 00:00:03 /usr/local/apache2.2.17/bin/httpd -k start webshop 6764 6758 0 11:01 ? 00:00:03 /usr/local/apache2.2.17/bin/httpd -k start webshop 6770 6758 0 11:01 ? 00:00:03 /usr/local/apache2.2.17/bin/httpd -k start webshop 6771 6758 0 11:01 ? 00:00:03 /usr/local/apache2.2.17/bin/httpd -k start webshop 6780 6758 0 11:01 ? 00:00:02 /usr/local/apache2.2.17/bin/httpd -k start root 8076 8038 0 11:50 pts/2 00:00:00 grep apache 注意:Haproxy结合keepalived做高可用时,keepalived的主从节点监听同一VIP地址,会导致从节点的Haproxy启动失败 解决方法: 修改内核参数: echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf sysctl -p