haproxy高可用、负载均衡集群

  HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。另外其支持从4层至7层的网络交换,即覆盖所有的TCP协议,换而言之,Haproxy 甚至还支持Mysql的均衡负载。

  HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

  在功能上haproxy通过反向代理方式实现Web负载均衡,和nginx、ApacheProxy、lighttpd、Cheroke等一样。不同点在于,haproxy并不是Web服务器,前面提到的所有带反向代理负载均衡产品,都是Web服务器。简单来说就是,haproxy仅仅是一款负载均衡的应用代理程序,本身不提供Web服务。

  haproxy配置简单,拥有非常不错的服务器健康检查功能,还有专门的系统状态监控页面。当其代理的后端服务器出现故障,haproxy会自动将该服务器剔除,故障恢复后再自动加入。

  下载地址:https://github.com/haproxy/haproxy/releases/

(1).haproxy的负载均衡算法

  haproxy的负载均衡算法配置在etc/haproxy.cfg中balance参数,与server参数配合使用。haproxy提供来8种负载均很算法:roundrobin根据权重轮询(动态)、static-rr根据权重轮询(静态)、source根据请求源IP、leastconn最少连接者先处理、uri根据请求的uri、url_param根据请求的url参数、rdp-cookie据据cookie(name)来锁定并哈希每一次请求、hdr(name)根据HTTP请求头来锁定每一次HTTP请求。

  我是没发现动态权重分配和静态权重分配有什么区别。

  详细查看:https://blog.csdn.net/eddie_cm/article/details/79796883

  haproxy配置文件参数详细介绍:https://blog.csdn.net/wngua/article/details/54618299

(2).实验环境

youxi1  192.168.1.6  负载均衡器(haproxy)

youxi2  192.168.1.7  主机1

youxi3  192.168.1.8  主机2

(3).实验

 1)负载均衡器youxi1上安装配置haproxy

  安装依赖包

[root@youxi1 ~]# yum -y install make gcc gcc-c++ openssl-devel

  将下载好的安装包上传到服务器上,解压安装

[root@youxi1 ~]# tar -xf haproxy-1.7.9.tar -C /usr/local/src/  //解压
[root@youxi1 ~]# cd /usr/local/src/haproxy-1.7.9/
[root@youxi1 haproxy-1.7.9]# cat README  //找到如下部分
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)
- 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
[root@youxi1 haproxy-1.7.9]# uname -r  //与上面的信息对照,找到TARGET对应的值
3.10.0-957.el7.x86_64
//与其他的不同,这里使用的make生成的Makefile,不过虽然添加来参数但Makefile里根本没有写上,还得进去改
[root@youxi1 haproxy-1.7.9]# make TARGET=linux2628 PREFIX=/usr/local/haproxy
[root@youxi1 haproxy-1.7.9]# vim Makefile  //修改如下参数,也可以注意下CPU参数
PREFIX = /usr/local/haproxy  //第94行
TARGET = linux2628  //第104行
[root@youxi1 haproxy-1.7.9]# make install
install -d "/usr/local/haproxy/sbin"
install haproxy haproxy-systemd-wrapper "/usr/local/haproxy/sbin"
install -d "/usr/local/haproxy/share/man"/man1
install -m 644 doc/haproxy.1 "/usr/local/haproxy/share/man"/man1
install -d "/usr/local/haproxy/doc/haproxy"
for x in configuration management architecture cookie-options lua WURFL-device-detection proxy-protocol linux-syn-cookies network-namespaces DeviceAtlas-device-detection 51Degrees-device-detection
netscaler-client-ip-insertion-protocol close-options SPOE intro; do \
install -m 644 doc/$x.txt "/usr/local/haproxy/doc/haproxy" ; \
done
[root@youxi1 haproxy-1.7.9]# echo $?
0
[root@youxi1 haproxy-1.7.9]# ls /usr/local/haproxy/
doc sbin share  //总共就这三个目录,安装完成后看一下

  手动创建haproxy配置文件

