HAproxy基本负载均衡)+(Nginx七层负载均衡集群)+(HAproxy+Keepalived负载均衡集群实现动静分离)
- HAproxy概述
-
-
- HAproxy简单特点概述
-
- 初始HAproxy实现简单的负载均衡
- Nginx七层负载均衡集群
- HAproxy+Keepalived负载均衡集群实现动静分离
HAproxy概述
- 关于4/7层负载均衡集群
无负载均衡
- 在此示例中,用户直接连接到您的Web服务器,在yourdomain.com上,并且没有负载平衡。如果您的单个Web服务器出现故障,用户将无法再访问您的Web服务器。此外,如果许多用户试图同时访问您的服务器并且无法处理负载,他们可能会遇到缓慢的体验,或者可能根本无法连接。
四层负载均衡
- 将网络流量负载,平衡到多个服务器的最简单方法,是使用第4层(传输层)负载平衡。以这种方式进行负载均衡将根据IP范围和端口转发用户流量(即,如果请求进入http://yourdomain.com/anything,则流量将转发到处理yourdomain.com的所有请求的后端。端口80)
- 用户访问负载均衡器,负载均衡器将用户的请求转发给后端服务器的Web后端组。无论选择哪个后端服务器,都将直接响应用户的请求。通常,Web后端中的所有服务器应该提供相同的内容-否则用户可能会收到不一致的内容。
七层负载均衡
- 7层负载平衡是更复杂的负载均衡网络流量的方法是使用第7层(应用层)负载均衡。使用第7层允许负载均衡器根据用户请求的内容将请求转发到不同的后端服务器。这种负载平衡模式允许您在同一域和端口下运行多个Web应用程序服务器。
- 示例中,如果用户请求yourdomain.com/blog,则会将其转发到博客后端,后端是一组运行博客应用程序的服务器。其他请求被转发到web-backend,后端可能正在运行另一个应用程序。
关于HAproxy
7层负载均衡、应用程序负载均衡、URL负载均衡、动静分离技术,免费、快速并且可靠
是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。
- HAProxy Session亲缘性
- haproxy负载均衡保持客户端和服务器Session亲缘性的三种方式
- 用户IP识别
- cookie识别
- session识别
HAproxy简单特点概述
- 支持tcp / http两种协议层的负载均衡,使得其负载均衡功能非常丰富。
- 支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
- 性能非常优秀,基于事件驱动的链接处理模式及单进程处理模式(和Nginx类似)让其性能卓越。
- 拥有一个功能出色的监控页面,实时了解系统的当前状况。
- 功能强大的ACL支持,给用户极大的方便。
初始HAproxy实现简单的负载均衡
#环境
四台Linux,做好域名解析
HAproxy:192.168.100.10
Web1:192.168.100.20
Web2:192.168.100.30
Client:192.168.100.40
#域名解析
[[email protected] ~]# vim /etc/hosts
192.168.100.10 haproxy
192.168.100.20 web1
192.168.100.30 web2
192.168.100.40 client
[[email protected] ~]# scp /etc/hosts web1:/etc/
[[email protected] ~]# scp /etc/hosts web2:/etc/
[[email protected] ~]# scp /etc/hosts client:/etc/
- Web1和Web2创建测试页面
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo web1 > /var/www/html/index.html
[[email protected] ~]# systemctl enable httpd --now
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo web2 > /var/www/html/index.html
[[email protected] ~]# systemctl enable httpd --now
- 配置HAproxy
[[email protected] ~]# yum -y install haproxy
[[email protected] ~]# vim /etc/haproxy/haproxy.cfg
global #全局配置
log 127.0.0.1 local3 info #日志配置记录本机日志中 local3 日志类型自定义
maxconn 4096 #最大连接限制(优先级低)
user nobody #运行haproxy用户是谁/也可以写99
group nobody #组用户
daemon #守护进程常驻系统内存
nbproc 1 #haproxy进程数,该值的设置应与服务器cpu核心数一致,如16,即2颗8核心
pidfile /run/haproxy.pid #haproxy 进程id存放位置
defaults #默认配置
log global #日志使用全局设置
mode http #haproxy工作模式七层LB,程序会检查用户url
maxconn 2048 #haproxy最大连接数(优先级中)
retries 3 #健康检查,对后端真实服务器,3次失败认为服务不可用
option redispatch #重新匹配,服务器不可用后的操作,重定向至健康服务器
timeout connect 5000 #重传计时器,定义haproxy将客户端请求转发至后端服务器所等待的时间/毫秒
timeout client 50000 #向后长连接,haproxy作为客户,和后端服务器之间空闲连接的超时时间,到时发送fin指令
timeout server 50000 #向前长连接,haproxy作为服务器,和用户之间空闲连接的超时时间,到时发送fin指令
option abortonclose #关于关闭的选项,当服务器过载过高,自动结束当前队列处理较久的连接
stats uri /admin?stats #设置统计页面的uri为/admin?stats
stats realm Private lands #设置统计页面认证时的提示内容
stats auth admin:password #设置统计页面认证的用户和密码,如果设置多个,另一行写入即可
stats hide-version #隐藏统计页面上的haproxy版本信息
frontend http-in #前端虚拟服务器
bind 0.0.0.0:80 #绑定地址,为本机所有IP服务
mode http #面对前端http模式检查用户uri
log global #可以对面向前端日志单独存放,也可以放入本机全局设置
option httplog #日志格式,记录详细
option httpclose #关闭长连接
acl html url_reg -i \.html$ #访问控制列名名称html,用户url地址可以被正则匹配,-i:忽略大小写,if如果html规则命中,则向后端真实服务器转发
use_backend html-server if html #如果满足acl html规则,则推送给后端服务器html-server
default_backend html-server #默认的后端服务器
backend html-server #真实服务器
mode http #观察用户url地址进行分发
balance roundrobin #轮询策略
option httpchk GET /index.html #健康状态检查查看服务器主页
cookie SERVERID insert indirect nocache #将相同用户请求,转发给相同的真实服务器
server html-A web1:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
server html-B web2:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
#cookie 3 服务器id,避免rr算法将客户机请求转发给其他服务器,对后端服务器的健康状态检查为2000毫秒,连续两次健康检查成功,则认为有效,连续五次健康检查失败,则认为宕机
[[email protected] ~]# systemctl start haproxy #启动haproxy
- 测试结果
- HAproxy配置文件五部分
- global:设置全局配置参数,属于进程的配置,通常是和操作系统相关;
- defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件;
- frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend;
- backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器;
- Listen:frontend和backend的组合体。
HAproxy状态
http://192.168.100.10/admin?stats
密码为刚才在配置文件中配置的账户密码
Nginx七层负载均衡集群
- 特点
- 功能强大,性能卓越,运行稳定
- 配置简单灵活
- 能够自动剔除工作不正常的后端服务器
- 上传文件使用异步模式。client—nginx-web1 web2 web3 lvs同步请求DRclient–>dr—web1
- 支持多种分配策略,可以分配权重,分配方式灵活。
- 优势
- nginx复制用户请求,在后端服务器出现问题时,nginx会再复制一份请求发给另一台后端服务器,lvs则在这种情况,只能用户重新发请求
- 缺点
- 流量会经过nginx,nginx成为瓶颈
生产架构
- Nginx配置
基于刚才的实验环境
[[email protected] ~]# systemctl stop haproxy #停止haproxy
nginx:192.168.100.10
Web1:192.168.100.20
Web2:192.168.100.30
- 域名解析
[[email protected] ~]# vim /etc/hosts
192.168.100.10 nginx
192.168.100.20 web1
192.168.100.30 web2
192.168.100.40 client
[[email protected] ~]# scp /etc/hosts web1:/etc/
[[email protected] ~]# scp /etc/hosts web2:/etc/
[[email protected] ~]# scp /etc/hosts client:/etc/
#页面准备使用刚才实验的试验主页
- 配置Nginx
[[email protected] ~]# yum -y install nginx
[[email protected] ~]# vim /etc/nginx/nginx.conf
...
#找到http模块添加 upstream
http {
upstream html { #上游服务器,服务器名html
server web1:80;
server web2:80;
}
...
#找到server模块中的location /
location / {
proxy_pass http://html; #html对应上方html服务器集群名
}
...
[[email protected] ~]# systemctl restart nginx
- 测试负载均衡
如需做动静分离添加location即可
#例:
location / { upstream html {
server web1:80;
} server web2:80;
location ~\.html$ { }
proxy_pass ... upstream php {
} server web3:80;
location ~\php$ { server web4:80;
proxy_pass ... }
} server {
location ~\.(jpg|png|css|js)$ { location / {
proxy_pass ... proxy_pass http://html;
} }
location ~\.php$ {
proxy_pass http://php;
}
HAproxy+Keepalived负载均衡集群实现动静分离
- 基本的架构图大概是这样
主机 | IP地址 |
---|---|
HAproxy主(01) | 192.168.100.50 |
HAproxy从(02) | 192.168.100.51 |
html01 | 192.168.100.60 |
html02 | 192.168.100.61 |
php01 | 192.168.100.70 |
php02 | 192.168.100.71 |
安装
HAproxy
和
Keepalived
[[email protected] ~]# yum -y install haproxy keepalived
[[email protected] ~]# yum -y install haproxy keepalived
配置HAproxy
[[email protected] ~]# vim /etc/haproxy/haproxy.cfg
global #全局配置
log 127.0.0.1 local3 info #日志配置记录本机日志中 local3 日志类型自定义
maxconn 4096 #最大连接限制(优先级低)
user nobody #运行haproxy用户是谁/也可以写99
group nobody #组用户
daemon #守护进程常驻系统内存
nbproc 1 #haproxy进程数,该值的设置应与服务器cpu核心数一致,如16,即2颗8核心
pidfile /run/haproxy.pid #haproxy 进程id存放位置
defaults #默认配置
log global #日志使用全局设置
mode http #haproxy工作模式七层LB,程序会检查用户url
maxconn 2048 #haproxy最大连接数(优先级中)
retries 3 #健康检查,对后端真实服务器,3次失败认为服务不可用
option redispatch #重新匹配,服务器不可用后的操作,重定向至健康服务器
timeout connect 5000 #重传计时器,定义haproxy将客户端请求转发至后端服务器所等待的时间/毫秒
timeout client 50000 #向后长连接,haproxy作为客户,和后端服务器之间空闲连接的超时时间,到时发送fin指令
timeout server 50000 #向前长连接,haproxy作为服务器,和用户之间空闲连接的超时时间,到时发送fin指令
option abortonclose #关于关闭的选项,当服务器过载过高,自动结束当前队列处理较久的连接
stats uri /admin?stats #设置统计页面的uri为/admin?stats
stats realm Private lands #设置统计页面认证时的提示内容
stats auth admin:password #设置统计页面认证的用户和密码,如果设置多个,另一行写入即可
stats hide-version #隐藏统计页面上的haproxy版本信息
frontend http-in #前端虚拟服务器
bind 0.0.0.0:80 #绑定地址,为本机所有IP服务
mode http #面对前端http模式检查用户uri
log global #可以对面向前端日志单独存放,也可以放入本机全局设置
option httplog #日志格式,记录详细
option httpclose #关闭长连接
acl html url_reg -i \.html$ #访问控制列名名称html,用户url地址可以被正则匹配,-i:忽略大小写,if如果html规则命中,则向后端真实服务器转发
acl php url_reg -i \.php$
use_backend html-server if html #如果满足acl html规则,则推送给后端服务器html-server
use_backend php-server if php
default_backend html-server #默认的后端服务器
backend html-server #后端真实服务器
mode http #观察用户url地址进行分发
balance roundrobin #轮询策略rr
option httpchk GET /index.html #健康状态检查查看服务器主页
cookie SERVERID insert indirect nocache #将相同用户请求,转发给相同的真实服务器
server html-A 192.168.100.60:80 weight 1 cookie 1 check inter 2000 rise 2 fall 5
server html-B 192.168.100.61:80 weight 1 cookie 2 check inter 2000 rise 2 fall 5
#cookie 3 服务器id,避免rr算法将客户机请求转发给其他服务器,对后端服务器的健康状态检查为2000毫秒,连续两次健康检查成功,则认为有效,连续五次健康检查失败,则认为宕机
backend php-server #后端真实服务器
mode http #观察用户url地址进行分发
balance roundrobin #轮询策略rr
option httpchk GET /index.php #健康状态检查查看服务器主页
cookie SERVERID insert indirect nocache #将相同用户请求,转发给相同的真实服务器
server php-A 192.168.100.70:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
server php-B 192.168.100.71:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
[[email protected] ~]# scp -r /etc/haproxy/haproxy.cfg 192.168.100.51:/etc/haproxy/
[[email protected] ~]# systemctl start haproxy
[[email protected] ~]# systemctl start haproxy
网站配置
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo html01 > /var/www/html/index.html
[[email protected] ~]# systemctl enable httpd --now
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo html02 > /var/www/html/index.html
[[email protected] ~]# systemctl enable httpd --now
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo php01 > /var/www/html/index.php
[[email protected] ~]# systemctl enable httpd --now
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# echo php02 > /var/www/html/index.php
[[email protected] ~]# systemctl enable httpd --now
配置Keepalived
主
[[email protected] ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived #keepalived配置文件文档声明
global_defs { #全局配置
router_id 1 #路由器编号,设备在组中的标识
}
vrrp_script chk_httpd { #健康检查
script "/etc/keepalived/ck_httpd.sh" #检查脚本
interval 2 #检查频率/秒
weight -5 #优先级减5
fall 3 #失败三次
}
vrrp_instance VI_1 { #VRRP模块实例 VI_1,实例名,两台路由器相同
state MASTER #主或从状态
interface ens32 #监控心跳网卡,(因为实验环境就一张网卡所以监控ens32)
mcast_src_ip 192.168.100.50 #心跳源IP
virtual_router_id 55 #虚拟路由编号,主备一致
priority 100 #优先级
advert_int 1 #心跳间隔/秒
authentication { #认证模块
auth_type PASS #认证类型为密码认证
auth_pass 123456 #认证密码123456(1-8位)
}
virtual_ipaddress { #VIP
192.168.100.100/24
}
track_script { #跟踪脚本
chk_httpd
}
}
#编写keepalived主的监控脚本
[[email protected] ~]# vim /etc/keepalived/ck_httpd.sh
#!/bin/bash
A=`ps -C haproxy --no-header | wc -l`
if [ $A -eq 0 ];then
systemctl start haproxy
echo "haproxy start"
sleep 3
if [ `ps -C haproxy --no-header | wc -l` -eq 0 ];then
systemctl stop keepalived
echo "keepalived stop"
fi
fi
[[email protected] ~]# scp -r /etc/keepalived/keepalived.conf 192.168.100.51:/etc/keepalived/
[[email protected] ~]# chmod +x /etc/keepalived/ck_httpd.sh
[[email protected] ~]# systemctl restart keepalived
[[email protected] ~]# systemctl enable keepalived
配置Keepalived
从
[[email protected] ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived #keepalived配置文件文档声明
global_defs { #全局配置
router_id 2 #路由器编号,设备在组中的标识
}
vrrp_script chk_httpd { #健康检查
script "/etc/keepalived/ck_httpd.sh" #检查脚本
interval 2 #检查频率/秒
weight -5 #优先级减5
fall 3 #失败三次
}
vrrp_instance VI_1 { #VRRP模块实例 VI_1,实例名,两台路由器相同
state BACKUP #主或从状态
interface ens32 #监控心跳网卡,(因为实验环境就一张网卡所以监控ens32)
mcast_src_ip 192.168.100.51 #心跳源IP
virtual_router_id 55 #虚拟路由编号,主备一致
priority 90 #优先级
advert_int 1 #心跳间隔/秒
authentication { #认证模块
auth_type PASS #认证类型为密码认证
auth_pass 123456 #认证密码123456(1-8位)
}
virtual_ipaddress { #VIP
192.168.100.100/24
}
track_script { #跟踪脚本
chk_httpd
}
}
#编写keepalived从的监控脚本
[[email protected] ~]# vim /etc/keepalived/ck_httpd.sh
#!/bin/bash
A=`ip a | grep 192.168.9.200 | wc -l`
B=`ps -ef | grep haproxy | grep -v grep | awk '{print $2}'`
if [ $A -gt 0 ];then
systemctl start haproxy
else
kill -9 $B
fi
[[email protected] ~]# chmod +x /etc/keepalived/ck_httpd.sh
[[email protected] ~]# systemctl restart keepalived
[[email protected] ~]# systemctl enable keepalived
测试
#浏览器访问
http://192.168.100.100/
http://192.168.100.100/index.php
#服务器间的测试,如下
- 测试结果
- 停止
的HAproxy主
服务,服务会在3秒后重启HAproxy
- 此时
的虚拟IP依旧存在HAproxy主
- 停止
#停止HAproxy的keepalived服务
[[email protected] ~]# systemctl stop keepalived
- 再次查看
的HAproxy从
配置,虚拟IP已成功漂移,实验完成!IP
- 需要注意的是,测试中每测试一次需要清空一次缓存,因为配置文件中设置对客户端
缓存的原因cookie