Haproxy+Keepalived
Haproxy
对比LVS
-
LVS在企业应用中抗负载能力很强,但存在不足
LVS不支持正则处理,不能实现动静分离
对于大型网站,LVS的实施配置复杂,维护成本相对较高 -
Haproxy是一款提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件
适用于负载大的Web站点
运行在硬件上可支持数以万计的并发连接的连接请求
Haproxy调度算法
1.RR
RR算法是最简单最常用的一种算法,即轮询调度
理解举例
有三个节点A、B、C
第一个用户访问会被指派到节点A
第二个用户访问会被指派到节点B
第三个用户访问会被指派到节点C
第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果
2.LC
最小连接数算法,根据后端的节点连接数大小动态分配前端请求
理解举例
有三个节点A、B、C,各节点的连接数分别为A:4、B:5、C:6
第一个用户连接请求,会被指派到A上,连接数变为A:5、B:5、C:6
第二个用户请求会继续分配到A上,连接数变为A:6、B:5、C:6;再有新的请求会分配给B,每次将新的请求指派给连接数最小的客户端
由于实际情况下A、B、C的连接数会动态释放,很难会出现一样连接数的情况
此算法相比较rr算法有很大改进,是目前用到比较多的一种算法
3.SH
基于来源访问调度算法,用于一些Session会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度
理解举例
有三个节点A、B、C,第一个用户第一次访问被指派到了A,第二个用户第一次访问被指派到了B
当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡调度器不重启,第一个用户访问都会被指派到A,第二个用户访问都会被指派到B,实现群集的调度
此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用
Haproxy+Keepalived项目实例
本项目包含主、备两台调度器,两台节点服务器,一台NFS共享存储服务器
NFS
192.168.10.16
yum -y install nfs-utils rpcbind
mkdir -p /opt/web1
mkdir -p /opt/web2
vi /etc/exports
/opt/web1 192.168.10.14(ro)
/opt/web2 192.168.10.15/32(ro)
systemctl start nfs
systemctl stop firewalld
setenforce 0
showmount -e #查看本机共享存储发布情况
server1
192.168.10.14
yum -y install gcc gcc-c++ pcre-devel zlib-devel
useradd -M -s /sbin/nologin nginx
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
nginx #启动nginx
netstats -napt | grep nginx #检查80号端口是否开启
showmount -e 192.168.10.16 #查看nfs共享目录发布情况
mount 192.168.10.16:/opt/web1 /usr/local/nginx/html/
server2
192.168.10.15
yum -y install gcc gcc-c++ pcre-devel zlib-devel
useradd -M -s /sbin/nologin nginx
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
nginx #启动nginx
netstats -napt | grep nginx #检查80号端口是否开启
showmount -e 192.168.10.16 #查看nfs共享目录发布情况
mount 192.168.10.16:/opt/web2 /usr/local/nginx/html/
主调度器
192.168.10.12
yum -y install gcc gcc-c++ make pcre-devel bzip2-devel
tar -zxvf haproxy-1.4.24.tar.gz
cd haproxy-1.4.24
make TARGET=linux26 #定义内核
make install
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
vi /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log /dev/log local0 info
log /dev/log local0 notice
#log loghost local0 info
maxconn 4096
#chroot /usr/share/haproxy #注释此项
uid 99
gid 99
daemon #守护进程模式
#debug
#quiet
#nbproc 2 #负载均衡并发连接数
defaults
log global #定义日志为global配置中的日志定义
mode http #模式为http
option httplog #采用http日志格式记录日志
option dontlognull #
#option http-server-close #主动关闭http请求选项,建议在生产环境中使用
retries 3 #重试次数,用于对群集节点的检查
#redispatch #注释此项
maxconn 2000 #最大连接数,根据应用实际情况进行调整
contimeout 5000 #连接超时时间(ms)
clitimeout 50000 #客户端超时时间(ms)
srvtimeout 50000 #服务器超时时间(ms)
listen webcluster 0.0.0.0:80 #定义一个应用为webcluster
option httpchk GET /index.html #检查服务器的index.html文件
balance roundrobin #负载均衡调度算法为轮询rr
server web1 192.168.10.14:80 check inter 2000 fall 3 #定义节点1
server web2 192.168.10.15:80 check inter 2000 fall 3 #定义节点2
cd haproxy-1.4.24
cp examples/haproxy.init /etc/init.d/haproxy
vi /etc/init.d/haproxy
# chkconfig: 35 85 15
chmod +x /etc/init.d/haproxy
chkconfig --add haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
systemctl start haproxy ##启动haproxy服务
定义功能项
vi /etc/haproxy/haproxy.cfg
log /dev/log local0 notice
log /dev/log local0 info
touch /etc/rsyslog.d/haproxy.conf
vi /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
/var/log/haproxy/haproxy-info.log #调度信息日志
/var/log/haproxy/haproxy-notice.log #启动信息日志
配置统计页面
vi /etc/haproxy/haproxy.cfg
##最后添加
listen admin_stats
bind 0.0.0.0:1080 ##设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
mode http #http7层模式
option httplog #采用http日志格式
#log 127.0.0.1 local0 err #错误日志记录
maxconn 10 #默认最大连接数
stats refresh 30s #统计页面自动刷新时间
stats uri /stats #统计页面url
stats realm XingCloud\ Haproxy #统计页面密码框上提示文本
stats auth admin:admin #设置监控页面的用户名和密码:admin,可以设置多个用户名
stats auth Frank:Frank #设置监控页面的用户和密码:Frank
stats hide-version #隐藏统计页面上haproxy的版本信息
stats admin if TRUE #设置手工启动/禁用,后端服务器
浏览器访问http://192.168.20.80:1080/stats
安装配置keepalived
yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
tar -zxvf keepalived-2.0.13.tar.gz
cd keepalived-2.0.13/
./configure --prefix=/
make && make install
cp keepalived/etc/init.d/keepalived /etc/init.d/
##将keepalived加入系统服务,可用systemctl管理
vi /etc/keepalived/keepalived.conf #编辑配置文件
! Configuration File for keepalived
vrrp_script chk_http_port { #定义调度服务检查脚本
script "/etc/keepalived/check_haproxy.sh" #定义检测haproxy调度服务脚本路径
interval 2
weight -10 #当脚本生效时将优先级降10
}
global_defs {
router_id LVS_1
}
vrrp_instance v1 {
state MASTER
interface ens33
virtual_router_id 1
priority 105
advert_int 1
authentication {
auth_type PASS
auth_pass 6666
}
track_script { #健康检查使用的脚本
chk_http_port
}
virtual_ipaddress {
192.168.10.100
}
}
编辑keepalived服务健康检查脚本
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ] #如果haproxy进程数小于等于0
then
haproxy -f /etc/haproxy/haproxy.cfg
sleep 3 #则执行重启haproxy
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ] #再次检查haproxy进程数如果小于等于0
then
/etc/init.d/keepalived stop #则关闭keepalived服务
fi
fi
备调度器
192.168.10.13
keepalived配置文件中:
router_id LVS_2
state BACKUP
priority 100
其他配置同主调度器
效果测试
当主备调度器正常工作时
主调度器获得虚拟地址,备调度器未获得
当主调度器故障时
备调度服务器获得虚拟地址
当关闭主调度器的haproxy服务
keepalived利用脚本持续健康检查检测到haproxy进程小于等于0,即主调度器haproxy服务关闭,先下调优先级,然后继续执行脚本重启haproxy,脚本执行成功,恢复优先级,主调度器继续承载服务。