[root@youxi1 haproxy-1.7.9]# mkdir /usr/local/haproxy/etc
[root@youxi1 haproxy-1.7.9]# vim /usr/local/haproxy/etc/haproxy.cfg
global #全局配置
#定义全局的syslog服务器,最多可以定义两个。
#格式log [IP地址] [日志设备] [日志级别]
#日志设备必须是以下24种标准syslog设备之一:
#kern、user、mail、daemon、auth、syslog、lpr、news、uucp、cron、auth2、ftp、ntp、
#audit、alert、cron2、local0、local1、local2、local3、local4、local5、local6、local7
#这里的日志设备要与/etc/syslog.conf中定义的日志收集保持一致。
#日志级别有四种:err、warning、info、debug,默认为info
log 127.0.0.1 local0
maxconn 4096 #最大连接数
chroot /usr/local/haproxy #当前工作目录
uid 99 #所属运行的用户uid,也可以使用user [用户名]
gid 99 #所属运行的用户组id,也可以使用group [组名]
daemon #以后台形式运行haproxy
#启动haproxy进程个数。实际工作中,进程个数一般与CPU核心数一样。这样可以发挥出最大的性能
nbproc 1
pidfile /usr/local/haproxy/run/haproxy.pid #pid文件存放位置
#debug #调试模式,输出启动信息到标准输出。调错时使用
#quiet #静默模式,启动时无输出 defaults #默认设置
log global #应用全局的日志配置
#日志文件的输出定向。产生的日志级别为local3. 系统中local1-7,用户自己定义
log 127.0.0.1 local3
#工作模式,所处理的协议类型
#参数值可以为http|tcp|health,默认采用http模式
#tcp是4层,http是7层,health只会返回OK
mode http
option httplog #日志类别,记载http日志
#每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
option httpclose
option dontlognull #不记录空连接产生的日志
#如果后端服务器需要获得客户端真实ip,需要配置此参数,可以从Http Header中获得客户端ip
option forwardfor
option redispatch #当serverid对应的服务器挂掉后,强制定向到其他健康服务器
retries 2 #2次连接失败就认为服务器不可用,主要通过后面的check检查
maxconn 2000 #最大连接数
balance roundrobin #负载均衡算法
#haproxy监控页面的访问地址,可通过http://localhost:80/haproxy-stats访问
stats uri /haproxy-stats
timeout connect 5000 #连接超时时间,单位:ms毫秒。等同contimeout
timeout client 50000 #客户端连接超时时间。等同clitimeout
timeout server 50000 #服务器端连接超时时间。等同srvtimeout
mode http
#健康检测,完整格式为option httpchk <method> <uri> <version>
#注意实际工作中测试时,应该下载某一个页面来进行测试,
#因此这个页面应该是个小页面,而不要用首页面。这里是每隔一秒检查一次页面。
option httpchk GET /index.html frontend http #前端配置,接收请求的端口组,http名称可自定义
bind 0.0.0.0:80 #监听端口,发起http请求到80端口,会被转发到设置的后端ip及端口
default_backend http_back #转发到后端,后端名http_back可以自定义 backend http_back #后端配置,后端名需要与前端配置的保持一致
server s1 192.168.1.7:80 weight 3 check #后端的主机IP、端口和权衡
server s2 192.168.1.8:80 weight 3 check #后端的主机IP、端口和权衡

  上面的uid99,和gid99都是nobody,系统自带的。

[root@youxi1 haproxy-1.7.9]# id nobody
uid=99(nobody) gid=99(nobody) 组=99(nobody)

  另外,后端服务器配置格式为server [服务器名称] [IP地址:端口号] [参数],参数如下:

backup:设定为备用服务器,仅在负载均衡场景中的其他server均不可以启用此server
check:启动对此server执行监控状态检查,其可以借助于额外的其他参数完成更精细的设定,如:
inter: 设定监控状态检查的时间间隔,单位为毫秒,默认为2000,也可以使用fastinter和downinter来根据服务器端专题优化此事件延迟
rise:设定检查状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数
fall:设定检查状态检查中,某离线的server从正常状态转换至离线状态需要成功检查的次数
cookie:为指定server设定cookie值,此处指定的值将会在请求入站时被检查,第一次为此值挑选的server将会倍后续的请求所选中,其目的在于实现持久连接的功能
maxconn:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其他连接被释放
maxqueue:通过观察服务器的通信状况来判断其健康状态,默认为禁用,其支持的类型有“layer 4”和“layer 7”,“layer 7”仅能用于http代理场景
redir:启用重定向功能,将发往此服务的GET和HEAD请求均以302状态码响应,需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以避免造成循环,例如
  server srv1 192..168.1.202:80 redir http://imageserver.wangfeng7399.com check
