haproxy负载均衡

目录

一.什么是HAProxy

二.HAProxy与nginx的对比

三.HAProxy工作原理

四.实现HAProxy负载均衡

1.在server1中部署haproxy

2.在网页进行测试

3.网页测试添加密码

4.错误检测

5.日志的读取

6.source算法

7.自定义路由监控器

8.访问黑名单与错误重定向

9.读写分离

五.HAProxy高可用

六.fence防止脑裂


一.什么是HAProxy

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

二.HAProxy与nginx的对比

nginx特点:

支持TCP与Http协议,工作在网络4层和7层 
支持Session共享、Cookies引导 
支持通过URL健康检测 
支持8种负载均衡策略 
支持心跳检测

HAProxy特点:

支持Http协议,工作在网络7层 
支持通过端口健康检测 
支持强大的正则匹配规则 
支持WebSocket协议 
支持Http Cache

对于Http协议,Haproxy处理效率比Nginx高。所以,没有特殊要求的时候或者一般场景,建议使用Haproxy来做Http协议负载!但如果是Web,那么建议使用Nginx!

三.HAProxy工作原理

HAProxy有前端(frontend)和后端(backend),前端和后端都可以有多个,也可以只有一个listen块来同时实现前端和后端。
前端(frontend)区域可以根据HTTP请求的header信息来定义一些规则,然后将符合某规则的请求转发到相应后端(backend)进行处理。因此HAProxy可以实现动静分离(动静分离简单来说就是指将静态请求转发到对应的静态资源服务器,将动态请求转发到动态资源服务器),我们上篇说过的LVS就没有此功能。
 

四.实现HAProxy负载均衡

1.在server1中部署haproxy

首先我们停止在server1和server4上的keepalived,如果是新的虚拟机就不需要,并且检查lvs的策略已经刷掉了。

然后删除掉server2和server3的MAC地址,并且关闭arptables服务

然后在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.132.2:80 check     #定义的多个后端
server app2 172.25.132.3:80 check     #定义的多个后端
\\\

server1启动haproxy服务,看到端口处于监听状态,如果80端口和httpd冲突,那么需要先关闭httpd服务。

systemctl restart haproxy.service
netstat -antlp

2.在网页进行测试

server2和server3安装http,在网页发布文件分别写入server2/server3,然后启动httpd服务

 #server2
  echo server2 > /var/www/html/index.html
 systemctl restart httpd
 #server3
  echo server3 > /var/www/html/index.html
 systemctl restart httpd

然后我们就可以在浏览器输入172.25.132.1/status进行访问

3.网页测试添加密码

并且我们可以在配置文件中加入账号密码选项,这样就防止别人可以直接链接进入我们的网页

4.错误检测

然后我们测试关闭server2的httpd服务,就可以看出网页的健康监测中server2报错

然后我们重新开启server2的httpd,浏览器的健康监测就会显示服务正常,非常的高效

5.日志的读取

将配置文件中的默认日至读取目录注释掉并且复制这一行内容

然后在日至配置文件中进行添加和修改,并且重启日至服务

然后在真机中进行简单的轮询测试

然后在日至中可以进行网页访问的查看

6.source算法

源IP地址被散列并除以总数正在运行的服务器的权重,以指定哪个服务器将接收该请求。这确保了相同的客户端IP地址将总是到达相同的服务器,只要没有服务器宕机或宕机。

vim haproxy.cfg

用户进行访问(同一用户 IP 一直被调度到同一主机上)

7.自定义路由监控器

自定义设置符合监控条件的url转发到指定服务器

编译haproxy配置文件,并重新加载服务:当访问路径以/static /images等开头,以.jpg .gif等结尾时,跳入backend static模块,由该模块内server提供服务,我们这里设置的static为server3

 

这时我们的网页中出现了static这一行内容监测

然后我们在server3的httpd目录中放入一张jpg格式的照片

然后分别通过客户端和网页进行访问进行测试

8.访问黑名单与错误重定向

现实中我们需要拉黑一些恶意的Ip访问服务器
所以可以直接将IP放入黑名单或者错误重定向到其他网址

编辑haproxy的配置文件,添加黑名单

vim haproxy.cfg
\\\
    acl blacklist src 172.25.254.132
    block if blacklist

\\\
systemctl reload haproxy.service

然后用黑名单中的IP172.25.254.132主机访问发现被拒绝403

但是这样的403错误显得我们很不专业,因此我们可以进行错误重定向,将其重新定向到别的网站

