一、Haproxy相关知识
nginx : 四层转发、七层代理
lvs :四层转发,内核态,用户态
Haproxy :四层转发,七层转发
Haproxy的作用和使用场景
-
场景:
用于高并发的web场景,可以支持一万个以上的并发请求,是高性能的TCP和HTTP的负载均衡器
工作原理:
提供一个代理地址,访问集群
-
作用:
- 进行四层和七层转发
- 支持https
- Haproxy本身不自带缓存功能,请求当中添加cookie,使用缓存
- 支持主备切换(keepalive)
-
特点:
- 可靠性高,稳定性好
- 可以同时维护40000-50000个并发,单位时间内可以处理的最大请求数20000个
- 支持负载均衡算法,虽然不带缓存,但是可以支持会话保持
- 负载均衡算法:
- rr :轮询
- wrr :加权轮询
- leastconn :最小连接数
二、Haproxy安装和配置
#haproxy安装包存放在/opt
cd /opt
tar -xf haproxy-1.5.19.tar.gz
mv haproxy-1.5.19 haproxy
cd haproxy/
uname -r
#查看本机的内核版本
make TARGET=linux2628 ARCH=x86_64
#TARGET内核版本要低于本机的内核版本,架构是x86_64
make install
mkdir /etc/haproxy
cd examples
cp haproxy.cfg /etc/haproxy
对haproxy配置文件进行设置(使用七层转发)
vim /etc/haproxy/haproxy.cfgglobal
#4-5行log /dev/log local0 infolog /dev/log local1 noticemaxconn 4096#最大连接数,推荐使用10240,需要系统内核参数修改最大打开文件数#注释下一行#chroot /usr/share/haproxynbproc 4#Haproxy的并发线程数,设置的数量最好是CPU的2倍或者和CPU保持一致defaults
#默认参数配置,包括连接配置、监听配置以及代理配置option httplog#类型 http日志retries 3#检查节点服务器3次,连续3次失败,就认为节点服务器不可用redispatch#服务器负载很高时,自动结束当前队列中处理比较久的连接maxconn 2000#最大连接数,不能超过global设置的maxconn#下面三行注释掉,已经不用了#contimeout#clitimeout#srvtimeouttimeout http-request 10s#http请求的默认超时时间timeout queue 1m#在队列当中请求的超时时间timeout connect 10s#连接超时时间timeout client 1m#客户端超时时间timeout server 1m#服务端超时时间timeout http-keep-alive 10s#默认长连接的超时时间(不是会话保持)timeout check 10s#检查后端服务器的超时时间#转发请求的设置,既可以是四层,也可以是七层
#四层和七层择其一,不要都写#七层转发的配置
listen yang1 0.0.0.0:80option httpchk GET /index.html#设置转发请求的内容,方式GET, 获取内容 index.htmlbalance static-rr#轮询算法server rs01 20.0.0.21:80 check inter 2000 fall 3 weight 2server rs02 20.0.0.22:80 check inter 2000 fall 3 weight 2#server 指定真实服务器,rs01 自定义后端服务器名称#check inter 2000 :启动对后端服务器进行健康检查,检查的间隔时间2000ms#fall 3 连续三次检查不到,任务失败#四层转发的配置
frontend test
#定义服务的名称为test,前端名为testbind *:80#监听所有网络接口,端口为80mode tcp#设置负载均衡的模式为TCPdefault_backend test#指定默认后端服务名为testbackend test
#定义后端名为test,负责处理前端传递来的请求mode tcp#前后端模式匹配,都设置为TCPbalance roundrobin#设置负载均衡算法为轮询,即rrserver rs01 20.0.0.21:80 check inter 2000 fall 3 weight 2server rs02 20.0.0.22:80 check inter 2000 fall 3 weight 3#保存配置
让haproxy命令可以被系统识别到
cd /haproxy/example
cp haproxy.init /etc/init.d/haproxy
chmod 777 /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin
启动haproxy服务
systemctl start haproxy
三、练习
实现keepalive + haproxy的高可用
VIP 20.0.0.100 虚拟地址
test2 :haproxy1 20.0.0.20 主
test3 :haproxy2 20.0.0.30 备
nginx1 :RS01 20.0.0.21 真实服务器1
nginx2 :RS02 20.0.0.22 真实服务器2
test1 :客户机
工作原理:
haproxy就像LVS的调度器,高可用即实现两台haproxy服务器一主一备。
在test2和test3上分别安装haproxy和keepalived
使用keepalive配置test2为 主haproxy服务器,test3为 备haproxy服务器,两台服务器都能对两台nginx服务器(即真实服务器)实现轮询
通过检测服务器上的haproxy服务状态实现主备切换,即VIP的漂移,注意:VIP是两台主备haproxy服务器的虚拟地址
3.1 test2和test3上安装haproxy
源码安装haproxy:
Haproxy安装
#haproxy安装包存放在/opt
cd /opt
tar -xf haproxy-1.5.19.tar.gz
mv haproxy-1.5.19 haproxy
cd haproxy/
uname -r
#查看本机的内核版本
make TARGET=linux2628 ARCH=x86_64
#TARGET内核版本要低于本机的内核版本,架构是x86_64
make install
mkdir /etc/haproxy
cd examples
cp haproxy.cfg /etc/haproxy
对haproxy配置文件进行设置
vim /etc/haproxy/haproxy.cfgglobal
#4-5行log /dev/log local0 infolog /dev/log local1 noticemaxconn 4096#最大连接数,推荐使用10240,需要系统内核参数修改最大打开文件数#注释下一行#chroot /usr/share/haproxy#添加下一行nbproc 4#Haproxy的并发线程数,设置的数量最好是CPU的2倍或者和CPU保持一致defaults
#默认参数配置,包括连接配置、监听配置以及代理配置option httplog#类型 http日志retries 3#检查节点服务器3次,连续3次失败,就认为节点服务器不可用redispatch#服务器负载很高时,自动结束当前队列中处理比较久的连接maxconn 2000#最大连接数,不能超过global设置的maxconn#下面三行注释掉,已经不用了#contimeout#clitimeout#srvtimeouttimeout http-request 10s#http请求的默认超时时间timeout queue 1m#在队列当中请求的超时时间timeout connect 10s#连接超时时间timeout client 1m#客户端超时时间timeout server 1m#服务端超时时间timeout http-keep-alive 10s#默认长连接的超时时间(不是会话保持)timeout check 10s#检查后端服务器的超时时间#转发请求的设置,既可以是四层,也可以是七层
#四层和七层择其一,不要都写#七层转发的配置
listen yang1 0.0.0.0:80option httpchk GET /index.html#设置转发请求的内容,方式GET, 获取内容 index.htmlbalance static-rr#轮询算法server rs01 20.0.0.21:80 check inter 2000 fall 3 weight 2server rs02 20.0.0.22:80 check inter 2000 fall 3 weight 2#server 指定真实服务器,rs01 自定义后端服务器名称#check inter 2000 :启动对后端服务器进行健康检查,检查的间隔时间2000ms#fall 3 连续三次检查不到,任务失败
想做四层转发的话以用下面的配置
#四层转发的配置
frontend test
#定义服务的名称为test,前端名为testbind *:80#监听所有网络接口,端口为80mode tcp#设置负载均衡的模式为TCPdefault_backend test#指定默认后端服务名为testbackend test
#定义后端名为test,负责处理前端传递来的请求mode tcp#前后端模式匹配,都设置为TCPbalance roundrobin#设置负载均衡算法为轮询,即rrserver rs01 20.0.0.21:80 check inter 2000 fall 3 weight 2server rs02 20.0.0.22:80 check inter 2000 fall 3 weight 3#保存配置
让haproxy命令可以被系统识别到
cd /haproxy/example
cp haproxy.init /etc/init.d/haproxy
chmod 777 /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin
启动haproxy服务
systemctl start haproxy
3.2 在test2和test3上安装keepalived
安装keepalived
yum -y install keeplived
对test2的keepalive进行配置
编辑检查haproxy状态的脚本
vim /opt/check_haproxy.sh
#内容如下
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null
#指定curl命令的路径调用curl命令
#curl -I 仅查看http响应头部信息,而不用下载页面内容,常用于状态检查
if [ $? -ne 0 ]
thensystemctl stop keepalived
fi
vim /etc/keepalived/keepalived.conf
#在global_defs模块中
#修改下两行
smtp_server 127.0.0.1
router_id LVS_02
#route_id 后面的名称不能相同!
#添加以下行
vrrp_iptables#添加vrrp脚本模块
vrrp_script check_haproxy {script "/opt/check_haproxy.sh"interval 5
}#修改vrrp_instance VI_1 模块的内容
state MASTER
interface ens33
priority 120
virtual_ipaddress {20.0.0.100
}
#在该模块中添加脚本追踪组,执行check_haproxy里的脚本
track_script {check_haproxy
}#删除下面的所有模块,保存
对test3的keepalive进行配置
基本和test2的配置一样,区别在于
-
不用添加
vrrp_script check_haproxy
脚本模块和track_script
脚本追踪组 -
全局模块
global_defs
中设置router_id LVS_01
-
vrrp_instance VI_1
模块中,设置state BACKUP priority 100(不用修改,默认就100)
重启keepalived服务
systemctl restart keepalived
3.3 测试和验证
可以先查看test2和test3的haproxy服务是否正常
curl test2和test3,观察是否能实现对两台真实服务器(Nginx1和2)的轮询,如果能轮询,则haproxy服务正常
再检查主备工作是否正常
可以查看test2和test3的IP地址
ip addr
观察到VIP现在在主服务器test2上
然后 curl 20.0.0.100 ,即访问VIP地址,能否正常获取服务,如果正常轮询,说明keepalive正常,此时是主服务器test2在通过haproxy提供服务
然后停止test2主服务器的haproxy服务
systemctl stop haproxy
过5s,再查看test2和test3的IP地址 ip addr
观察到VIP现在在备服务器test3上,VIP漂移
再 curl 20.0.0.100 ,查看能否正常获取页面服务,如果正常轮询,说明keepalive正常,此时是备服务器test3在通过haproxy提供服务