weight: 权重,默认为1,最大值为256,0表示不参与负载均衡

  配置文件参数详细查看:https://blog.csdn.net/wngua/article/details/54618299

  生成haproxy的启动脚本,改太麻烦了直接复制好了。注意:这是解压目录下的examples/haproxy.init修改来的,不过reload是有问题的。想要reload需要手动输入命令。

[root@youxi1 haproxy-1.7.9]# vim /etc/init.d/haproxy
#!/bin/sh
# chkconfig: - 85 15
# description: HA-Proxy server
# processname: haproxy
# config: /usr/local/haproxy/etc/haproxy.cfg
# Source function library.
if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi # Source networking configuration.
. /etc/sysconfig/network # Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0 # This is our service name
BASENAME=`haproxy` BIN=/usr/sbin/haproxy CFG=/usr/local/haproxy/etc/haproxy.cfg
[ -f $CFG ] || exit 1 PIDFILE=/usr/local/haproxy/run/haproxy.pid
LOCKFILE=/usr/local/haproxy/run/haproxy RETVAL=0 start() {
quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi echo -n "Starting $BASENAME: "
daemon $BIN -D -f $CFG -p $PIDFILE
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $LOCKFILE
return $RETVAL
} stop() {
echo -n "Shutting down $BASENAME: "
killproc $BASENAME -USR1
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f $LOCKFILE
[ $RETVAL -eq 0 ] && rm -f $PIDFILE
return $RETVAL
} restart() {
quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi
stop
start
} reload() {
if ! [ -s $PIDFILE ]; then
return 0
fi quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi
$BIN -D -f $CFG -p $PIDFILE -sf $(cat $PIDFILE)
} check() {
$BIN -c -q -V -f $CFG
} quiet_check() {
$BIN -c -q -f $CFG
} rhstatus() {
status $BASENAME
} condrestart() {
[ -e $LOCKFILE ] && restart || :
} # See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
condrestart)
condrestart
;;
status)
rhstatus
;;
check)
check
;;
*)
echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}"
exit 1
esac exit $?
[root@youxi1 haproxy-1.7.9]# chmod +x !$  //添加执行权限
chmod +x /etc/init.d/haproxy

  做一个软连接给启动脚本使用(添加环境变量没有试过),也可以直接复制过去

[root@youxi1 haproxy-1.7.9]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/
[root@youxi1 haproxy-1.7.9]# ll /usr/sbin/haproxy
lrwxrwxrwx 1 root root 31 7月 21 01:28 /usr/sbin/haproxy -> /usr/local/haproxy/sbin/haproxy

  创建pid存放目录,并修改haproxy的所属主

[root@youxi1 haproxy-1.7.9]# mkdir /usr/local/haproxy/run
[root@youxi1 haproxy-1.7.9]# chown -R nobody /usr/local/haproxy
[root@youxi1 haproxy-1.7.9]# ll -d /usr/local/haproxy
drwxr-xr-x 7 nobody root 64 7月 21 01:31 /usr/local/haproxy

  配置日志收集文件

[root@youxi1 haproxy-1.7.9]# vim /etc/rsyslog.conf
$ModLoad imudp//第15~16行去除注释
$UDPServerRun 514
local7.*  /var/log/boot.log  //这一行是第73行,在这一行下面添加两行
local3.*  /var/log/haproxy.log  //需要与上面的haproxy配置文件对应
local0.*  /var/log/haproxy.log
[root@youxi1 haproxy-1.7.9]# systemctl restart rsyslog

  启动

