负载均衡系统可以让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的朋友可以查看相关手册。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注