11.CentOS 8集群和负载均衡技术
11.CentOS 8集群和负载均衡技术
笼统说来集群技术可以分为三大类,分别是高可用集群(High Availability Cluster),负载均衡集群(Load Balancing Cluster)和高性能计算集群(High Preference Computing Cluster),本质上集群这个术语所描述的只是一个表象,就是看起来都是一大堆服务器在一起工作,更加深入一点也可以理解为一大堆服务器充当一台超级服务器,然后将三种技术使用集群这个词来表示,虽然不是很准确,但却十分简单易懂和流行,本章主要涉及前两种集群技术,高可用集群和负载均衡集群其实是两种完全不同的技术,但由于二者界限模糊,常常被混为一谈,虽然很多时候它们最终都可以提高服务的可用性,避免单点故障(SPF),但它们出发点及设计思想,实现思路,使用方法却有很大的不同,故笔者将高可用集群和负载均衡集群做了严格的区分,区分的目的主要是帮助大家更快更容易地理解和掌握这两种企业常用集群技术。需要指出的是,高可用集群和负载均衡集群虽是两种不同的技术,但经常可以混合部署,如集群的前端采用高可用集群,而后端采用负载均衡集群,二者协同作战以满足企业业务对业务高可用性的迫切需求。
Tips:与高可用和负载均衡集群相关的开源项目
高可用集群
◆Keepalived #轻量级高可用HA项目
负载均衡
◆LVS #四层负载均衡项目,基于Linux操作系统,更准确地说它就是Linux内核的一部分
◆HAProxy #四层和七层负载均衡项目,也可实现代理服务
兼职负载均衡
◆Apache/Nginx #负载均衡功能算是兼职吧,支持反向代理和负载均衡的Web Server,
◆Bind #DNS服务可实现最为基本的轮询负载均衡,负载均衡功能也能算是兼职
对集群这个概念有了大致了解之后,还需要熟悉集群的几个关键术语(Term):
◆集群(Cluster):为了完成一项或多项业务或服务的多台服务器的集合,可以实现高可用,负载均衡或高性能计算等功能
◆节点(Node):集群中的每台服务器称之为一个节点
◆服务(Service):集群对客户端所提供的服务
◆故障转移(Failover):将服务从无效节点迁移到有效节点得过程
◆前端(Front-End):集群的前端就是直接与客户端打交道的集群节点
◆后端(Back-End):集群的后端处理客户端请求的集群节点
1.高可用的定义和衡量标准
说了这么多高可用集群,那什么是高可用呢?高可用可以简单地定义为如下公式:
可用性 (Availability) = 可靠性 (Reliability) + 可维护性 (Maintainability)
那高可用的衡量标准又是什么呢?企业通常使用平均无故障时间MTBF(Mean Time Between Failure)这个指标来度量操作系统的可靠性,用平均修复时间MTTR(Mean Time To Repair)来度量系统的可维护性,可用性被定义为如下计算公式:
HA=MTBF/(MTBF+MTTR)*100%
高可用的终极目标就是让集群所提供的服务“健康稳定”地活着,尽可能地减少宕机和业务中断的时间。
Tips:可用性衡量标准一览
◆99% :一年宕机时间不超过3天15小时36分,俗称为2个9
◆99.9% :一年宕机时间不超过8小时46分,俗称为3个9
◆99.99% :一年宕机时间不超过52分34秒,俗称为4个9
◆99.999% :一年宕机时间不超过5分15秒,俗称为5个9
◆99.9999% :一年宕机时间不超过32秒,俗称为6个9
可用性从低到高,也十分容易记忆,从两个9到六个9。
目前主要有两个常用的高可用集群开源项目,一个是Keepalived,另外一个则是HAP Roxy,前者开始是为实现高可用而设计,由于不涉及共享存储和投票仲裁,故设计,实现和使用都比较简单,属于轻量级的高可用,小巧简单可靠,一般用于前端高可用,常用的前端高可用组合有Keepalived+LVS或Keepalived+HAproxy,通过两个节点保证关键的LVS或HAProxy作业调度服务的高可用和稳定可靠,下面就以常用的Keepalived和HAProxy为例来学习高可用和负载均衡技术。
11.1 企业常用高可用集群技术
Keepalived底层是通过成熟可靠的虚拟路由器冗余协议(VRRP)实现的高可用。VRRP(Virtual Router Redundancy Protocol)是虚拟路由器冗余协议的缩写(RFC3768),该协议类似Cisco的HSRP协议,可以让路由器实现高可用,只不过VRRP是一个开放协议,用途更加广泛,不仅可用于路由器,还可以用于服务器,来实现服务的高可用,VRRP就是Keepalived实现高可用的核心和关键,该协议的具体内容如下:
https://tools.ietf.org/html/rfc376
VRRP的架构如图11-1所示。
图11-1 VRRP的架构图(图片来源:https://www.safaribooksonline.com/)
而Keepalived的官方主页地址如下:
http://www.keepalived.org/
最新版本为2.0.18,该项目官方文档地址如下:
http://www.keepalived.org/documentation.html
对于服务器而言,VRRP协议的工作原理简而言之就是将单个服务器节点视为一台虚拟路由器,再将两个虚拟路由器模拟成一台虚拟服务器,且该虚拟服务器具有虚拟IP(VIP)地址及相应的虚拟MAC地址,可通过此VIP对外提供服务,至于提供服务的节点,万一集群中的某个节点失效,Keepalived的健康检测马上就会知道,立即将服务飘移到另外一个有效节点上,此过程完全自动实现,从而保证企业的关键服务不会中断,且由于架构简单,故实现和使用起来相对容易,且稳定性和可靠性可以做得足够好,尤其是在高负载高并发环境,Keepalived架构如图11-2所示。
图11-2 Keepalived架构图(图片来源:Keepalived官网)
从架构图可知,Keepalived在Linux用户空间(User space)主要由三个关键部件构成,分别是Core,Checkers和VRRP Stack。
◆Checkers:负责健康检查,可通过各种检查方式来了解集群的健康状态
◆Core:Keepalived的核心,负责主进程的管理,维护以及全局配置文件的加载和解析
◆VRRP Stack:用来实现VRRP协议及高可用,虚拟出一台服务器,并提供虚拟IP及MAC地址
上述部件可以让Keepalived实现如下高可用功能(不涉及LVS相关功能):
◆节点健康状况检查,能够立即发现失效节点
◆实现将虚拟IP地址从失效节点飘移到可用节点上
而这些功能,正是企业所渴望的让业务平稳运行的保证,虽说是一款免费开源项目,更难能可贵的是Keepalived稳定性及可靠性非常之高,尤其是在高负载的应用场景,为什么可以这样呢?这就需要深入研究Keepalived。
Keepalived工作在DoD的TCP/IP五层参考模型的三,四,五层,也就是网络层,传输层和应用层。根据参考模型各层所能实现的功能,下面就来深入到Keepalived在各层的工作情况。
◆三层
三层是网络层,运行着四个重要的协议:分别是互连网协议IP,互连网控制报文协议ICMP,地址转换协议ARP以及反向地址转换协议RARP,
Keepalived在网络层采用的最常见的工作方式是通过ICMP协议向服务器集群中的每个节点发送一个ICMP的数据包(类似于ping命令),如果某个节点没有返回响应数据包,那么就认为此节点发生了故障,Keepalived将报告此节点失效,并从服务器集群中剔除故障节点,这就是Keepalived的健康检测机制。
◆四层
四层是传输层,在这一层Keepalived主要使用到传输控制协议TCP和用户数据协议UDP这两个协议。传输控制协议TCP可以提供可靠的数据传输服务,IP地址和端口,代表一个TCP连接的一个连接端。要获得TCP服务,需要在发起端的一个端口上和接收机的一个端口上建立连接,而Keepalived在传输层就是利用TCP协议的端口连接和扫描技术来判断集群节点是否正常的。比如,对于常见的Web服务默认的80端口,SSH服务默认的22端口等,Keepalived一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口发生异常,然后强制将此端口对应的节点从服务器集群组中移除。
◆五层
而在应用层,可以运行FTP,HTTP,SMTP和DNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived的工作方式,如用户可以通过编写程序来运行Keepalived,而Keepalived将根据用户的设定检测各种程序或服务是否允许正常,如果Keepalived的检测结果与用户设定不一致时,Keepalived将把对应的服务从服务器中移除。
理解了Keepalived的工作机制,可见Keepalived判断主节点或另外一个节点的存活与否,主要是通过网络,所以保证网络畅通对于Keepalived至关重要,掌握了Keepalived的优点,再来谈谈其缺点,那就是Keepalived的先天缺陷,即VRRP协议是为路由器而设计,设计和实现都比较简单,根本没有考虑服务器的需求,如共享存储以及服务器集群的故障转移,只能实现基本的集群功能,如LVS,HAProxy等不涉及共享存储的服务,故称之为轻量级高可用技术。明白了这些下面就来着手实现Keepalived的部署和配置,Keepalived的高可用HA架构图如下所示。
11.1.1.部署Keepalived
从CentOS官方软件仓库安装Keepalived十分简单,具体操作如下:
dnf install -y httpd keepalived
成功安装后运行如下命令检测版本:
keepalived -v
Keepalived v2.0.10 (11/12,2018)
Copyright(C) 2001-2018 Alexandre Cassen, <acassen@gmail.com>
Built with kernel headers for Linux 4.18.0
Running on Linux 4.18.0-80.el8.x86_64 #1 SMP Tue Jun 4 09:19:46 UTC 2019
configure options: --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --program-prefix= --disable-dependency-tracking --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-snmp --enable-snmp-rfc --enable-sha1 --with-init=systemd build_alias=x86_64-redhat-linux-gnu host_alias=x86_64-redhat-linux-gnu PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig CFLAGS=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection LDFLAGS=-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld
Config options: LIBIPSET_DYNAMIC LVS VRRP VRRP_AUTH OLD_CHKSUM_COMPAT FIB_ROUTING SNMP_V3_FOR_V2 SNMP_VRRP SNMP_CHECKER SNMP_RFCV2 SNMP_RFCV3
System options: PIPE2 SIGNALFD INOTIFY_INIT1 VSYSLOG EPOLL_CREATE1 IPV4_DEVCONF LIBNL3 RTA_ENCAP RTA_EXPIRES RTA_NEWDST RTA_PREF FRA_SUPPRESS_PREFIXLEN FRA_SUPPRESS_IFGROUP FRA_TUN_ID RTAX_CC_ALGO RTAX_QUICKACK RTEXT_FILTER_SKIP_STATS FRA_L3MDEV FRA_UID_RANGE RTAX_FASTOPEN_NO_COOKIE RTA_VIA FRA_OIFNAME FRA_PROTOCOL FRA_IP_PROTO FRA_SPORT_RANGE FRA_DPORT_RANGE RTA_TTL_PROPAGATE IFA_FLAGS IP_MULTICAST_ALL LWTUNNEL_ENCAP_MPLS LWTUNNEL_ENCAP_ILA LIBIPTC LIBIPSET_PRE_V7 LIBIPVS_NETLINK IPVS_DEST_ATTR_ADDR_FAMILY IPVS_SYNCD_ATTRIBUTES IPVS_64BIT_STATS VRRP_VMAC SOCK_NONBLOCK SOCK_CLOEXEC O_PATH GLOB_BRACE INET6_ADDR_GEN_MODE VRF SO_MARK SCHED_RT SCHED_RESET_ON_FORK
从源代码编译安装
生产环境常常需要安装指定版本的keepalived,CentOS官方软件仓库未必有所需版本,这种情况,最好的办法就是从源代码编译安装了,关键操作如下:
准备工作
运行如下命令安装Keepalived编译所需工具:
dnf install -y "@Development tools" httpd libnl3-devel openssl-devel
cd
下载源代码
下面就以最新版本为例,执行如下命令下载所需源代码:
wget https://www.keepalived.org/software/keepalived-2.0.18.tar.gz
Tips:Keepalived源码大本营
Keepalived源码大本营地址如下:
http://www.keepalived.org/software/
然后解压解包,操作如下:
tar zxvf keepalived-2.0.18.tar.gz
cd keepalived-2.0.18
编译和安装Keepalived
编译和安装Keepalived关键操作如下:
./configure
make
make install
成功安装后运行如下命令检测版本:
keepalived -v
Keepalived v2.0.18 (07/26,2019)
Copyright(C) 2001-2019 Alexandre Cassen, <[email protected]>
Built with kernel headers for Linux 4.18.0
Running on Linux 4.18.0-80.el8.x86_64 #1 SMP Tue Jun 4 09:19:46 UTC 2019
configure options:
Config options: LVS VRRP VRRP_AUTH OLD_CHKSUM_COMPAT FIB_ROUTING
System options: PIPE2 SIGNALFD INOTIFY_INIT1 VSYSLOG EPOLL_CREATE1 IPV4_DEVCONF IPV6_ADVANCED_API LIBNL3 RTA_ENCAP RTA_EXPIRES RTA_NEWDST RTA_PREF FRA_SUPPRESS_PREFIXLEN FRA_SUPPRESS_IFGROUP FRA_TUN_ID RTAX_CC_ALGO RTAX_QUICKACK RTEXT_FILTER_SKIP_STATS FRA_L3MDEV FRA_UID_RANGE RTAX_FASTOPEN_NO_COOKIE RTA_VIA FRA_OIFNAME FRA_PROTOCOL FRA_IP_PROTO FRA_SPORT_RANGE FRA_DPORT_RANGE RTA_TTL_PROPAGATE IFA_FLAGS IP_MULTICAST_ALL LWTUNNEL_ENCAP_MPLS LWTUNNEL_ENCAP_ILA NET_LINUX_IF_H_COLLISION LIBIPTC_LINUX_NET_IF_H_COLLISION LIBIPVS_NETLINK IPVS_DEST_ATTR_ADDR_FAMILY IPVS_SYNCD_ATTRIBUTES IPVS_64BIT_STATS VRRP_VMAC VRRP_IPVLAN IFLA_LINK_NETNSID CN_PROC SOCK_NONBLOCK SOCK_CLOEXEC O_PATH GLOB_BRACE INET6_ADDR_GEN_MODE VRF SO_MARK SCHED_RT SCHED_RESET_ON_FORK
两种安装方式大家可以根据自己的需求灵活选择,不过从官方软件仓库安装比编译安装简单一点。
Tips:Keeplived的默认配置及日志在哪里?
Keeplived的默认配置及日志文件位置如下:
◆Keepalived默认配置文件:/etc/keepalived/keepalived.conf
◆Keepalived默认日志文件:/var/log/messages
11.1.2.配置Keepalived的主备模式
企业中常用的Keepalived模式无非两种,一种是主备(Master-Backup)模式,即两个节点,一主一备,万一主节点宕机,备份节点马上顶上,另外一种则是双主模式(Backup-Backup),即两个节点互为备份节点,这两种模式的配置略有差异,下面先来实现企业中所流行的主备模式Keepalived的配置,下面就采用官方软件仓库版本来演示,Keepalived的高可用HA节点规划如下:
主机名 IP地址/子网掩码
Master (主服务器) :k1(master) 192.168.1.186/24
Backup (备份服务器) :k2(slave) 192.168.1.187/24
Virtual IP (虚拟IP) :vip 192.168.1.200
准备工作
运行如下命令关闭SELinux:
setenforce 0
sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config
SELinux可能会影响Keepalived的监控脚本的执行,故需关闭。
Keepalived的主配置文件为keepalived.conf,该文件大致包括以下几个配置区域,分别是global_defs,virtual_server,vrrp_instance和vrrp_script,说明如下。
◆global_defs:Keepalived的全局配置
◆virtual_server:虚拟服务器的必要设定,如做LVS的高可用,还有real_server关键字可用
◆vrrp_instance:用来定义对外提供服务的VIP及其虚拟服务器的相关属性,
◆vrrp_script:用来侦测服务守护进程是否存活的脚本
先来创建vrrp_script区域所需检测服务进程是否存活的脚本,此脚本内容如下:
vi /sbin/httpd_check.sh
#!/bin/bash #这个脚本几乎就是一个vrrp_script脚本的一个模板,其他服务也可以套用
#Checking Apache Web service is alive or not
COUNTER=$(ps -C httpd --no-heading|wc -l)
if [ "${COUNTER}" = "0" ]; then
systemctl stop keepalived #如果httpd进程终止,进程数自然会变为0,此时则关闭keepalived进程,让另外一个节点接管虚拟服务器
fi
运行如下命令添加执行权限:
chmod u+x /sbin/httpd_check.sh
需要注意的是,多数Keepalived需要通过Shell脚本来监控服务是否可用,故脚本一定要具有可执行权限,该脚本由Keepalived进行调用,完成上述操作后即可开始配置Keepalived主备节点了。此外还需添加如下用户,具体操作如下:
useradd -g users -M keepalived_script
主节点执行如下命令创建keepalived.conf主配置文件,关键配置如下:
vi /etc/keepalived/keepalived.conf
配置文件内容参考如下:
! Configuration File for keepalived #固定格式,表示配置文件的开始,不可或缺
global_defs {
notification_email {
hxl2000@gmail.com #管理员邮箱,一行一个,出现故障将发邮件
}
notification_email_from [email protected] #设置邮件发件人地址
smtp_server [email protected] #SMTP服务器地址,可以使用公司自己的,也可以使用互联网上免费的
smtp_connect_timeout 30 #SMTP服务器连接超时时间
router_id apacheha #标识此节点字符串,通常为主机名,故障发生时,邮件通知将会用到
script_user root #以root用户身份执行监控脚本
}
vrrp_script check_httpd {
script "/sbin/httpd_check.sh" #Apache服务检测并试图重启
interval 2 #每2秒检查一次
weight -5 #检测失败(脚本返回非0)则优先级减少5个值
fall 3 #如果连续失败次数达到此值,则认为服务器已失效
rise 2 #如果连续成功次数达到此值,则认为服务器已生效,但不修改优先级
}
vrrp_instance VI_1 { #VRRP实例名称
state MASTER #可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER
interface ens33 #节点的网卡名称,用来收发VRRP包做心跳检测
virtual_router_id 51 #虚拟路由ID,取值在0-255之间,用来区分多个instance的VRRP组播,同一网段内ID不能重复;主备节点必须为一致;
priority 100 #优先级的取值范围是1-255,默认值是100,所设置的优先级,数值越大优先级越高,MASTER权重要高于BACKUP,
要成为Master,此值最好高于其他节点50
advert_int 1 #健康查检时间间隔,默认为1秒,即1秒进行一次Master选举
authentication { #认证类型有PASS和HA(IPSEC),推荐使用PASS,其密码可识别前8位
auth_type PASS #默认是PASS认证
auth_pass 12345678 #PASS认证密码
}
virtual_ipaddress {
192.168.1.168 #定义虚拟IP地址(VIP),可以定义多个
}
track_script { #设置VRRP脚本定义字段名为check_httpd,并通过该字段所定义的路径和脚本名称找到Apche健康检测脚本
check_httpd
}
}
备份节点(192.168.1.187)上keepalived.conf文件和主节点大致相同,比较省力的办法是直接从主节点复制过来,之后修改以下几个关键参数即可:
...
state BACKUP #此值可设置或不设置,只要保证下面的priority不一致即可
interface ens33 #根据实际情况设置网卡名称,此处采用CentOS默认名称
priority 40 #此值要一定小于主节点上的值,且建议相差50
...
在配置keepalived.conf时,需要特别注意的是配置文件的语法格式一定要正确且不要出现重复的VIP,因为keepalived在启动时并不检测配置文件的正确性,更加过分的是即使没有配置文件,keepalived也能照样可以启动,所以在启动前一定要前检查一下配置文件的正确性,以免出现不可预料的错误。
配置完成后,Double check一下配置文件,如果没有问题,便可执行如下命令启动和启用httpd和Keepalived:
systemctl start httpd #启动和启用httpd
systemctl enable httpd
systemctl start keepalived #启动和启用Keepalived
systemctl enable keepalived
启动之后,通过以下命令可以查看其状态:
systemctl status keepalived #后面将经常用到此命令
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2019-09-29 15:44:37 EDT; 44s ago
Process: 3722 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 3725 (keepalived)
Tasks: 6 (limit: 23858)
Memory: 6.8M
CGroup: /system.slice/keepalived.service
├─3725 /usr/sbin/keepalived -D
├─3726 /usr/sbin/keepalived -D
├─3832 /bin/bash /usr/sbin/httpd_check.sh
├─3833 [httpd_check.sh]
└─3835
Sep 29 15:44:40 k1 Keepalived_vrrp[3726]: Sending gratuitous ARP on ens160 for 192.168.1.200
Sep 29 15:44:40 k1 Keepalived_vrrp[3726]: Sending gratuitous ARP on ens160 for 192.168.1.200
Sep 29 15:44:40 k1 Keepalived_vrrp[3726]: Sending gratuitous ARP on ens160 for 192.168.1.200
Sep 29 15:44:40 k1 Keepalived_vrrp[3726]: Sending gratuitous ARP on ens160 for 192.168.1.200
Sep 29 15:44:45 k1 Keepalived_vrrp[3726]: Sending gratuitous ARP on ens160 for 192.168.1.200
Sep 29 15:44:45 k1 Keepalived_vrrp[3726]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.1.200
Sep 29 15:44:45 k1 Keepalived_vrrp[3726]: Sending gratuitous ARP on ens160 for 192.168.1.200
Sep 29 15:44:45 k1 Keepalived_vrrp[3726]: Sending gratuitous ARP on ens160 for 192.168.1.200
Sep 29 15:44:45 k1 Keepalived_vrrp[3726]: Sending gratuitous ARP on ens160 for 192.168.1.200
Sep 29 15:44:45 k1 Keepalived_vrrp[3726]: Sending gratuitous ARP on ens160 for 192.168.1.200
keepalived会运行三个进程:
ps -ef | grep keepalived
root 3725 1 0 15:44 ? 00:00:00 /usr/sbin/keepalived -D
root 3726 3725 0 15:44 ? 00:00:00 /usr/sbin/keepalived -D
最后通过以下命令可以查看VIP当前绑定在哪个节点上:
ip addr
...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:14:9a:bd brd ff:ff:ff:ff:ff:ff
inet 192.168.1.200/24 brd 192.168.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.1.186/32 scope global ens33
valid_lft forever preferred_lft forever
...
运行如下命令重启Keepalived:
systemctl restart keepalived #此时会尝试读取/etc/keepalived/keepalived.conf配置文件
这时如果关闭主节点上的httpd服务,VIP将会飘到备份节点上继续工作,需要注意的是,一定确保没有二个角色同时为主。一主一备模式的基本配置就是这样,至于双主模式的配置,请参考MySQL高可用部分,那里有完整和详细的双主配置,其他更多的特性及配置,请参阅Keepalived的官方文档进行配置。
11.2 负载均衡技术
和高可用集群设计思想和实现不同,负载均衡技术的主要目的是让集群中的各个节点负载大致平衡,如性能较高的节点任务多一点,低性能节点任务少一点,如果各个节点性能相当,就平均分配任务,避免某些节点出现过高或过低负载的极端情况,如常说的集群中的节点忙的忙死,闲的闲死,就是这种情形,更麻烦的是,如果负载过高超出了节点能力的极限,就很容易出现假死及没有响应的故障,负载均衡技术本质上上是对集群负载的分配,协调和管理,所以企业大多采用负载均衡技术,如实力雄厚的公司常常采用昂贵的硬件负载均衡设备,如F5或Array,间接地提高了集群的稳定性及可用性,而更多的企业则采用软负载均衡技术,即通过软件来实现负载均衡,下面将深入软负载均衡技术。
对于企业而言,软负载均衡技术的实现也十分灵活和多样,最早通过DNS服务实现负载均衡,后来出现了比DNS服务提供更多调度算法的更为专业负载均衡程序LVS和HAProxy,此外可以通过Web服务器实现负载均衡(基于七层的负载均衡),如Nginx本身提供的负载均衡及反向代理功能企业就很常用。目前企业中流行的负载均衡开源项目,使用比较多的除了Nginx负载均衡和反向代理,就是LVS和HAproxy了,由于LVS配置较为简单且难以展示,下面就来掌握负载均衡项目HAprxoy。
11.2.1.四层和七层负载均衡之HAProxy
HAProxy即可以实现四层负载均衡,也可以实现七层负载均衡,实现略有差异,其官方网站更是将"The Reliable,High Performance TCP/HTTP Load Balancer"作为自己的slogan。
负载均衡学习HAProxy之安装与配置
HAProxy能够为企业提供负载均衡及基于TCP(第四层)和HTTP(第七层)的应用代理,关键是开源,便捷和可靠。HAProxy特别适用于那些高负载站点,除了可以实现负载均衡,还可以提供常用的会话保持及七层处理应用代理,此外HAProxy完全可以同时支持成千上万并发连接,既可以实现负载均衡,保证企业业务稳定高效地运行,又能保护重要服务不暴露到互联网,事实上,很多著名互联网企业都是HAProxy的忠实用户,如亚马逊,GitHub,Stack Overflow和Twitter等知名网站,具体报告及参数请访问其官网获得。
HAProxy有企业和社区两大版本,最新社区稳定版本为1.8.1,项目Logo如图11-3所示。
图11-3 HAProxy项目的Logo
官方网站地址如下:
http://www.haproxy.org/
官方文档地址如下:
http://www.haproxy.org/#docs
Tips:HAProxy高并发的秘密
多数服务都是要么基于多进程,要么基于多线程,不过它们均受内存限制,系统调度器限制以及锁限制,很少能处理数千并发连接,而HAProxy则实现了一种事件驱动,单一进程模型,此模型能够支持非常大的并发连接数,因为事件驱动模型有更好的资源和时间管理的用户端(User-Space)实现所有这些任务,所以没有太多限制,唯一的问题就是在多核环境扩展性较差,不过可以通过优化CPU时间片加以解决。
对于企业而言,HAProxy最大的优点就是媲美专业硬件负载均衡F5或Array的稳定性,尤其是在高负载环境中的优良表现。此外,就是HAProxy的灵活性,可以实现七层和四层单独或混合应用,如企业需要很多网络服务和应用,有些服务为了安全需要通过TCP四层实现代理服务,而有些应用则要求实现七层负载均衡,HAProxy就可以这样混搭使用。本文主要侧重负载均衡,并主要实现HAProxy七层负载均衡,实际比较常用的三个节点的HAProxy负载均衡,架构图如下。
主机名 IP地址/子网掩码
LB (主服务器): lb 192.168.1.180/24 #最好设置主机名,可选项
Web1 (从服务器1):web1 192.168.1.181/24
Web2 (从服务器2):web2 192.168.1.182/24
部署HAProxy
部署HAProxy有源码方式和CentOS官方软件仓库两种方式,各有利弊,大家可以根据需求选择。
1.从CentOS官方软件参考安装
从CentOS官方软件参考部署,优点是稳定,确定是版本可能较老,企业应用也无所谓了,执行如下命令部署HAProxy:
dnf install -y haproxy
成功安装完成后,运行如下命令启动HAProxy服务:
systemctl start haproxy
然后如下命令检测其当前状态:
ps -ef |grep haproxy
root 8156 1 0 19:43 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
haproxy 8157 8156 0 19:43 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
或用如下命令查看HAProxy版本:
haproxy -v
HA-Proxy version 1.8.15 2018/12/13
Copyright 2000-2018 Willy Tarreau <willy@haproxy.org>
HAProxy七层负载均衡配置
以七层流行的Web服务为例来实现HAProxy的七层负载均衡,具体方法如下。
1.编辑HAProxy主配置文件
配置HAProxy主要就是配置HAProxy的主配置文件haproxy.cfg,基本配置(不涉及ACL的使用)及配置选项说明如下:
vi /etc/haproxy/haproxy.cfg
global #开始全局参数配置
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https:#hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256::RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults #配置常用参数的默认值
log global
mode http #默认模式mode 主要有两个重要参数,分别是tcp和http 其中tcp为四层负载均衡,http则是七层负载均衡
option httplog
option dontlognull
timeout connect 5000 #连接超时,可自定义
timeout client 50000 #客户端超时,可自定义
timeout server 50000 #服务器超时,可自定义
errorfile 400 /etc/haproxy/errors/400.http #设置HAProxy的错误页面
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http #以上为HAProxy主配置文件默认配置
frontend Local_Node #添加HAProxy的监听器,HAProxy将监听端口80
bind *:80 #定义监听端口,接受客户端请求并与之建立连接
mode http #应用层HTTP 7层类型
default_backend Web_Servers #指定后端Web服务器集群名称
backend Web_Servers #添加后端Web服务器集群,名字要和前端所定义的一致,可以根据功能定义多组后端服务器
mode http
balance roundrobin #指定为最简单的轮询算法,one by one,一个接一个地循环
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
option httpchk HEAD / HTTP/1.1rnHost:localhost
server web1.example.com 192.168.1.181:80 #HAProxy将客户端的请求根据轮询算法转发到这些后端Web服务器
server web2.example.com 192.168.1.182:80
从上述配置可知,HAProxy主配置文件主要有global,defaults,frontend和backend这四个重要配置段,其实还有一个listen配置段也很常用,不过通常只对四层TCP流量有效,常用于代理之用,仅作了解。之后重启HAProxy服务,令配置立即生效,具体操作如下:
systemctl restart haproxy
最后在两台Web服务器上运行如下命令安装Apaache:
dnf install httpd -y
并将主页设置为如下内容:
echo 'Web Server 1:192.168.1.181'>/var/www/html/index.html #Web Server 2需要修改相应参数
systemctl restart httpd
HAProxy的各个节点安装和配置成功后,就可以在浏览器中访问HAProxy负载均衡服务,所访问地址如下:
http://192.168.1.180/
连续单击浏览器的刷新按钮,就可以看到访问的是后端的两个Web服务器,且根据轮询算法依次访问不同的Web服务器。
基于四层的负载均衡
前面已经实现了基于七层的负载均衡,下面就来实现基于四层代理的负载均衡,架构图如下。
至于HAProxy的安装部署,和七层负载均衡完全一致,关键差异就在HAProxy的如下配置内容,配置HAProxy前,先运行如下命令创建所需目录:
sudo mkdir /run/haproxy
之后执行如下命令开始配置:
vi /etc/haproxy/haproxy.cfg
...
defaults
log global
mode http
# option httplog #注释掉此行
option dontlognull
# option forwardfor except 127.0.0.0/8 #注释掉此行
timeout connect 5000
timeout client 50000
timeout server 50000
...
上述配置中还可以添加统计配置,这样就可以通过浏览器监控HAProxy的状态了。
最后执行如下命令检测配置是否成功:
systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2019-09-29 21:00:20 EDT; 1s ago
Process: 50350 ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q (code=exited, status=0/SUCCESS)
Main PID: 50352 (haproxy)
Tasks: 2 (limit: 23858)
Memory: 2.6M
CGroup: /system.slice/haproxy.service
├─50352 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
└─50353 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
Sep 29 21:00:20 pxe.example.com systemd[1]: Starting HAProxy Load Balancer...
Sep 29 21:00:20 pxe.example.com systemd[1]: Started HAProxy Load Balancer.
或:
netstat -anptu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1889/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1050/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1048/cupsd
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 7636/sshd: root@pts
tcp 0 0 0.0.0.0:6688 0.0.0.0:* LISTEN 50353/haproxy
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
...
在181和182节点上安装MySQL服务器,且一定要设置好本地和远程登录密码,而在主节点只安装MySQL客户端,然后主节点运行如下命令:
mysql -uroot -P6688 -h192.168.1.180 -p
即可直接连接到后端任意一台MySQL服务器上,说明访问主节点的6688端口实际是访问后台MySQL服务器,因为主节点并没有安装MySQL服务。此外,在各个MySQL节点可以通过如下命令检测连接:
netstat -anptu
...
tcp 0 0 192.168.1.180:34902 192.168.1.181:3306 ESTABLISHED 51325/haproxy
tcp 0 0 192.168.1.180:6688 192.168.1.180:55898 ESTABLISHED 51325/haproxy
tcp 0 0 192.168.1.180:55898 192.168.1.180:6688 ESTABLISHED 51624/mysql
...
如果主节点多发起几次连接,通常可以看到180主节点将会把连接请求根据负载均衡算法分配给后端的MySQL服务器。
11.2.2.四层和七层负载均衡最本质的区别
两种负载均衡最本质的区别是,四层负载均衡是基于IP地址和端口的负载均衡,而七层的负载均衡是基于URL等应用层信息的负载均衡,且从企业应用实际就体现在七层负载均衡对负载均衡设备的要求较高。
HAProxy监控部分的配置可以参考七层负载均衡的配置,配置文件后,就可以启动了,不过在这之前,两个MySQL数据库节点需要先实现主主复制,实现方法这里不做展开,请参见22章相关内容。HAProxy在四层模式下,HAProxy仅在客户端和服务器之间转发双向流量,而在七层模式下,HAProxy将分析协议,且可通过对请求 (Request)或回应(Response)里指定的内容的管理(如允许或拒绝等)及增删改来控制协议,这种操作要基于特定规则。
对于负载均衡使用者而言,LVS的四层负载均衡支持TCP和UDP协议,只能通过ip+port实现负载分发,由于是操作系统层面支持,并发量和稳定性的表现都很好并得到企业大量应用,而Haproxy是七层负载均衡,可以实现更细粒度的负载分发,且有专门的TCP和HTTP解决方案。
本章小结
Keepalived和Pacemaker是企业中十分流行的高可用套件,而HAProxy是目前使用最广泛的负载均衡开源项目,再加上前面章节所提到的Apache,Bind和Nginx虽然都是开源软件,但品质和可靠性都很高,中小型企业,如对于日PV小于600万的网站,用Nginx就完全可以胜任,但如果是大型互联网公司,服务器也比较多,想要低成本地获得较好的负载均衡效果,可以选择Keepalived或HAProxy。
更多应用场景,需要灵活地,综合地运用上述各种负载均衡技术来实现最合身的架构,服务于企业的业务,如针对于互联网企业,Web前端,选择Nginx实现负载均衡并辅以HAProxy或Keepalived获得更高的可用性,而Web后端则采用Keepalived和LVS的架构对MySQL数据库做支撑,再此基础上实现一主多从及读写分离,或再此基础之上根据项目需求灵活定制最适合的方案,Nginx,LVS和HAProxy的组合非常多,也非常灵活,此处只抛砖引玉,就不一而足了。
EOF
扩展阅读
VRRP on Linux Using Keepalived – The Basics
https://packetpushers.net/vrrp-linux-using-keepalived-2/
How to configure HAProxy in Openstack (High Availability)
https://www.golinuxcloud.com/configure-haproxy-in-openstack-high-availability/
Install and Configure HAProxy on RHEL 8 / CentOS 8 Linux
https://linuxconfig.org/install-and-configure-haproxy-on-redhat-8
参考文档
https://en.wikipedia.org/wiki/Gluster
https://www.keepalived.org/manpage.html
http://www.haproxy.org/#docs
https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts#load-balancing-algorithms
https://cbonte.github.io/haproxy-dconv/1.8/configuration.html
https://www.haproxy.com/knowledge-base/