#方法一
[root@youxi1 haproxy-1.7.9]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
[root@youxi1 haproxy-1.7.9]# ps aux | grep haproxy
nobody 10654 0.0 0.0 12272 808 ? Ss 01:39 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg
root 10656 0.0 0.0 112724 996 pts/0 S+ 01:40 0:00 grep --color=auto haproxy #方法二
[root@youxi1 ~]# /etc/init.d/haproxy start
Reloading systemd: [ 确定 ]
Starting haproxy (via systemctl): [ 确定 ]
[root@youxi1 ~]# ps aux | grep haproxy
//两行Message信息提示服务器不可用,因为还没有配置,显示的比较慢,直接<Enter>就可以了
Message from syslogd@localhost at Jul 21 01:43:02 ...
haproxy[10763]: backend http_back has no server available! Message from syslogd@localhost at Jul 21 01:43:02 ...
haproxy[10763]: backend http_back has no server available! nobody 10763 0.0 0.0 12272 804 ? Ss 01:42 0:00 /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid
root 10766 0.0 0.0 112724 992 pts/0 S+ 01:43 0:00 grep --color=auto haproxy

  特别说明reload手动输入命令该怎么做,主要是不停服务重新加载配置文件,平滑过渡

//首先使用ps aux | grep haproxy查看有几个进程
[root@youxi1 ~]# ps aux | grep haproxy
nobody 7224 0.0 0.0 12272 828 ? Ss 16:57 0:00 /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid
root 7511 0.0 0.0 112724 996 pts/0 S+ 16:58 0:00 grep --color=auto haproxy //如果只有一个进程,那么把上面的命令复制一下,追加-sf [pid]
[root@youxi1 ~]# /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid -sf 7224
[root@youxi1 ~]# ps aux | grep haproxy
nobody 7513 0.0 0.0 12272 824 ? Ss 17:00 0:00 /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid -sf 7224
root 7516 0.0 0.0 112724 996 pts/0 S+ 17:00 0:00 grep --color=auto haproxy //如果是多个命令,或者不想看PID,也可以复制上面的命令,最佳-sf $(cat /usr/local/haproxy/run/haproxy.pid)
[root@youxi1 ~]# /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid -sf $(cat /usr/local/haproxy/run/haproxy.pid)
[root@youxi1 ~]# ps aux | grep haproxy
nobody 7532 0.0 0.0 12272 824 ? Ss 17:03 0:00 /usr/sbin/haproxy -D -f /usr/local/haproxy/etc/haproxy.cfg -p /usr/local/haproxy/run/haproxy.pid -sf 7513
root 7534 0.0 0.0 112724 992 pts/0 S+ 17:03 0:00 grep --color=auto haproxy

  添加开机自启

[root@youxi1 ~]# chkconfig --add haproxy
[root@youxi1 ~]# chkconfig --list haproxy
haproxy 0:关 1:关 2:关 3:关 4:关 5:关 6:关
[root@youxi1 ~]# chkconfig haproxy on
[root@youxi1 ~]# chkconfig --list haproxy
haproxy 0:关 1:关 2:开 3:开 4:开 5:开 6:关

  结束所有haproxy,使用killall(不要用killall5,好像会导致断开,可能是我用的有问题吧),如果没有killall使用命令yum -y install psmisc安装

[root@youxi1 ~]# killall haproxy
[root@youxi1 ~]# ps aux | grep haproxy
root 10786 0.0 0.0 112724 996 pts/0 S+ 01:44 0:00 grep --color=auto haproxy

  如果防火墙开启来记得添加端口号

[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success

 2)配置后端服务器youxi2和youxi3

  我这边做实验,一切从简。

[root@youxi2 ~]# yum -y install httpd php
[root@youxi2 ~]# echo youxi2 > /var/www/html/index.html
[root@youxi2 ~]# systemctl start httpd
[root@youxi2 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service. [root@youxi1 ~]# yum -y install httpd php
[root@youxi1 ~]# echo youxi3 > /var/www/html/index.html
[root@youxi1 ~]# systemctl start httpd
[root@youxi1 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

  防火墙启动时记得添加端口号

[root@youxi2 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success [root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success

 3)测试

  首先查看下监控页面

haproxy高可用、负载均衡集群

  然后直接访问负载均衡器

haproxy高可用、负载均衡集群haproxy高可用、负载均衡集群

  此时回头看监控页面,可以看出是平均分配的

haproxy高可用、负载均衡集群

参考:https://www.cnblogs.com/happy1983/p/9265358.html

上一篇:ubuntu操作系统apt包管理工具


下一篇:[bzoj1935][shoi2007]Tree 园丁的烦恼(树状数组+离线)