负载均衡系统可以让Web服务器在轻松应对大流量数据而不至于出现宕机情况,本教程将详细讲解在Linux系统如何实现负载均衡和高可用。
什么是负载均衡
负载均衡是指将工作量分配到不同服务器的处理教程,就像在公司中将工作分成白班和夜班由不同员工来完成一样。负载均衡提高了系统的可靠性,因为它克服了单点故障。典型不具备负载均衡的单点系统如下图所示:
图.1 单点服务器系统
在单点服务器系统中,如果系统中的Web服务器出现故障,那么用户请求就得不到响应。同样,如果大量用户请求服务器相同页面,则处理用户请求的过程将变得十分缓慢。于是负载均衡系统被采用了,可以提高系统性能、提供备份以及避免故障。
本文将演示如何使用Nginx、HAProxy和Keepalived搭建具有负载均衡功能的Web服务器,系统典型拓扑图如下:
图.2 典型Nginx、HaProxy和Keepalived负载均衡系统拓扑结构
现在需要了解一下Nginx、HaProxy和Keepalived倒底可以做什么。
Nginx
Nginx,发音读做Engine-x,是一种开源Web服务器,但它又仅仅是Web服务器,它同样可以成为反向代理服务器、邮件代理服务器、负载均衡器、轻量级文件服务器以及HTTP缓存器。Nginx因其低资源消耗和高性能,所以被广大网站所采用。
HAProxy
HAProxy指High Availability Proxy,是一款开源负载均衡软件,为基于TCP和HTTP的应用提供负载均衡、高可用以及传输代理解决方案。它通过将工作负载分配到不同服务器的方式,来提高系统性能和稳定性。HAProxy的功能是将终端用户请求引导至可用的服务器为用户提供响应。
Keepalived
如果HAProxy负载均衡系统出故障,那该怎么办?
Keepalived是一款开源软件,支持负载均衡和高可用。它基本功能是为OSI传输模型中的两层提供负载均衡路由:
- OSI第四层:传输层
- OSI第七层:应用层
Keepalived可以实现如下功能:
- 健康检查:检测服务器是否运行正常
- 实现VRRP(virtual redundancy routing protocol-虚拟冗余路由协议)处理负载均衡故障
Keepalived使用虚拟IP作为主用负载均衡器和备用负载均衡器的浮动IP,以便在不同服务器间进行切换。如果主用服务器宕机,则自动由备用服务器处理web请求。
现在将开始逐步演示如何实现Web服务器的高可用和负载均衡。
Linux系统使用Nginx、HAProxy和Keepalived实现负载均衡
首先需要说明的是,本教程所做的配置仅为实验性质,只是为了让大家了解如何搭建负载均衡系统。如果在正式环境实现时,可能会根据不同情况做出相应的调整,希望本教程只是一个了解相应技术的学习材料,而不要被照搬用于正式环境。
作为演示,本教程使用CentOS Linux发行版,当然也可以使用其它发行版,但不保证所有命令在其它发行版也可正常执行。
实验环境需求说明
使用4台CentOS服务器,系统最小化安装即可:
- 2台CentOS安装nginx
- 2台CentOS安装HAProxy和Keepalived
本教程使用如下地址规划方案,大家可以根据实际情况自行修改对应的IP地址。
Nginx Web服务器:
- web1:172.16.200.100
- web2:172.16.200.200
HAProxy 负载均衡:
- HAProxy1:172.16.200.10
- HAProxy2:172.16.200.20
Keepalived 虚拟IP:
- 172.16.200.1
1] 安装Nginx
本部分是为规划的两台Web服务器安装Nginx,需要使用如下命令:
# yum install epel-release //安装epel软件库 # yum install nginx //安装nginx # systemctl start nginx //启动nginx # systemctl enable nginx //设置nginx自启动 # systemctl status nginx //查看nginx状态
安装成功后,使用如下命令开启防火墙的HTTP及HTTPS访问:
# firewall-cmd --zone=public --permanent --add-service=http # firewall-cmd --zone=public --permanent --add-service=https # firewall-cmd --reload
对于另一台Nginx服务器,重复执行以上命令。
现在就要修改服务器的首页内容了,注意命令会有所区别,用于识别响应请求的服务器,修改nginx的默认主面文件”/usr/share/nginx/html/index.html”为相应内容:
# echo -E "<h2>This is webserver 1</h2>" > /usr/share/nginx/html/index.html //web1执行 # echo -E "<h2>This is webserver 2</h2>" > /usr/share/nginx/html/index.html //web2执行
温馨提示:如果使用虚拟机进行测试,则可以配置好一台服务器,然后克隆到另一台,再对不同主机进行相应修改即可,这样不仅可以节省时间,又避免出现错误。
最后就是通过浏览器分别浏览不同服务器,查看web服务器是否工作正常。
图.3 分别浏览web服务器验证nginx工作状态
当然,如果不方便使用浏览器的话,使用”curl”命令也可以。
2] 使用HAProxy搭建负载均衡器
在另外两台HAProxy服务器,执行以下命令安装HAProxy:
# yum -y update # yum -y install haproxy
HAProxy的配置文件位于”/etc/haproxy/”,使用如下命令备份默认配置文件并新建一个新的配置文件”haproxy.cfg”:
# cd /etc/haproxy/ # mv haproxy.cfg haproxy.cfg_bac # touch haproxy.cfg # vim haproxy.cfg
将如下内容保存到新建的配置文件中:
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon defaults mode http log global option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 frontend http_front bind *:80 stats uri /haproxy?stats default_backend http_back #--------------------------------------------------------------------- # round robin balancing backend http #--------------------------------------------------------------------- backend http_back balance roundrobin mode http server web1 172.16.200.100:80 check # ip_address_of_1st_webserver_1 server web2 172.16.200.200:80 check # ip_address_of_1st_webserver_1
之后就是使用如下命令启动HAProxy、设置开机启动以及查看其工作状态:
# systemctl start haproxy # systemctl enable haproxy # systemctl status haproxy
HAProxy的状态页位于”http://IP_OF_HAProxy/haproxy?stats”,本例为”http://172.16.200.10/haproxy?stats”和”http://172.16.200.20/haproxy?stats”,可以查看HAProxy的运行统计。
图.4 HAProxy状态页
现在在终端”curl”多次HAProxy服务器,则会出现如下输出:
图.5 负载均衡功能测试
可以看到,多次访问HAProxy服务器时,每次请求都可能由不同的web服务器作出响应,这样就有效的分配了工作量,达到web服务器负载均衡的目的。
如果此时停止web2的Nginx服务,则HAProxy会自动检测到web2的故障,会将全部请求转向web1。
3] 使用Keepalived创建高可用
Keepalived需要同时安装在两台HAProxy负载均衡服务器上,一台作为主用另一台作用备用。
在两台HAProxy服务器上执行下如下命令安装Keepalived:
# yum install -y keepalived
Keepalived的配置文件为”/etc/keepalived/keepalived.conf”,使用如下命令备份原配置文件并创建一个新的配置文件:
# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bac # touch /etc/keepalived/keepalived.conf # vim /etc/keepalived/keepalived.conf
将如下内容添加到新建的配置文件中(注意修改其中的邮件地址为实际邮箱):
global_defs { notification_email { rultr.com service@rultr.com } notification_email_from service@rultr smtp_server smtp.rultr.com smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface ens32 //设置侦听网络端口可以使用$ ip a命令查看 virtual_router_id 51 priority 101 //101用于主用服务器、100用于备份服务器 advert_int 1 authentication { auth_type PASS auth_pass rultr.com //设置认证密码 } virtual_ipaddress { 172.16.200.1 //设置虚拟IP } }
注意:虚拟IP可以是负载均衡器网段内的任意可用地址,本例中负载均衡器IP地址分别为”172.16.200.10″和”172.16.200.20″,而虚拟IP则使用”172.16.200.1″。
根据负载均衡器的使用性质来编辑相应的配置文件,假设HAProxy1为主用,HAProxy2为备用,则备用服务器的配置文件”vrrp_instance”部分修改为:
vrrp_instance VI_1 { state BACKUP interface ens32 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass rultr.com } virtual_ipaddress { 172.16.200.1 } }
最后,就是验证高可用负载均衡系统是否一切工作正常,输入如下命令:
# while true; do curl 172.16.200.1; sleep 5;done
在脚本执行过程中,我们如果停止主用keepalived的haproxy服务,则会报错连接被拒绝,之后再停止主用服务器的keepalived服务,则虚拟IP工作正常,业务自动切换至备用服务器,整个过程如下图所示:
图.6 手动模拟主用服务器故障测试Keepalived切换
相所,如果停止备用服务器的HAProxy服务和Keepalived服务,则不会出现任何切换,有兴趣的朋友可以自行测试。
以上就是使用HAProxy、Nginx和Keepalived实现负载均衡和高可用的全部内容,可以看出,系统具有高度的稳定性,即便出现服务器单点故障,也可以轻松实现自动切换,完全不需要人工干预。
对于需要深入了解HAProxy和Keepalived的朋友可以查看相关手册。