Haproxy负载均衡
概念
HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种**事件驱动**, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
优点
• 可靠性和稳定性非常好,可以与硬件的F5相媲美
• 最高可以同时维护40000–50000个并发连接,单位时间内处理的最大请求数为20000个,最大数据处理能力可达10Gbps
• 支持多于8种负载均衡算法 ,同时也支持session保持
• 支持虚拟主机功能
• 从HAProxy 1.3版本后开始支持连接拒绝、全透明代理等功能
• HAProxy 拥有一个功能强大的服务器状态监控页面
• HAProxy 拥有功能强大的ACL支持
keepalive高可用集群
概念
- Keepalived是Linux下一个轻量级别的高可用解决方案。中文名称:存活检测机制。起初针对LVS进行研发,专门用来监控集群系统中各个服务节点的状态。如果负载调度器出现故障,keepalive检测到以后将故障点直接从集群中剔除。
keepalived可解决的问题
- 因为企业应用中,单台LVS服务器(单挂)承担应用存在单点故障的危险;单点故障一旦发生,企业服务将发生中断,造成极大的危害。
作用
- 支持故障自动切换、支持节点健康状态检查
keepalive工作模式
-
Initialize模式
-
- 设备启动时进入此状态,当收到接口Startup的消息,将转入Backup或Master状态(IP地址拥有者的接口优先级为255,直接转为Master)。在此状态时,不会对VRRP报文做任何处理。
-
Master模式
-
- 定期发送 VRRP 报文
- 以虚拟 MAC 地址响应对虚拟 IP 地址的 ARP 请求
- 转发目的标MAC 地址为虚拟 MAC 地址的 IP 报文
- 如果它是这个虚拟 IP 地址的拥有者,则接收目的 IP 地址为这个虚拟 IP 地址的 IP 报文。否则,丢弃这个 IP 报文
- 如果收到比自己优先级大的报文则转为 Backup 状态
- 如果收到优先级和自己相同的报文,并且发送端的 IP 地址比自己的 IP 地址大,则转为 Backup 状态
- 当接收到接口的 Shutdown 事件时,转为Initialize(初始状态)
-
Backup模式
-
- 接收 Master 发送的 VRRP 报文,判断 Master 的状态是否正常
- 对虚拟 IP 地址的 ARP 请求,不做响应
- 丢弃目的 MAC 地址为虚拟 MAC 地址的 IP 报文
- 丢弃目的 IP 地址为虚拟 IP 地址的IP报文
- Backup 状态下如果收到比自己优先级小的报文时,丢弃报文,立即切换为 Master( 仅在抢占模式下生效 )
- 如果收到优先级和自己相同或者比自己高的报文,则重置定时器,不进一步比较 IP 地址
- 当接收到接口的 Shutdown 事件时,转为 Initialize
- 如果 MASTER_DOWN_INTERVAL 定时器超时,则切换为 Master
案例
keepalive+Haproxy负载均衡
实验环境
一台客户机(192.168.1.1)
一台master+Haproxy(192.168.1.2)
一台slave+Haproxy(192.168.1.3)
一台web1(192.168.1.4)
一台web2(192.168.1.5)
1、配置IP地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
systemctl stop firewalld
2、安装Haproxy服务(两台安装步骤都一样)
yum -y install pcre-devel zlib-devel #安装所需要的插件
tar -zxvf haproxy-1.4.24.tar.gz -C /usr/src/
cd /usr/src/haproxy-1.4.24/
make TARGET=linux26 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
mkdir /etc/haproxy
cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /etc/haproxy/
mkdir /usr/share/haproxy
如果启动时出现报错:Starting proxy cacti: cannot bind socket
则执行:
sysctl -e net.ipv4.ip_nonlocal_bind=1
ln -s /usr/local/haproxy/sbin/* /usr/sbin/
cp /usr/src/haproxy-1.4.24/examples/haproxy.init /etc/init.d/haproxy #配置systemctl启动文件 启动Haproxy
chmod +x /etc/init.d/haproxy
/etc/init.d/haproxy start
/etc/init.d/haproxy status #这是用ln软连接方式复制出来的绝对路径用于打开Haproxy
netstat -anp | grep haproxy #占用的也是TCP的80端口
chkconfig --add haproxy
chkconfig haproxy on
3、配置Haproxy文件
vim /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
chroot /usr/share/haproxy
uid 99
gid 99
daemon
#debug
#quiet
defaults
log global
mode http
option httplog
option dontlognull
retries 3
# redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen webcluster 0.0.0.0:80
option httpchk GET /index.html
balance roundrobin
server inst1 192.168.1.4:80 check inter 2000 fall 3
server inst2 192.168.1.5:80 check inter 2000 fall 3
4、安装web服务(两台)
yum -y install httpd
web1:
echo "欢迎来到192.168.1.4网页" > /var/www/html/index.html
vim /etc/httpd/conf/httpd.conf
keepalive off #取消页面保持
systemctl restart httpd
web2:
echo "欢迎来到192.168.1.5网页" > /var/www/html/index.html
vim /etc/httpd/conf/httpd.conf
keepalive off #取消页面保持
systemctl restart httpd
5、安装并配置keepalive服务(两台)
yum -y install openssl openssl-devel #安装前的准备
tar -zxvf keepalived-1.2.13.tar.gz -C /usr/src/
cd /usr/src/keepalived-1.2.13/
./configure --prefix=/usr/local/keepalived/
make && make install
配置keepalive的文件
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
chkconfig --add keepalived
systemctl restart keepalived
- 配置master调度器
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL-r1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
- 配置slave调度器
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL-r1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
6、测试
客户端测试
firefox 192.168.1.100 #成功访问到web1、web2 进行轮训查询
firefox 192.168.1.2 #成功访问到web1、web2 进行轮训查询
firefox 192.168.1.3 #成功访问到web1、web2 进行轮训查询