vim haproxy.cfg
\\\
    errorloc 403 http://www.baidu.com       #添加错误重定向
\\\
systemctl reload haproxy.service

然后用黑名单中的用户进行访问可以发现我们的访问请求被定向到百度网页中

9.读写分离

实现效果:访问流量导向server3服务器,写入数据时导向server2服务器

编辑server1的haproxy配置文件,使得server2来接收访问流量,当写入数据时切换至server3

重启服务之后在server2和server3中都安装php

在server2网站目录下创建index.php和upload_file.php,创建upload文件夹并赋予权限,用来接收访问者上传的文件,index.php和upload_file.php文件源码需要下载,这里只需要了解 

然后编辑upload_file.php,将上传目录改为自己创建的目录upload,并且修改上传文档格式以及大小,如果我们还需要天界jpeg等格式的图片只需要按照配置文件中的格式添加即可

然后将上一步server2上创建的文件和文件夹发送给server3然后进行设置

重启httpd服务后在浏览器访问172.25.132.1进行上传测试

上传图片,在server2的指定上传目录upload中查看没有图片文件,文件在server3的upload中

五.HAProxy高可用

准备一台全新的虚拟机server4,并且配置好haproxy服务

然后开启server4中的haproxy服务

然后确保server4已经加入到haproxy的环境中

为了方便后期实验的进行,server1生成免密操作密钥,发送给server4

在真实主机上准备高可用插件的文件夹
将真机中的资源挂载在网络仓库中

然后将真机的网络仓库传输给server1

我们在server1中安装软件

再次将软件仓库传送到server4中,并且在server4中也安装同样的软件

开启server1和server4的pcsd服务,可以使用pcs命令
修改server1和server4的hacluster认证密码,然后认证

设定集群的名称为mycluster,集群内有server1和server4两个设备

pcs cluster setup --name mycluster server1 server4

启动集群内所有服务节点

pcs cluster start --all
pcs cluster enable --all

此时我们查看pcs的状态会显示报错,是因为没有禁止掉stonith功能,将其禁用就可以了

pcs property set stonith-enabled=false    ##禁用stonith功能,现在没有报警
pcs status   #查看状态

现在haproxy已经有了备用负载均衡服务器,我们可以设置一个VIP来通过访问VIP即可追踪到正在使用的haproxy,固定的VIP方便用户访问

设定vip
pcs resource create vip ocf:heartbeat:IPaddr2 ip=172.25.132.100 op monitor interval=30s     #设定VIP
ip addr #查看
pcs resource standards    #查看资源类别

ip addr进行查看可以看到我们的vip地址设置成功,然后我们pcs status看到集群状态里已经获取到了VIP信息,测试访问看到服务已经成功启动

并且在浏览器中输入172.25.132.100可以进行访问

然后我们将在server1中将节点置为后备standby状态

重新pcs status 查看集群状态后我们看到vip现在运行在了server4节点

在server4中删除vip网络接口,因为server1节点已经为后备状态了,所以vip网络接口信息又会自动生成 

ip addr del 172.25.132.100/24 dev eth0
ip addr

而我们如果手动停止server4的haproxy,会有报错信息的弹出

server1 取消节点后备状态
关闭server1、server4 的haproxy服务 

然后在server 1中将haproxy 添加到集群管理,并且将vip主动拿到server1中

pcs resource create haproxy systemd:haproxy op monitor interval=60s
pcs status     #查看集群状态

pcs status

查看状态发现vip运行在server1节点,haproxy也运行在server1节点

然后我们将server1设为备用服务器,可以看到vip和haproxy都在server4节点上运行

#server4
pcs node standby
#server1
pcs status

再次关闭server1的haproxy服务,查看集群运行状态,可以看到运行出现了错误和警告

六.fence防止脑裂

Fence主要作用是防止两个系统同时向资源写数据
破坏资源的安全性和一致性从而导致脑裂

真实主机安装fence插件

配置fence,只有在网桥的时候选择br0接口,其余回车即可

配置完可以看到之后要生成的fence_xvm.key文件的存放位置

生成fence_xvm.key文件

server1和server4分别创建目录

关闭火墙

将生成的密钥文件发送给server1、server4

在server1、server4安装客户端fence 

查询fence设备

查询fence设备的元数据

在server1将server1、server4节点添加到fence

#server1:er1(主机名:虚拟机名)

关闭server1网卡

server4中pcs status,查看到成功切换

让系统崩溃,执行后主机断点重启

server1接管

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值