目录
一、HAProxy 简介
HAProxy 特点
适用场景
二、HAProxy负载均衡
1.安装部署haproxy
2.身份验证
3.自定义路由监控器
4.负载均衡权重
5.设置备份服务器
6.访问黑名单与错误重定向
7.访问重定向
8.读写分离
四、HAProxy高可用
环境配置
配置集群管理VIP
五、fence防止脑裂
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
1、支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
3、支持url检测后端的服务器出问题的检测会有很好的帮助。
4、更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
5、单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
6、HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
7、支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
8、不能做Web服务器即Cache。
1.网站建设初期,可以选用Nigix/HAproxy作为反向代理负载均衡(或者流量不大都可以不选用负载均衡),因为其配置简单,性能也能满足一般的业务场景。
如果考虑到负载均衡器是有单点问题,可以采用Nginx/HAproxy+Keepalived来避免。
2.网站并发达到一定程度之后,为了提高稳定性和转发效率,可以使用LVS、毕竟LVS比Nginx/HAproxy要更稳定,转发效率也更高。不过维护LVS对维护人员的要求也会更高,投入成本也更大。
在server1上安装haproxy
编辑haproxy的配置文件
yum install -y haproxy
vim /etc/haproxy/haproxy.cfg
\\\
stats uri /status #设置统计页面的uri为/status
frontend main *:80 #监听地址为80
default_backend app #默认的请求转发地址,名为app
backend app #定义一个名为app的后端部分,需要与frontend的配置项default_backend 值相一致,算法为轮询,将动态请求转到以下两台服务器的任意一台
server app1 172.25.35.2:80 check #定义的多个后端
server app2 172.25.35.3:80 check #定义的多个后端
\\\
server1启动haproxy服务,看到端口处于监听状态
server2和server3安装http,在网页发布文件分别写入server2/server3,然后启动httpd服务
在真机或浏览器访问172.25.35.1进行测试,可以看到轮询请求
server1中修改系统文件 /etc/security/limits.conf,添加如下配置
vim /etc/security/limits.conf
\\\
# End of file
haproxy nofile 4096
\\\
浏览器访问统计页面172.25.35.1/status
关闭server3的httpd服务
在web统计页面也可以看到app1标红了,就是出现了问题无法工作
编译haproxy配置文件,输入用户名密码
注意:haproxy配置文件修改后,必须使用reload,不能restart,否则会使连接断开)
此时浏览器访问会验证身份
自定义设置符合监控条件的url转发到指定服务器
编译haproxy配置文件,并重新加载服务:当访问路径以/static /images等开头,以.jpg .gif等结尾时,跳入backend static模块,由该模块内server提供服务
vim haproxy.cfg
\\\
frontend main *:80
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
use_backend static if url_static
default_backend app
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
balance roundrobin
server static 172.25.7.3:80 check
\\\
systemctl reload haproxy.service #重新加载
在server3网站目录内创建images文件夹并放入一张jpg格式的图片
浏览器访问172.25.7.1/images/1.png
自己下载的图片如果无法在浏览器访问可能是图片格式问题,在配置文件中添加该格式参数即可
vim haproxy.cfg
设置后端服务器的权重值,这里将app1(也就是server2)的权重设置为weight2
即访问服务器时,haproxy通过权重值分配给后端服务器的概率为2:1
在haproxy配置文件中添加备份服务器
vim haproxy.cfg
\\\
server backup 172.25.35.1:8080 backup #因为haproxy用的端口是80,所以这里http用8080端口
\\\
systemctl reload haproxy.service
在server1中编辑http配置文件
vim /etc/httpd/conf/httpd.conf
\\\
Listen 8080
\\\
echo server1 > /var/www/html/index.html
systemctl restart httpd #重启server1的httpd服务,现在可以看到8080端口处于监听状态
netstat -antlp
访问172.25.35.1,可以看到备份服务器生效
现实中我们需要拉黑一些恶意的Ip访问服务器
所以可以直接将IP放入黑名单或者错误重定向到其他网址
编辑haproxy的配置文件,添加黑名单
vim haproxy.cfg
\\\
acl blacklist src 172.25.35.250
block if blacklist
\\\
systemctl reload haproxy.service
用黑名单中的IP172.25.35.250主机访问发现被拒绝403
如果觉得直接拒绝访问失败的页面不妥,可以直接重定向跳转到别的页面,我们可以在配置文件中将黑名单访问重定向条转到其他网址
vim haproxy.cfg
\\\
errorloc 403 http://www.taobao.com #添加错误重定向
\\\
systemctl reload haproxy.service
此时黑名单中的IP172.25.35.250主机访问,可以看到页面没有报错而是直接跳转到了百度网站
vim haproxy.cfg
\\\
redirect location http://172.25.35.1:8080/rewrite.html
\\\
systemctl reload haproxy.service
目标:访问流量导向server2服务器,写入数据时导向server2服务器
编辑server1的haproxy配置文件,使得server2来接收访问流量,当写入数据时切换至server3
在server2和server3上都安装php
在server2网站目录下创建index.php和upload_file.php,创建upload文件夹并赋予权限,用来接收访问者上传的文件
index.php和upload_file.php文件源码需要下载,这里只需要了解
编辑upload_file.php
将上传目录改为自己创建的目录upload
将上一步server2上创建的文件和文件夹发送给server3
重启httpd服务
浏览器访问172.25.35.1进行上传测试
上传图片,在server3的指定上传目录upload中查看
在真实主机上准备高可用插件的文件夹
将真机中的资源挂载在网络仓库中
在server1上安装高可用插件pacemaker 和其需要的依赖
为了操作方便,server1生成免密操作密钥,发送给server4
将server1的仓库配置文件发送给server4并安装
开启server1和server4的pcsd服务,可以使用pcs命令
修改server1和server4的hacluster认证密码,然后认证
systemctl enable --now pcsd.service ##启动服务
ssh server4 systemctl enable --now pcsd.service
echo westos | passwd --stdin hacluster ##修改密码
ssh server4 echo westos | passwd --stdin hacluster
pcs cluster auth server4 server1 ##认证
设定集群的名称为mycluster,集群内有server1和server4两个设备
pcs cluster setup --name mycluster server1 server4
启动集群内所有服务节点
pcs cluster start --all
pcs cluster enable --all
pcs property set stonith-enabled=false ##禁用stonith功能,使其不出现告警
pcs status #查看状态
在server4上安装haproxy,并将server1的haproxy配置文件发送给server4
server1中
scp haproxy.cfg server4:/etc/haproxy/
现在haproxy已经有了备用负载均衡服务器,我们可以设置一个VIP来通过访问VIP即可追踪到正在使用的haproxy,固定的VIP方便用户访问
设定VIP
pcs resource create vip ocf:heartbeat:IPaddr2 ip=172.25.7.100 op monitor interval=30s #设定VIP
ip addr #查看
可以看到集群状态里已经获取到了VIP信息,测试访问看到服务已经成功启动
在server1中删除vip网络接口,因为server4节点已经为后备状态了,所以vip网络接口信息又会自动生成
关闭server1、server4 的haproxy服务
在server1中
将haproxy 添加到集群管理
pcs resource create haproxy systemd:haproxy op monitor interval=60s
pcs status #查看集群状态
查看状态发现vip运行在server1节点,haproxy运行在server4节点
我们需要将vip和haproxy 放入同一个组中解决不同步的问题
pcs resource group add hagroup vip haproxy #将vip和haproxy放在hagroup组中
pcs status
我们将server1设为备用服务器,可以看到vip和haproxy都在server4节点上运行
关闭server4的haproxy服务,查看集群运行状态,可以看到运行出现了错误和警告
Fence主要作用是防止两个系统同时向资源写数据
破坏资源的安全性和一致性从而导致脑裂
真实主机安装fence插件
dnf install -y fence-virtd-libvirt fence-virtd-multicast fence-virtd
fence_virtd -c #配置fence(需要输入的只有在网桥的时候选择br0接口,其余回车即可)
因为第一次实验未设为br0,所以后续实验报错,此处需要重视
配置完可以看到之后要生成的fence_xvm.key文件的存放位置
建立fence_xvm.key的存放目录,并生成fence_xvm.key文件
mkdir /etc/cluster
cd /etc/cluster
dd if=/dev/urandom of=fence_xvm.key bs=128 count=1
systemctl restart fence_virtd.service
scp fence_xvm.key server1:/etc/cluster/
scp fence_xvm.key server4:/etc/cluster/
重启fence服务,关闭火墙
真实主机将生成的密钥文件发送给server1、server4
在server1、server4安装客户端fence
yum install fence-virt -y
pcs stonith list #查看stonith列表
stonith_admin -I #查询fence设备
查询fence设备的元数据
在server1将server1、server4节点添加到fence
#server1:y1(主机名:虚拟机名)
pcs stonith create vmfence fence_xvm pcmk_host_map="server1:server1;server4:server4" op monitor interval=60s #server1:serevr1(主机名:虚拟机名)
pcs status #查看状态
可以看到haproxy和vip在server1,fence运行在server4
关闭server1网卡
成功切换
让系统崩溃,执行后主机断点重启
server1接管