HAProxy+keepalived实现负载均衡(系列三)
本文介绍HAProxy+keepalived实现负载均衡的方案
LVS+keepalived实现负载均衡 (系列一);
nginx+keepalived实现负载均衡 (系列二)
HAProxy+keepalived实现负载均衡(系列三)
软件环境
本文是在如下环境进行安装
- CentOS 6.9
- JDK 1.7
- Keepalived v1.2.13 (yum安装,版本随意)
- apache-tomcat-8.5.39.tar.gz (版本随意,主要用于启动web服务)
- HAProxy 1.5.18 (yum安装,版本随意)
服务器规划
可以用虚拟机系统,分别用4台服务器,别名是
- node1:作为主,安装HAProxy+keepalived,IP
192.168.1.101
- node2:作为热备,安装HAProxy+keepalived,IP
192.168.1.102
- web1:作为web服务器,安装Tomcat,IP
192.168.1.103
- web2:同样是web服务器,安装Tomcat,IP
192.168.1.104
VIP(虚拟IP)定为192.168.1.200
实验步骤
如无特别说明,使用root帐号操作
一、基础准备工作
四台机器都要按如下操作
- 绑定静态IP
- 设置主机名,设置完成后需要重启
- 修改
hosts
,方便使用别名访问
vim /etc/hosts,添加如下
192.168.80.101 node1
192.168.80.102 node2
192.168.80.103 web1
192.168.80.104 web2
- 关闭防火墙,并禁止开机启动
service iptables stop
chkconfig iptables off
二、配置2台 Web 服务器
以下仅针对2台 Web 服务器(web1
、web2
)操作
- 安装 JDK 并配置环境变量,版本随意,选择7或8都可以
- 上传
apache-tomcat-8.5.39.tar.gz
到服务器,位置随意 - 解压,保持默认的8080端口,启动Tomcat
- 检查是否可以访问:
curl http://127.0.0.1:8080
- 修改Tomcat的首页,增加标记,以便访问时可知道落到哪台服务器
vim TOMCAT_HOME/webapps/ROOT/index.jsp
在
If you're seeing this, you've successfully installed Tomcat. Congratulations!
前面添加本机的标识,以便检验负载均衡效果的时候可以区分是什么机器,在这句话前面添加
web1 或 web2
- 在宿主机的浏览器中访问如下URL并检查是否修改成功
三、主备服务器安装 HAProxy (node1、node2)
对node1和node2操作
- 安装HAProxy:本文采用yum安装方式,
yum install haproxy
- 配置请求转发至web1和web2,编辑
/etc/haproxy/haproxy.cfg
配置文件,两台机器的HAProxy配置相同,请详细阅读下面的配置说明
# 配置说明:本配置基于yum安装后默认的配置文件上修改而来的
# 其中 `listen admin_stats` 的配置是启用haproxy的监控web界面,
# 跟本次实验无关,是可选的
# 修改 `backend app`,转到web1和web2的Tomcat即可
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------
listen admin_stats
bind 0.0.0.0:48800
bind-process 1
stats enable
mode http
log global
stats hide-version
stats uri /haproxy #访问的uri ip:8888/haproxy
stats realm Haproxy\ Statistics
stats auth admin:admin #访问帐密
stats admin if TRUE # 管理界面,如果认证成功,是否可通过WebUI操作节点
stats refresh 30s #监控状态刷新频率
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main *:5000
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 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
server app1 192.168.1.248:8080 check
server app2 192.168.1.244:8080 check
-
启动服务:
service haproxy start
-
配置好后验证一下是否能正常代理
- 访问 http://192.168.1.101:5000/ ,是否会切换web1和web2?
- 访问 http://192.168.2.102:5000/ ,是否会切换web1和web2?
四、配置主负载服务器node1的keepalived
只针对node1
进行操作
- 安装 keepalived 相关包:
yum install -y keepalived
- 编辑 keepalived.conf 配置文件:也可以备份原来的配置再修改,
vim /etc/keepalived/keepalived.conf
,修改内容如下:
vrrp_script chk_http_port {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.1.200
}
}
配置文件说明:
vrrp_script
是keepalived用于检测健康的脚本,脚本放在/etc/keepalived/check_haproxy.sh
路径state MASTER
保证是 MASTER 的值interface eth0
的 eth0,要看你自己的网卡主要是用了什么名字,一般是eth0,有些人可能是eth1,请ifconfig查看virtual_router_id
,虚拟路由编号,主备服务器要一致priority
,优先级,主备配成不一致,主大点,备小点,例如主100,备99,或主101,备100authentication
,不用改,不清楚是什么作用virtual_ipaddress
,改成VIP,如果你不是用本文的VIP,请修改成自己的- 为了避免和上一篇文章《LVS+keepalived实现负载均衡 (系列一)》设置的
virtual_router_id
相同,可能会出现问题,所以这里改成了不一样的值
注意:网上其他教程贴的配置多global_defs
的内容,实际上是不需要的,这样的例子展示出来容易误导人,让人不知道如何修改
global_defs {
notification_email {
997914490@qq.com
}
notification_email_from sns-lvs@gmail.com
smtp_server smtp.hysec.com
smtp_connection_timeout 30
router_id nginx_backup # 设置nginx backup的id,在一个网络应该是唯一的
}
- 在
/etc/keepalived/
路径新建check_haproxy.sh
文件,并chmod 755 check_haproxy.sh
,文件内容如下
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
注意: 根据你个人情况配置重启脚本/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
,另外重启haproxy失败则将keepalived关闭是正确的做法,会促使虚拟IP漂移到另一台热备机器(那台的haproxy正常)
- 配置好文件后,启动服务:
service keepalived start
五、配置备用负载服务器node2的keepalived
总体跟配置跟node1差不多,主要是配置文件有少许的差别,步骤如下
- 安装 keepalived 相关包:
yum install -y keepalived
- 编 辑keepalived.conf 配置文件:也可以备份原来的配置再修改,
vim /etc/keepalived/keepalived.conf
,修改内容如下:
vrrp_script chk_http_port {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.1.200
}
}
跟node1上的keepalived的配置区别是:
state
改成了BACKUP
priority
比主的小一点- 注意
virtual_router_id
保持一致
-
跟node1的操作一样,在
/etc/keepalived/
路径新建check_haproxy.sh
文件,并chmod 755 check_haproxy.sh
,文件跟node1的完全一样 -
配置好文件后,启动服务:
service keepalived start
验证和测试
一、理论验证
- 检验是否配置正确:在
node1
使用ip addr
查看eth0网卡必须有VIP存在,在node2
上则无(这是因为是热备的原因)
# 在node1上查看,看到192.168.1.200,而在node2上查看不到
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:0c:29:af:d6:1c brd ff:ff:ff:ff:ff:ff
inet 192.168.0.107/24 brd 192.168.0.255 scope global eth0
inet 192.168.1.201/32 scope global eth0
inet6 fe80::20c:29ff:feaf:d61c/64 scope link
valid_lft forever preferred_lft forever
-
在
node1
上关闭keepalived:service keepadlived stop
再使用ip addr
查看,发现node1
绑定的VIP没了,而在node2
上出现了,说明了主备的架构生效了,实现了备用顶替主的情况 -
重新在
node1
上将keepalived启动:service keepalived start
,则node1
重新抢回了主,这是因为其优先级比较高,恢复后抢回主动权 -
尝试在宿主机打开命令行窗口,PING 一下VIP:
ping 192.168.1.200
,应该是能ping通的,如果不通,说明有其他问题,必须解决
二、动手验证
1、在宿主机浏览器上输入VIP
可以观察到浏览器中显示Tomcat的欢迎页面,并且页面轮流转发到web1 和 web2 上
2、当 Web 服务器其中一台发生故障
关闭 web1 或 web2 的 Tomcat,会发现固定得转发请求到正常的机器,当关闭的服务器上线后,可以实现重新加入集群并接受转发
3、当”主”宕机,”备”上线
在”主”的服务器上执行service keepalived stop
模拟宕机,可以看到正常对外提供服务,在”备”的服务器上输入ip addr
查看发现接管了VIP
当然也可以从keepalived 的日志看到主备更替,详细查看 tail -f /etc/log/messages
,这里显示的主备更替的日志,更加准确反映了实时
4、当HAProxy进程死掉,会重启
service haproxy stop模拟haproxy进程宕掉,再次ps -ef|grep haproxy
可以查看进程重新被起了起来,进程的uptime刷到最新
总结
对比《nginx+keepalived实现负载均衡 (系列二)》,区别很小,仅仅是负责负载均衡的软件换成了HAProxy
HAProxy对比nginx,nginx比较适合web接口方面的负载均衡,而HAProxy除了web接口,对于socket连接的,比如mysql的负载均衡,也是适用的
HAProxy 是四层以上的代理,比起LVS配置丰富,比起nginx效率更高
HAProxy带着HA的字眼,做的工作确是代理工作
参考资料
参考博客:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135332.html