Linux下搭建HAproxy+keepalive高可用负载均衡架构*
1、首先需要准备两台主备机器,两台web服务器:
主机 | 192.168.0.8 |
---|---|
备机 | 192.168.0.9 |
web1 | 192.168.0.79 |
– | – |
web2 | 192.168.0.80 |
HAproxy安装与配置:
简介:
1)HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
2)HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
3)HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
4)HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
-
yum安装:
yum -y install haproxy
-
编辑配置文件:
vim /etc/haproxy/haproxy.cfg
:配置说明、参考:
###########全局配置######### global log 127.0.0.1 local0 #[日志输出配置,所有日志都记录在本机,通过local0输出] log 127.0.0.1 local1 notice #定义haproxy 日志级别[error warringinfo debug] daemon #以后台形式运行harpoxy nbproc 1 #设置进程数量 maxconn 4096 #默认最大连接数,需考虑ulimit-n限制
#userhaproxy #运行haproxy的用户
#group haproxy #运行haproxy的用户所在的组
#pidfile/var/run/haproxy.pid #haproxy 进程PID文件
#ulimit-n 819200 #ulimit 的数量限制
#chroot /usr/share/haproxy #chroot运行路径
#debug #haproxy调试级别,建议只在开启单进程的时候调试
#quiet########默认配置############ defaults log global mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK option httplog#日志类别,采用httplog option dontlognull #不记录健康检查日志信息 retries 2
#两次连接失败就认为是服务器不可用,也可以通过后面设置
#option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip option httpclose
#每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
#option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接 maxconn 4096
#默认的最大连接数timeout connect 5000ms #连接超时 timeout client 30000ms #客户端超时 timeout
server 30000ms #服务器超时
#timeout check 2000 #心跳检测超时
#timeout http-keep-alive10s #默认持久连接超时时间
#timeout http-request 10s
#默认http请求超时时间
#timeout queue 1m #默认队列超时时间 balance roundrobin #设置默认负载均衡方式,轮询方式
#balance source #设置默认负载均衡方式,类似于nginx的ip_hash
#balnace leastconn #设置默认负载均衡方式,最小连接数########统计页面配置######## listen stats bind 0.0.0.0:1080 #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称 mode http #http的7层模式 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 #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)########设置haproxy 错误页面#####
#errorfile 403 /home/haproxy/haproxy/errorfiles/403.http
#errorfile 500 /home/haproxy/haproxy/errorfiles/500.http
#errorfile 502 /home/haproxy/haproxy/errorfiles/502.http
#errorfile 503 /home/haproxy/haproxy/errorfiles/503.http
#errorfile 504 /home/haproxy/haproxy/errorfiles/504.http########frontend前端配置############## frontend main bind *:80 #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。 acl web hdr(host) -i www.abc.com
#acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发web规则,。 acl img hdr(host) -i img.abc.com #如果访问img.abc.com这个域名,就触发img规则。
use_backend webserver if web
#如果上面定义的web规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域。 use_backend imgserver if img
#如果上面定义的img规则被触发,即访问img.abc.com,就将请求分发到imgserver这个作用域。 default_backend dynamic #不满足则响应backend的默认页面########backend后端配置############## backend webserver #webserver作用域 mode http balance roundrobin #balance roundrobin 负载轮询, balance
source 保存session值,支持static-rr,leastconn,first,uri等参数 option httpchk
/index.html HTTP/1.0 #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它
server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2
fall 3 server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000
rise 2 fall 3
#cookie 1表示serverid为1,check inter 1500 是检测心跳频率
#rise2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重backend imgserver mode http option httpchk /index.php balance
roundrobin . server img01 192.168.137.101:80 check inter 2000 fall
3 server img02 192.168.137.102:80 check inter 2000 fall 3backend dynamic balance roundrobin server test1
192.168.1.23:80 check maxconn 2000 server test2 192.168.1.24:80 check maxconn 2000listen tcptest bind 0.0.0.0:5222 mode tcp option tcplog
#采用tcp日志格式 balance source
#log 127.0.0.1 local0 debug server s1 192.168.100.204:7222 weight 1 server s2 192.168.100.208:7222 weight 1
按自己所需配置完文件之后,最后启动haproxy:systemctl start haproxy
Keepalived介绍
keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。
- 安装keepalived:
# yum install keepalived -y
- 配置文件:
vim /etc/keepalived/keepalived.conf
示例:
! Configuration File for keepalived global_defs { #全局定义部分 notification_email { #设置报警邮件地址,可设置多个 acassen@firewall.loc #接收通知的邮件地址 } notification_email_from test0@163.com #设置 发送邮件通知的地址 smtp_server smtp.163.com #设置 smtp server 地址,可是ip或域名.可选端口号 (默认25) smtp_connect_timeout 30 #设置 连接 smtp server的超时时间 router_id LVS_DEVEL #主机标识,用于邮件通知 vrrp_skip_check_adv_addr vrrp_strict #严格执行VRRP协议规范,此模式不支持节点单播 vrrp_garp_interval 0 vrrp_gna_interval 0 script_user keepalived_script #指定运行脚本的用户名和组。默认使用用户的默认组。如未指定,默认为keepalived_script 用户,如无此用户,则使用root enable_script_security #如过路径为非root可写,不要配置脚本为root用户执行。 } vrrp_script chk_nginx_service { #VRRP 脚本声明 script "/etc/keepalived/chk_nginx.sh" #周期性执行的脚本 interval 3 #运行脚本的间隔时间,秒 weight -20 #权重,priority值减去此值要小于备服务的priority值 fall 3 #检测几次失败才为失败,整数 rise 2 #检测几次状态为正常的,才确认正常,整数 user keepalived_script #执行脚本的用户或组 } vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称 state MASTER #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP interface ens33 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息 virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致 priority 100 #定义优先级,数字越大,优先级越高。 advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样 authentication { #设置验证类型和密码,两个节点必须一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个 192.168.119.130 } track_script { #脚本监控状态 chk_nginx_service #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20 } notify_master "/etc/keepalived/start_haproxy.sh start" #当前节点成为master时,通知脚本执行任务 notify_backup "/etc/keepalived/start_haproxy.sh stop" #当前节点成为backup时,通知脚本执行任务 notify_fault "/etc/keepalived/start_haproxy.sh stop" #当当前节点出现故障,执行的任务; } virtual_server 192.168.119.130 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开 delay_loop 6 #每隔6秒查询realserver状态 lb_algo rr #后端调试算法(load balancing algorithm) lb_kind DR #LVS调度类型NAT/DR/TUN #persistence_timeout 60 同一IP的连接60秒内被分配到同一台realserver protocol TCP #用TCP协议检查realserver状态 real_server 192.168.119.120 80 { weight 1 #权重,最大越高,lvs就越优先访问 TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒无响应超时 retry 3 #重连次数3次 delay_before_retry 3 #重连间隔时间 connect_port 80 #健康检查realserver的端口 } } real_server 192.168.119.121 80 { weight 1 #权重,最大越高,lvs就越优先访问 TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒无响应超时 retry 3 #重连次数3次 delay_before_retry 3 #重连间隔时间 connect_port 80 #健康检查realserver的端口 } } } vrrp_instance VI_2 { #vrrp 实例部分定义,VI_1自定义名称 state BACKUP #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP 分别表示(主|备) interface ens33 #网卡设置,绑定vip的子接口,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息 virtual_router_id 52 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致 priority 90 #定义优先级,数字越大,优先级越高。 advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样 authentication { #设置验证类型和密码,两个节点必须一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个 192.168.119.131 } } virtual_server 192.168.119.131 80 { #定义RealServer对应的VIP及服务端口,IP和端口之间用空格隔开 delay_loop 6 #每隔6秒查询realserver状态 lb_algo rr #后端调试算法(load balancing algorithm) lb_kind DR #LVS调度类型NAT/DR/TUN #persistence_timeout 60 #同一IP的连接60秒内被分配到同一台realserver protocol TCP #用TCP协议检查realserver状态 real_server 192.168.119.120 80 { weight 1 #权重,最大越高,lvs就越优先访问 TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒无响应超时 retry 3 #重连次数3次 delay_before_retry 3 #重连间隔时间 connect_port 80 #健康检查realserver的端口 } } real_server 192.168.119.121 80 { weight 1 #权重,最大越高,lvs就越优先访问 TCP_CHECK { #keepalived的健康检查方式HTTP_GET | SSL_GET | TCP_CHECK | SMTP_CHECK | MISC connect_timeout 10 #10秒无响应超时 retry 3 #重连次数3次 delay_before_retry 3 #重连间隔时间 connect_port 80 #健康检查realserver的端口 } } }
- 按自己所需配置完成后启动keepalived :
#keepalived -D
- 验证:
1)关闭主keepalived,VIP是否切换至备机,业务是否正常,恢复原状;(验证keepalived高可用)
2)关闭主HAproxy,VIP是否切换至备机,业务是否正常,恢复原状;(验证HAproxy高可用)
3)关闭后台服务器web1,业务是否正常。(验证HAproxy状态检查)