企业部分实战---用haproxy实现负载均衡及高可用
一、Haproxy基础知识
1.haproxy简介
(1)HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件;适用于负载大的web站点,这些站点通常又需要会话保持或七层处理。它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上
(2)HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接;事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。
(3)HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害,这也是其他负载均衡没有的优点
(4)Haproxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器.
2.Haproxy配置文件详解
配置文件主要分为5部分:
global:全局变量的参数,属于进程配置,通常与操作有关
defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件
frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器
Listen :frontend和backend的组合体.
3.haproxy的安装与负载均衡实现
server1:
yum install haproxy -y 安装haproxy
cd /etc/haproxy
vim haproxy.cfg 编辑haproxy配置文件
systemctl stop httpd 由于haproxy需要占用80端口,关闭apache防止冲突
systemctl restart haproxy
netstat -antlp 过滤端口,查看那个服务占用80端口
haproxy配置文件编辑:
haproxy监控的是server3、server4的80端口,此处只需打开他们的httpd
server3、server4:
systenmctl start httpd
测试:
server1:
curl 172.25.12.1 访问172.25.12.1发现负载均衡已实现
firefox:172.25.12.1/status 实现监控
网页监控:
关闭server3的httpd服务
二、haproxy独立日志
1.haproxy独立日志的实现
vim /etc/sysconfig/rsyslog
vim haproxy.cfg
vim /etc/rsyslog.conf
systemctl restart rsyslog.service
cat /var/log/messages
此时访问172.25.1.2不会再在messages下产生日志,所有关于haproxy的日志都会在haproxy.log下产生
2.资源固定传输、权重算法+故障处理
2.1资源固定传输算法
vim /etc/haproxy/haproxy.conf
systemctl restart haproxy.service
此时访问172.25.12.1只会分配给一个设备
2.2权重算法
vim /etc/haproxy/haproxy.conf
systemctl restart haproxy.service
此时访问172.25.12.1,设备会按权重分配
2.3故障处理
当server3、server4都检测不到时,我们需要一个背锅侠去告诉客户出现故障了,这里我们就用server1来当背锅侠,具体设置如下:
vim /etc/haproxy/haproxy.conf
systemctl restart haproxy.service
配置完成后需要修改各个服务器的httpd端口为相应数值
修改完成后,在server3、server4正常工作时,server1并不会被访问到
server1:
vi /etc/httpd/conf/httpd.service
将server1主机中httpd 服务的80端口改为8000端口,然后重启服务
systemctl restart httpd
echo "sorry,please try again later" > /var/www/html/index.html 给index.html文件中追加内容
systemctl restart haproxy.service
此时,server1成功背锅
2.4访问黑名单+黑名单用户访问重定向
server1:
vim /etc/haproxy/haproxy.conf
systemctl restart haproxy.service
此时在除了的主机访问172.25.12.12时都可以正常实现负载均衡
会自动被定向至报错页面
也可直接将黑名单用户指定至指定页面:
三、用haproxy实现动静分离、读写分离、keepalived+haproxy高可用、paramaker+corosync+haproxy高可用
1.用haproxy实现动静分离
server3:
yum install -y php
cd /var/www/html/
ls
vim index.php
cat index.php
<?php
phpinfo()
?>
vim /etc/httpd/conf/httpd.conf (端口改回80)
systemctl restart httpd
server3:
mkdir /var/www/html/images
server1:
vim haproxy.cfg
systemctl restart haproxy.service
动态访问:
静态访问:
2.用haproxy实现读写分离
server3、4:
mkdir /var/www/html/upload
cp index.php upload_file.php /upload 将老师准备的php文件移至upload目录中
vim upload_file.php 将文件上传大小修改
chmod 777 upload
mv /upload/* /var/www/html
此时先在浏览器中直接访问4的index.php,并上传图片。上传后切至目录中查看,发现上传成功
下载完毕后删除图片,因为最终我们需要通过haproxy下载图片
server1:
vim haproxy.cfg
systemctl restart haproxy.service
firefox:172.25.1.2/index.php
可见图片上传到了app后端server4.读写分离完成
3.keepalived+haproxy实现高可用
server2:
yum install haproxy -y
vim /etc/haproxy/haproxy.conf 可直接从server1 scp过来
vim /etc/keepalived/keepalived.conf
scp /etc/keepalived/keepalived.conf server1:/etc/keepalived
vim /opt/check_haproxy.sh
scp /opt/check_haproxy.sh server1:/opt
server1 keepalived.cfg
server2 keepalived.cfg
/opt/check_haproxy.sh
#!/bin/bash
systemctl status haproxy &>/dev/null || systemctl restart haproxy &> /dv/null
killall -0 haproxy
if [ $? -ne 0 ];then
systemctl stop keepalived
firefox:172.25.12.100:
此时若故意写错server1中的keepalived.conf使得server1瘫痪,调度器会自动启用server2,实现haproxy高可用
4.paramaker+corosync+haproxy高可用
server1、servcer2:
systemctl stop keepalived.service
systemctl start pcsd
systemctl status pcsd
pcs cluster start --all
pcs resource delete webgroup
pcs resource create haproxy systemd:haproxy op monitor interval=60s
pcs resource create vip ocf:heartbeat:IPaddr2 ip=172.25.11.100 op monitor interval=30s
pcs resource group add webgroup vip haproxy
当执行ssh server2 pcs cluster stop 命令以后,server2主机挂掉了,资源被server1接管,不影响使用