架构图
环境
- HAproxy1 192.168.100.10
- HAproxy2 192.168.100.11
- html1 192.168.100.12
- html2 192.168.100.13
- PHP1 192.168.100.14
- PHP2 192.168.100.15
- VIP 192.168.100.16
html1和html2与php1和php2配置
为了实验方便,全部使用httpd服务
[root@html1 ~]# yum -y install httpd
[root@html1 ~]# echo html1 > /var/www/html/index.html
[root@html1 ~]# systemctl start httpd
[root@html2 ~]# yum -y install httpd
[root@html2 ~]# echo html2 > /var/www/html/index.html
[root@html2 ~]# systemctl start httpd
[root@PHP1 ~]# yum -y install httpd
[root@PHP1 ~]# echo PHP1 > /var/www/html/index.php
[root@PHP1 ~]# systemctl start httpd
[root@PHP2 ~]# yum -y install httpd
[root@PHP2 ~]# echo PHP2 > /var/www/html/index.php
[root@PHP2 ~]# systemctl start httpd
HAproxy配置
HAproxy1上
安装相关软件
[root@haproxy1 ~]# yum -y install haproxy keepalived
修改haproxy配置文件
[root@haproxy1 ~]# vim /etc/haproxy/haproxy.cfg
配置内容:
global #全局配置
log 127.0.0.1 local3 info #日志配置
maxconn 4096 #最大连接限制(优先级低),同时服务多少连接
user nobody #用户
group nobody #用户组
daemon #守护进程运行
nbproc 1 #haproxy进程数,设置应该和服务器本身核心数一样,过多的进程数可能导致经常崩溃
pidfile /run/haproxy.pid #进程id存储位置
defaults #针对(listen和backend块进行设置如果块中没设置,则使用默认设置)默认设置
log global #日志使用全局配置
mode http #模式7层LB
maxconn 2048 #最大连接数(优先级中)
retries 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 #监听的端口
mode http #http模式的负载均衡(七层)
log global #日志类型跟随全局
option httplog #日志类型http日志格式
option httpclose #打开支持主动关闭功能,每次请求完毕后主动关闭http通道,ha-proxy不支持keep-alive,只能模拟这种模式的实现
acl php url_reg -i \.php$ #acl<ACL名字><类型><大小写><规则>
acl html url_reg -i \.html$ #html:访问控制列表的名称 url_reg:用户输入的url地址可以被reg正则服>务 -i:忽略大小写 \.html$:匹配规则,>上同
use_backend php-server if php #use_backend <服务器组> if <ACL名字>
use_backend html-server if html #如果满足ACL html规则,则推送给后端服务器后台,html-server,上同
default_backend html-server #负载均衡的方式
backend php-server #后端服务器统称
mode http #http模式(七层)
balance roundrobin #负载均衡的方式(轮询)
option httpchk GET /index.php #健康检查(访问后端服务器网页,如果访问到则说明是好的,配合前面的尝试三次)
cookie SERVERID insert indirect nocache #客户端的cookie信息,将真实服务器ID回复给客户的消息中
server php-A 192.168.100.14:80 weight 1 cookie 1 check inter 2000 rise 2 fall 5
server php-B 192.168.100.15:80 weight 1 cookie 2 check inter 2000 rise 2 fall 5
#wegit 1 权重为1
#cookie 1 标识serverid为1
#check inter 2000 检测心跳频率
#rise 2 2次正确认为服务器可用
#fall 5 5次失败认为服务器不可用
backend html-server
mode http
balance roundrobin
option httpchk GET /index.html
cookie SERVERID insert indirect nocache
server html-A 192.168.100.12:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
server html-B 192.168.100.13:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
[root@haproxy1 ~]# systemctl start haproxy
[root@haproxy1 ~]# systemctl status haproxy
HAproxy2上
HAproxy2一样的配置
中段测试
在浏览器中访问:
http://192.168.100.10
http://192.168.100.11
http://192.168.100.10/index.php
http://192.168.100.11/index.php
如果能访问到相应的内容,则继续
Keepalived配置
HAproxy1上
更改配置位置
[root@HAproxy1 ~]# vim /etc/keepalived/keepalived.conf
配置如下:
! Configuration File for keepalived #配置文件声明,前面不得有空行或者空格
global_defs {
router_id 1 #设备在组中的标识
}
vrrp_script chk_haproxy { #检查健康
script "/etc/keepalived/ck_ha.sh" #检查脚本
interval 2 #检查频率(秒)
weight -5 #降低优先级
fall 3 #失败三次
}
vrrp_instance VI_1 { #VI_1。实例名两台路由器相同。注意区分
state MASTER #主或者从状态
interface ens32 #监控网卡
mcast_src_ip 192.168.100.10 #心跳源IP
virtual_router_id 55 #虚拟路由编号,主备要一致,注意区分
priority 100 #优先级
advert_int 1 #心跳间隔
authentication { #秘钥认证(1-8位)
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { #VIP
192.168.100.16/24
}
track_script { #引用脚本
chk_haproxy
}
}
编写监控http服务脚本
[root@haproxy1 ~]# vim /etc/keepalived/ck_ha.sh
内容如下:
#!/bin/bash
#检查haproxy进程是否存在
counter=$(ps -C haproxy --no-heading | wc -l)
if [ "${counter}" = "0" ];then
#尝试启动一次haproxy,停止5秒后再次检测
service haproxy start
sleep 5
counter=$(ps -C haproxy --no-heading | wc -l)
if [ "${counter}" = "0" ];then
#如果没有启动成功,就杀掉keepalived触发主备切换
service keepalived stop
fi
fi
添加执行权限
[root@haproxy1 ~]# chmod +x /etc/keepalived/ch_ha.sh
[root@haproxy1 ~]# systemctl start keepalived.service
HAproxy2上
HAproxy2的配置相同,只有keepalived的配置文件中稍作改动
router_id 2
state BACKUP
mcast_src_ip 192.168.100.11
priority 99
测试
在浏览器中访问:
http://192.168.100.16
http://192.168.100.16/index.php
将HAproxy1的haproxy服务stop掉,会发现隔5秒内会自动启动
将keepalived服务stop掉会发现VIP飘到了HAproxy2上