一、HA集群中的相关术语
1.节点 (node)
运行集群进程的一个独立主机,称为节点,节点是集群的核心组成部分,每个节点上运行着操作系统和高可用软件服务,在高可用集群中,节点有主次之分,分别称为主节点和备用/备份节点,每个节点拥有唯一的主机名,并且拥有属于自己的一组资源,例如,磁盘、文件系统、网络地址和应用服务等。主节点上一般运行着一个或多个应用服务。而备用节点一般处于监控状态。
2.资源(resource)
资源是一个节点可以控制的实体,并且当节点发生故障时,这些资源能够被其它节点接管,集群软件中,可以当做资源的实体有:
磁盘分区、文件系统
IP地址VIP
应用程序服务
NFS文件系统
3.事件(event)
也就是集群中可能发生的事情,例如节点系统故障、网络连通故障、网卡故障、应用程序故障等。这些事件都会导致节点的资源发生转移,集群的测试也是基于这些事件来进行的。
4.动作(action)
事件发生时HA的响应方式,动作是由sShel脚步控制的,例如,当某个节点发生故障后,备份节点将通过事先设定好的执行脚本进行服务的关闭或启动。进而接管故障节点的资源。
1. 集群的分类
a. 高可用集群
高可用集群的英文全称是High Avoilability Cluster,简称HA Cluster,高可用的含义是最大限度的可以使用,从集群的名字上可以看出,此类集群实现的功能是保障用户的应用程序持久、不间断的提供服务 。当应用程序出现故障,或者系统硬件、网络出现故障时,应用可以自动、快速从一个节点切换到另一个节点,从而保证应用持续、不间断的对外提供服务,这就是高可用集群实现的功能。

双机热备 是最简单的应用模式,即经常说的active/standby 方式,它使用两台服务器,一台作为主服务器(action),运行应用程序对外提供服务,另一台作为备机(Stondby),安装和主服务器一样的应用程序,但是并不启动服务,处于待机状态。主机和备机之间通过心跳技术相互监控 ,监控的资源可以是网络、操作系统、也可以是服务,用户可以根据自己的需要,选择需要监控的资源,当备机监控到主机的某个资源出现故障时,根据预先设定好的策略,首先将IP切换过来,然后将应用程序服务也接管过来,接着就由备机对外提供服务,由于切换过程时间非常端,用户根本感觉不到程序出了问题,而且还进行了切换,从而保障了应用程序持久、不间断的服务。
高可用集群一般是通过高可用软件来实现的,在linux下常用的高可用软件有:开源heartbea HA、Redhat提供的RHCS、商业软件ROSE、keepalived等 。在下面的章节中我们会详细介绍的keepalived配置和使用。
b. 负载均衡集群
负载均衡系统的英文全称为Load Balance Cluster,简称LB ClUuster,负载均衡集群也是有两台或者两台以上的服务器组成,分为前端负载调度和后端节点服务两个部分,负载调度部分负责把客户端的请求按照不同的策略分配给后端服务节点,而后端节点是真正提供应用程序服务的部分。
与HACiuster不同的是,**在负载均衡集群中,所有的后端节点都处于活动状态,**它们都对外提供服务,分摊系统的工作负载。
负载均衡集群可以把一个高负荷的应用分散到多个节点来共同完成 ,适用于业务繁忙、大负荷访问的应用系统,但是它也有不足的地方:当一个节点出现故障时,前端调度系统并不知道此节点已经不能提供服务,仍然会把客户端的请求调度到故障节点上来,这样访问就会失败,为了解决这个问题,负载调度系统一般都引入了节点监控系统。
节点监控系统位于前端负载调度机上 ,负责监控下面的服务节点,**当某个节点出现故障后,节点监控系统会自动将故障节点从集群中剔除,**当此节点恢复正常后,节点监控系统又会自动将其加入集群中,而这一切,对用户来说是完全透明的。

c. 分布式计算集群
分布式计算集群,这类集群致力于提供单个计算机所不能提供的强大的计算能力,包括数值计算和数据处理,并且倾向于追求综合性能。

二、Keepalived简介
Keepalived是Linux下一个轻量级的高可用解决方案,它与HACMP、RoseHA实现的功能类似,都可以实现服务或者网络的高可用,但是又有差别:HACMP是一个专业的、功能完善的高可用软件,它提供了HA软件所需的基本功能,比如心跳检测和资源接管,监测集群中的系统服务,在群集节点间转移共享IP地址的所有者等,HACMP功能强大,但是部署和使用相对比较麻烦,同时也是商业化软件;与HACMP相比,Keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HACMP功能强大,但Keepalived部署和使用非常简单,所有配置只需一个配置文件即可完成。这也是本课程重点介绍Keepalived的原因。
1、Keepalived的用途
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态。它根据layer3,4&5交换机制检测每个服务节点的状态,如果某个服务节点出现异常,或工作出现故障,Keepalived将检测到,并将出现故障的服务节点从集群系统中剔除,而在故障节点恢复正常后,Keepalived又可以自动将此服务节点重新加入到服务器集群中,这些工作全部自动完成,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
Keepalived后来又加人了VRRP的功能,VRRP是Virtual Router Redundancy Protocol (虚拟路由器冗余协议)的缩写,它出现的目的是为了解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断地、稳定地运行。因此Keepalived一方面具有服务器状态检测和故障隔离功能,另一方面也具有HAclUster功能.下面详细介绍下VRRP协议的实现过程
2、VRRP协议与工作原理
在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)完成的,而主机之间的路由器一旦出现故障,通信就会失败,因此,在这种通信模式中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。熟悉网络的学员对VRRP协议应该并不陌生。它是一种主备模式的协议,通过VRRP可以在网络发生故障时透明地进行设备切换而不影响主机间的数据通信,这其中涉及两个概念:物理路由器和虚拟路由器。
VRRP可以将两台或多台物理路由器设备虚拟成一个虚拟路由器 ,这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,而在虚拟路由器内部,是多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由器被称为主路由器(处于MASTER角色)。,它拥有对外服务的虚拟IP,提供各种网络功能,如ARP请求、ICMP、数据转发等。而其他物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为备份路由器(处于BACKUP角色)。当主路由器失效时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色继续提供对外服务,整个切换过程对用户来说完全透明。
在一个虚拟路由器中,只有处于MASTER角色的路由器会一直发送VRRP数据包,处于BACKUP角色的路由器只接收MASTER发过来的报文信息,用来监控MASTER运行状态,因此,不会发生MASTER抢占的现象,除非它的优先级更高。而当MASTER不可用时,BACKUP也就无法收到MASTER发过来的报文信息,于是就认定MASTER出现故障,接着多台BACKUP就会进行选举,优先级最高的BACKUP将成为新的MASTER,这种选举并进行角色切换的过程非常快,因而也就保证了服务的持续可用性。
3、Keepalived的体系结构
Keepalived是一个高度模块化的软件,结构简单,但扩展性很强,下图是官方给出的Keepalived体系结构拓扑图。

三、Keepalived安装与配置
1. Keepalived的安装过程
keepalived的安装非常简单,以操作系统环境RHEL发行版为例,建议通过yum方式直接安装:
[root@keepalived-master app]# yum install keepalived
如果需要Ivs功能,还需要安装ipvs模块:
[root @keepalived-master app]# yum install ipvsadm
也可以通过源码安装,过程如下:
[rooteepalived-master app]# yum install-y gcc gcc-c++ wget popt-devel openssl-devel-devel-devel
[root@keepalived-master app]# yum install-y libnl3 libnl3-devel
[[root@keepalived-2.3.1.tar app]# tar zxvfkeepalived-2.tar.gz
[root@keepalived-master app]# cd keepalived-2.3.1
[root@keepalived-master keepalived-2.3.1]#./configure --sysconf/etc
[root@keepalived-master keepalived-2.3.1]#make
[root@keepalived-master keepalived-2.3.1]# make install
[root@keepalived-master keepalived-2.3.1]# systemctl enable keepalived
安装完成后,进入keepalived的配置过程。默认模板配置文件位于/etc/keepalived/keepalived.conf.sample
2. Keepalived的全局配置
在上节安装Keepalived的过程中,指定了Keepalived配置文件的路径为/etc/Keepalived/Keepalived.conf ,Keepalived的所有配置均在这个配置文件中完成。由于Keepalived.conf文件中可配置的选项比较多,这里根据配置文件所实现的功能,将Keepalived配置分为三类,分别是:
-
- 全局配置(Global Configuration)、
- VRRPD配置
- LVS配置。
下面将主要介绍下Keepalived配置文件中一些常用配置选项的含义和用法。

3. Keepalived的VRRPD配置
VRRPD配置是Keepaived所有配置的核心,主要用来实现Keepalived的高可用功能。下面进入VRRP实例的配置,也就是配置Keepalived的高可用功能。VRRP实例段主要用来配置节点角色(主或从)、实例绑定的网络接口、节点间验证机制、集群服务P等。下面是实例VL1的一个配置样例。

依次是指定主从,指定网卡,指定虚拟路由器标识,指定节点的权重(优先级),设置主从节点检查的时间间隔,设置额外的网络接口(备用,进行切换),设置节点通信和密码,设置虚拟的ip地址, 设置不抢占功能(nopreempt),设置延迟的时间(到了多少时间才会进行切换),状态告警脚本(服务脚本)、服务管理脚本、状态脚本
以上VRRP配置以"vrrp_instanced"作为标识,在这个实例中包含了若干配置选项,分别介绍如下:
vrrp_instanced的配置
- vrrp_instance是VRRP实例开始的标识,后跟VRRP实例名称。
- state用于指定Keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。
- interface用于指定HA监测网络的接口。
- virtuaLrouter_id是虚拟路由标识,这个标识是一个数字,同一个vrp实例使用唯一的标识,即在同一个Vrrp_instance下,MASTER和BACKUP必须是一致的。
- priorify用于定义节点优先级,数字越大表示节点的优先级就越高。在一个Vrrp.instance下,MASTER的优先级必须大于BACKUP的优先级。
- advert_int用于设定MASTER与BACKUP主机之间同步检查的时间间隔,单位是秒。
- track_interface用于设置一些额外的网络监控接口,其中任何一个网络接口出现故障,Keepalived都会进入FAULT状态。
- Aauthentication用于设定节点间通信验证类型和密码,验证类型主要有PASS和AH两种,在一个Vrrp.instance下,MASTER与BACKUP必须使用相同的密码才能正常通信。
- virtuaLipaddress用于设置虚拟IP地址(VIP),又叫做漂移IP地址。可以设置多个虚拟IP地址,每行一个。之所以称为漂移IP地址,是因为Keepalived切换到Master状态时,这个IP地址会自动添加到系统中,而切换到BACKUP状态时,这些IP又会自动从系统中删除。Keepalived通过"ip address add"命令的形式将VIP添加进系统中。要查看系统中添加的VIP地址,可以通过"ipadd" 命令实现。"virtual ipaddress" 段中添加的P形式可以多种多样,例如可以写成"192.168.16.189/24 deveth1" 这样的形式,而Keepalived会使用IP命令"ip addr add192.168.16.189/24 deveth1" 将IP信息添加到系统中。因此,这里的配置规则和IP命令的使用规则是一致的。
服务脚本的配置和选择
nopreempt设置的是高可用集群中的不抢占功能。在一个HACluster中,如果主节点死机了,备用节点会进行接管,主节点再次正常启动后一般会自动接管服务。这种来回切换的操作,对于实时性和稳定性要求不高的业务系统来说,还是可以接受的,而对于稳定性和实时性要求很高的业务系统来说,不建议来回切换,毕竟服务的切换存在一定的风险和不稳定性,在这种情况下,就需要设置nopreempt这个选项了。设置nopreempt可以实现主节点故障恢复后不再切回到主节点,让服务一直在备用节点工作,直到备用节点出现故障才会进行切换。在使用不抢占时,只能在"state"状态为"BACKUP"的节点上设置,而且这个节点的优先级必须高于其他节点。
preemtp_delay用于设置切换的延时时间,单位是秒。有时候系统启动或重启之后网络需要经过一段时间才能正常工作,在这种情况下进行发生主备切换是没必要的,此选项就是用来设置这种情况发生的时间间隔。在此时间内发生的故障将不会进行切换,而如果超过"preemtp_delay"指定的时间,并且网络状态异常,那么才开始进行主备切换。
notify_master:指定当Keepalived进入Master状态时要执行的脚本,这个脚本可以是一个状态报警脚本,也可以是个服务管理脚本。Keepalived允许脚本传入参数,因此灵活性很强。
notify_backup:指定当Keepalived进入Backup状态时要执行的脚本,同理,这个脚本可以是一个状态报警脚
也可以是一个服务管理脚本。
notify_fault:指定当Keepalived进入Fault状态时要执行的脚本,脚本功能与前两个类似。
notify_stop:指定当Keepalived程序终止时需要执行的脚本。
4. Keepalived的LVS配置
由于Keepalived属于LVS的扩展项目,因此,Keepalived可以与LVS无缝整合,轻松搭建一套高性能的负载均衡集群系统。下面介绍下Keepalived配置文件中关于LVS配置段的配置方法。
-
LVS段的配置以"virtuaLserver"作为开始标识,此段内容有两部分组成,分别是reaLserver段和健康检测段。下面是virtual_server段常用选项的一个配置示例:
virtual_server 192.168.12.200 80 {
delay_loop 6 #健康检查的时间间隔
lb_algo rr # 设置负载调度的算法 rr(轮询) wr(权重)
lb_kind DR # 设置实现负载均衡的方式 DR(直接路由,同网段)
persistence_timeout 50 #超时时间(不活动时间50s),访问一个服务器的会话保持
persistence_granularity# 对上的扩展表示持久连接是否对多个ip进行生效
protocol TCP #指定转发的协议
sorry_Server. # 备用 -
下面是real_server段的一个配置示例:
reaL_server 192.168.12.132 80{
weight 3 #权重
inhibit_on_failure #权重设置0
notify_Up| #状态执行脚本
notify_down| #状态执行脚本
}
下面介绍每个选项的含义。
reaLserver:是reaLserver段开始的标识,用来指定real server节点,后面跟的是real server的真实IP地址和端口,IP与端口之间用空格隔开。
weight:用来配置real server节点的权值。权值大小用数字表示,数字越大,权值越高。设置权值的大小可以为不同性能的服务器分配不同的负载,为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配了系统资源。
inhibit_on_failure:表示在检测到real server节点失效后,把它的"weight" 值设置为0,而不是从IPVS中删除。
notify_up:此选项与上面介绍过的notify_maser有相同的功能,后跟一个脚本,表示在检测到real server节点服务处于UP状态后执行的脚本。
notify_down:表示在检测到real server节点服务处于DOWN状态后执行的脚本。
- 健康检测段允许多种检查方式,常见的有HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK、MISC_CHECK。
首先看 TCP_CHECK检测方式示例:
TCP_CHECK {
connect_port 80 #检测端口
connect_timeout 3 #表示无响应超时时间,单位是秒,这里是3秒超时。
nb_get_retry 3 #表示重试次数,这里是3次。
delay_before_retry 3 #表示重试间隔,这里是间隔3秒。
}
下面介绍每个选项的含义介。
connect_port:健康检查的端口,如果无指定,默认是rea_server指定的端口。
connect_timeout:表示无响应超时时间,单位是秒,这里是3秒超时。
nb_get_retry:表示重试次数,这里是3次。
delay_before_retry:表示重试间隔,这里是间隔3秒。
下面是HTTP GET和SSLGET检测方式的示例:
HTTP_GET|SSL_GET
url {
path /index.html
digest e6c271eb5f017f280cf97ec2f51b02d3
status_code 200
connect_port 80
bindto 192.168.12.80
connect_timeout 3
nb_get retry 3
delay_before_retry 2
}
下面介绍每个选项的含义。
Url:用来指定HTTP/SSL检查的URL信息,可以指定多个URL。
path:后跟详细的URL路径。
digest:SSL检查后的摘要信息,这些摘要信息可以通过genhash命令工具获取。例如:genhash-s 192.168.12.80-p 80-u
/index.html.
status_code:指定HTTP检查返回正常状态码的类型,一般是200。
bindto:表示通过此地址来发送请求对服务器进行健康检查。

四、Keepalived基础功能应用实例
Keepalived提供了vrrp_script、notify_master、notify_backup等多个功能模块,通过这些模块可以实现对集群资源的托管以及集群服务的监控。
1. Keepalived基础HA功能演示
在默认情况下,Keepalived可以实现对系统死机、网络异常及Keepolived本身进行监控,也就是说当系统出现死机、网络出现故障或Keepolived进程异常时,Keepalived会进行主备节点的切换。但这些还是不够的,因为集群中运行的服务也随时可能出现问题,因此还需要对集群中运行服务的状态进行监控,当服务出现问题时也进行主备切换。Keepalived作为一个优秀的高可用集群软件,也考虑到了这一点,它提供了一个vrp_script模块专门用来对集群中服务资源进行监控。
a. 配置Keepalived

通过此表可以看出,这里要部署一套基于HTTPD的高可用集群系统。关于Keepolived的安装,之前已经做过详细介绍,这里不再多说,上面已经给出keepalived-master节点的keepalived.conf文件的内容。点击下载即可。
keepalived-backup节点上的keepalived.conf配置文件内容与keepalived-master节点上的基本相同,需要修改的地方有两个:
将 "state MASTER" 更改为 "state BACKUP".
将priority100更改为一个较小的值,这里改为"priority80"
配置文件

-0 探测 httpd是否正常
检测间隔,每隔2s检查
主节点和备用节点配置完毕,然后启动服务,systmctl start keepalived
五、通过vrrp_script实现对集群资源的监控
1、通过killall命令探测服务运行状态
这种监控集群服务的方式主要是通过kilall命令实现的。kilal会发送一个信号到正在运行的指定命令的进程。如果没指定信号名,则发送SIGTERM.SIGTERM也是信号名的一种,代号为15,它表示以正常的方式结束程序的运行。其实kilal可用的信号名有很多,可通过"kilall-"命令显示所有信号名列表,其中每个信号名代表对进程的不同执行方式,例如,代号为9的信号表示将强制中断一个程序的运行。这里要用到的信号为0,代号为0的信号并不表示要关闭某个程序,而表示对程序(进程)的运行状态进行监控,如果发现进程关闭或其他异常,将返回状态码1 ,反之,如果发现进程运行正常,将返回状态码0。Vrrp_script模块正是利用了kilall命令的这个特性,变相的实现了对服务运行状态的监控。
下面看一个实例:
vrrp_script check_mysqld
{
script "killall -0 mysqld"
interval 2
}
track_script{
check_mysgld
}
在这个例子中,定义了一个服务监控模块check_mysqld,其采用的监控的方式是通过"kilall-0mysqld"的方式,其中"interval"选项检查的时间间隔,即2秒钟执行一次检测。

步骤:
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_httpd {
script "killall -0 httpd"
interval 2
}
vrrp_instance HA_1 {
state MASTER # 自定义修改主节点和备用节点
interface eth0
virtual_router_id 80
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass qwaszx
}
notify_master "/etc/keepalived/master.sh "
notify_backup "/etc/keepalived/backup.sh"
notify_fault "/etc/keepalived/fault.sh"
track_script {
check_httpd
}
virtual_ipaddress {
192.168.66.80/24 dev eth0 #改成自己的网段
}
}
Keepalived高可用配置中的三个脚本文件记得改成权限755:
Keepalived高可用配置中的三个脚本文件,内容如下:
其中,master.sh文件的内容为:
#!/bin/bash
LOGFILE=/var/log/keepalived-mysql-state.log
echo "[Master]" >> $LOGFILE
date >> $LOGFILE
backup.sh文件的内容为:
#!/bin/bash
LOGFILE=/var/log/keepalived-mysql-state.log
echo "[Backup]" >> $LOGFILE
date >> $LOGFILE
fault.sh文件的内容为:
#!/bin/bash
LOGFILE=/var/log/keepalived-mysql-state.log
echo "[Fault]" >> $LOGFILE
date >> $LOGFILE
这三个脚本的作用是监控Keepalived角色的切换过程,从而帮助读者理解notify参数的执行过程。
设置不抢占模式:nopreempt
vrrp_instance ha_1{
state BACKUP #全部设置为备用节点
interface enp0s8
virtual_router_id 125
priority 100
advert int 2
nopreempt #加上关键词nopreempt
...
}
2、检测端口运行状态
检测端口的运行状态, 也是最常见的服务监控方式,在Keepalived的vrrp_script模块中可以通过如下方式对本机的端口进行检测:
script "</dev/tcp/127.0.0.1/80"
interval 2
fall 2 #失败几次
rise 1 # 成功几次
}
track_script {
check_httpd}
在这个例子中, 通过 "</dev/tcp/127.0.0.1/80" 这样的方式定义了一个对本机80端口的状态检测, 其中,"fall"选项表示检测到失败的最大次数, 也就是说, 如果请求失败两次, 就认为此节点资源发生故障, 将进行切换操作; "rise" 表示如果请求一次成功, 就认为此节点资源恢复正常。
3、通过shell语句进行状态监控
在Keepalived的vrrp_script模块中甚至可以直接引用shell语句进行状态监控,例如下面这个示例:
vrrp_script chk_httpd {
script "if [ -f /var/run/httpd/httpd.pid ];then exit 0; else exit 1; fi"
interval 2
fall 1
rise 1
}
track_script {chk_httpd
}
在这个例子中,通过一个shell判断语句,检测httpd.pid文件是否存在,如果存在,就认为状态正常,否则认为状态异常,这种监测方式对于一些简单的应用监控或者流程监控非常有用。从这里也可以得知,vrrp_script模块支持的监控方式十分灵活。
4、通过脚本进行服务状态监控
这是最常见的监控方式, 其监控过程类似于Nagios的执行方式, 不同的是,这里只有0、1两种返回状态, 例如下面这个示例:
vrrp_script chk_mysqld {
script "/etc/keepalived/check_mysqld.sh"
interval 2
}
track_script {
chk_mysqld
}
其中, check_mysqld.sh的内容为:
#!/bin/bash
MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD='xxxxxx'
$MYSQL-h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" > /dev/null 2>&1
if [$? = 0 ]; then
MYSQL_STATUS=0
else
MYSQL_STATUS=1
fi
exit $MYSQL_STATUS
这个一个最简单的实现mysal服务状态检测的shel脚本,它通过登录mysal数据库后执行查询操作来检测mysq运行是否正常,如果检测正堂,将返回状态码0,否则返回状态码1。其实很多在Nagios下运行的脚本,只要稍作修改,即可在这里使用,非常方便。
六、keepalived问题排查技巧
检测两个keepalived主机之间是否能通信的办法有:
1、停掉一个keepalived,看另外一个keepalived的日志/var/log/messages里是否有新的日志
2、用嗅探器抓包,例如
tcpdump -v -i eth1 host 224.0.0.18
tcpdump -vvv -n -i eth1 host 224.0.0.18
其中,224.0.0.18是VRRP组播使用的目的地址,默认为组播每秒发送一次。
另外,在做集群的时候,尽量关闭每个主机上的selinux(/etc/selinux/config 关闭selinux:disable)服务和iptables服务,这样会减少很多问题。
七、高性能负载均衡集群LVS
1、LVS体系结构
使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层,用Load Balancer表示,中间的服务器群组层,用Server Array表示,最底端的数据共享存储层,用Shared Storage表示,在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。LVS体系结构如下图所示:

2、IP负载均衡(NAT、TUN和DR)
负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法、有基于客户端调度访问的方法、有基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的是IP负载均衡技术。
LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,Ivs集群整个执行流程为:访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡机制有三种分别是NAT、TUN和DR,详述如下:
a. DR模式

DR模式:即Virtual Server via Direct Routing,也就是用直接路由技术实现虚拟服务器。VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户。这种调度方式的性能最好的。
1、DR模式是通过在调度器LB上修改数据包的目的MAC地址实现转发。因此数据包来源地址保持不变,目的地址仍然是VIP地址。
2、请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此并发访问量大时使用效率很高(和NAT模式比)
3、因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面
4、RS主机需要绑定VIP地址在LO接口上,并且需要配置ARP抑制。
5、RS节点的默认网关不需要配置成LB,而是直接配置为上级路由的网关,能让RS直接出网就可以。
6、由于DR模式的调度器仅做MAC地址的改写,所以调度器LB就不能改写目标端口,那么RS服务器就得使用和VIP相同的端口提供服务。
b. NAT/FULL NAT模式
NAT模式: 即Virtual Server via Network Address Translation,也就是网络地址翻译技术实现虚拟服务器。
当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)
改写成选定的Real Server地址,同时将报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的RealServer。在服务器端得到数据后,Real Server将数据返回给用户时,
需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。

c. NAT模式优缺点
1、NAT模式不需要LBIP和realserverip在同一个网段。
2、NAT技术将请求的报文和响应的报文都需要通过LB进行地址改写,因此网站访问量比较大的时候,LB负载均衡调度器有比较大的瓶颈,一般要求最多之能10-20台节点
3、只需要在LB上配置一个公网IP地址就可以了。
4、每台内部的realserver服务器的网关地址必须是调度器LB的内网地址。
5、NAT模式支持对IP地址和端口进行转换。即用户请求的端口和真实服务器的端口可以不一致。
d. FULL NAT模式优缺点与注意事项
FULLNATT模式,与NAT模式基本一样,不同之处在于对报文的处理方面:
1、NAT模式client请求VIP 时,仅替换了package的dstip。
2、FULL NAT 在client请求VIP 时,不仅替换了package 的dst ip,还替换了package的src ip;VIP返回给client时也替换了srcip.
3、、FULLNAT模式也不需要LBIP和realserverip在同一个网段。
4、FULLNAT因为要更新SoUrceIP所以性能正常比NAT模式下降10%。
e. IP TUNNEL模式
TUN :Virtual Server via IP Tunneling也就是通过IP隧道技术实现虚拟服务器。在VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个RealServer将直接响应用户的请求,不再经过前端调度器。此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以在独立的一个网络中。因此,在TUN方式中,调度器将只处理用户的报文请求,从而使集群系统的吞吐量大大提高。
它和NAT模式不同的是,它在LB和RS之间的传输不用改写IP地址。而是把客户请求包封装在一个IPtunnel里面,然后发送给RS节点服务器,节点服务器接收到之后解开IPtunnel后,进行响应处理。并且直接把包通过自己的外网地址发送给客户不用经过LB服务器。

f. IP TUNNEL模式的注意事项:
1、TUNNEL模式必须在所有的realserver 机器上面绑定VIP的IP地址
2、TUNNEL模式的vip-->realserver的包通信通过TUNNEL模式,不管是内网和外网都能通信,所以不需要
Ivs vip跟realserver 在同一个网段内
3、TUNNEL模式realserver会把packet直接发给client 不会给lvs了
4、TUNNEL模式走的隧道模式,所以运维起来比较难,所以一般不用。
3、LVS负载调度算法
LVs的调度算法决定了如何在集群节点之间分布工作负荷。当director调度器收到来自客户端访问VIP的上的集群服务的入站请求时,director调度器必须决定哪个集群节点应该处理请求。Director调度器用的调度方法基本分为两类:
固定调度算法:rr,wrr,dh,shA
动态调度算法:wlc,lc,lblc,lblcr

4、LVS调度算法的生产环境选型
1、一般的网络服务,如www,mail,mysql等常用的LVS调度算法为:
基本轮询调度rr
加权最小连接调度wlc
加权轮询调度wrr
2、基于局部性的最小连接Iblc和带复制的给予局部性最小连接Iblcr主要适用于webcache和DBcache
3、源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一。
实际适用中这些算法的适用范围很多,工作中最好参考内核中的连接调度算法的实现原理,然后根据具体的业务需求合理的选型。
5、LVS的安装与使用
IPVS的官方网站为http://www.linuxvirtualserver.org/software/ipvs.html,提供的软件包有源码方式的也有rpm方式的,这里介绍通过yum方式安装IPVS
因此,在服务器上直接执行如下操作进行安装:
[root@localhost ~]#yum -y install ipvsadm
[root @localhost ~]# ipvsadm -help
如果看到帮助提示,表明IPVS已经成功安装。
6、通过Keepalived搭建LVS高可用性集群系统
a. 实例环境介绍
LVS集群有DR、TUN、NAT三种配置模式,可以对WWW服务、FTP服务、MAIL服务等进行负载均衡。下面通过3个实例详细讲述如何搭建WWW服务的高可用LVS集群系统,以及基于DR模式的LVS集群配置。在进行实例介绍之前进行约定:操作系统采用Centos7.5,地址规划如下表所示。

HA 实现LVS的高可用,1 2 提供处理信息。必须访问vip才能进行负载均衡。

共享数据使用共享的存储阵列,一般是NFS
b. 实例环境的配置
Keepalived的配置非常简单,仅需要一个配置文件即可完成对HA cluster和LVS服务节点监控。Keepalived的安装已经在前面介绍过,在通过Keepalived搭建高可用的LVS集群实例中,主、备Director Server都需要安装Keepalived软件,安装成功后,默认的配置文件路径为**/etc/Keepalived/Keepalived.conf**。一个完整的keepalived配置文件由三个部分组成,分别是全局定义部分、vrrp实例定义部分以及虚拟服务器定义部分,下面详细介绍这个配置文件中每个选项的详细含义和用法。
! Configuration File for keepalived
#全局定义部分
global_defs {
notification_email {
dba.gao@gmail.com # 设置报警邮件地址,可以设置多个,
# 每行一个。注意,如果要开启邮件报警,# 需要开启本机的Sendmail服务
ixdba@163.com
}
notification_email_from Keepalived@localhost # 设置邮件的发送地址
smtp_server 192.168.200.1 # 设置smtp server地址
smtp_connect_timeout 30 # 设置连接smtp server的超时时间
router_id LVS_DEVEL # 表示运行Keepalived服务器的一个
# 标识。发邮件时显示在邮件主题中的信息
}
实现高可用的方式:
#vrrp实例定义部分
vrrp_instance VI_1 {
state MASTER # 指定Keepalived的角色,MASTER表示
# 此主机是主服务器,BACKUP表示
interface eth0 # 指定HA监测网络的接口virtual_router_id 51 # 虚拟路由标识,这个标识是一个数字,
# 同一个vrrp实例使用唯一的标识,
# 即同一个vrrp_instance下,MASTER和
# BACKUP必须是一致的
priority 100# 定义优先级,数字越大,优先级越高。
# 在一个vrrp_instance下,MASTER的
# 优先级必须大于BACKUP的优先级
advert_int 1 # 设定MASTER与BACKUP负载均衡器之
# 间同步检查的时间间隔,单位是秒
authentication { # 设定验证类型和密码
auth_type PASS # 设置验证类型,主要有PASS和AH两种
auth_pass 1111 # 设置验证密码,在一个vrrp_instance下,
# MASTER与BACKUP必须使用相同的密码
# 才能正常通信
}
virtual_ipaddress { # 设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个。
172.16.213.6
}
}
配置负载均衡部分
#虚拟服务器定义部分
virtual_server 172.16.213.6 80 { # 设置虚拟服务器, 需要指定虚拟IP地址和服务
delay_loop 6lb_algo rr
lb_kind DR # 设置LVS实现负载均衡的机制, 有NAT、TUN
persistence_timeout 50# 会话保持时间, 单位是秒。这个选项对动态网页是非常有用的, 为集群系统中的session共享提供了一个很好的解决方案。有了这个会话保持功能, 用户的请求会被一直分发到某个服务节点, 直到超过这个会话的保持时间。需要注意的是, 这个会话保持时间是最大无响应超时时间, 也就是说, 用户在操作动态页面时, 如果在50秒内没有执行任何操作, 那么接下来的操作会被分发到另外节点, 但是如果用户一直在操作动态页面, 则不受50秒的时间限制。
protocol TCP # 指定转发协议类型, 有TCP和UDP两种
real_server 172.16.213.235 80 { # 配置服务节点1, 需要指定real server的真实IP地址和端口, IP与端口之间用空格隔开
weight 3 # 配置服务节点的权值, 权值大小用数字表示, 数字越大, 权值越高, 设置权值的大小可以为不同性能的服务器分配不同的负载, 可以为性能高的服务器设置较高的权值, 而为性能较低的服务器设置相对较低的权值, 这样才能合理地利用和分配了系统资源
TCP_CHECK {
connect_timeout 3 # 表示3秒无响应超时
retry 3 # 表示重试次数
delay_before_retry 3 # 表示重试间隔
}
}
real_server 172.16.213.238 80 { # 配置服务节点2
weight 1
TCP_CHECK {
connect_timeout3
retry 3
delay_before_retry 3
}
}
}
配置备用节点
在配置Keepalived.conf时, 需要特别注意配置文件的语法格式, 因为Keepalived在启动时并不检测配置文件的正确性, 即使没有配置文件, Keepalived也照样能够启动, 所以一定要保证配置文件正确。在默认情况下, Keepalived在启动时会查找/etc/Keepalived/Keepalived.conf配置文件, 如果配置文件放在了其他路径下, 可以通过 "Keepalived -f" 参数指定配置文件的路径即可。Keepalived.conf配置完毕后, 将此文件复制到备用Director Server对应的路径下, 然后进行两个简单的修改即可。
将"state MASTER"更改为"state BACKUP"
将priority 100更改为一个较小的值, 这里改为"priority 80"
c. 配置Real server节点
在lvs的DR和Tun模式下, 用户的访问请求到达真实服务器后, 是直接返回给用户的, 而不再经过前端的Director Server, 因此, 就需要在每个Real server节点上增加虚拟的VIP地址, 这样数据才能直接返回给用户, 增加VIP地址的操作可以通过创建脚本的方式来实现,创建文件 /etc/init.d/lvrsr, 脚本内容如下:
返回数据直接给用户
#!/bin/bash
VIP=172.16.213.6
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
#end
此操作是在回环设备上绑定了一个虚拟IP地址, 并设定其子网掩码为255.255.255.255, 与Director Server上的虚拟IP保持互通, 然后禁止了本机的ARP请求。
7、验证高可用LVS负载均衡集群系统
a. 高可用负载均衡集群 DR
172.16.213.234(主)
172.16.213.239(备用)
172.16.213.235(真实服务器1)
172.16.213.238(真实服务器2)
-
首先启动真实服务器1和2 的httpd服务
-
配置keepalived.conf文件
! Configuration File for keepalived
全局定义部分
global_defs {
notification_email {
dba.gao@gmail.com # 报警邮件地址,可配置多个
ixdba@163.com
}
notification_email_from Keepalived@localhost # 邮件发件人
smtp_server 192.168.200.1 # SMTP 服务器地址
smtp_connect_timeout 30 # SMTP 连接超时时间
router_id LVS_DEVEL # 节点唯一标识(邮件主题显示)
}VRRP 实例定义
vrrp_instance VI_1 {
state MASTER # 节点角色:MASTER / BACKUP
interface eth0 # 绑定网卡(根据实际环境修改)
virtual_router_id 51 # 同一集群必须一致
priority 100 # 优先级,主节点 > 备节点
advert_int 1 # 心跳检查间隔(秒)# 认证配置 authentication { auth_type PASS # 认证类型 auth_pass 1111 # 集群密码,主备必须一致 } # 虚拟 IP virtual_ipaddress { 172.16.213.6 }}
虚拟服务器配置(LVS + 健康检查)
virtual_server 172.16.213.6 80 {
delay_loop 6 # 后端节点健康检查间隔
lb_algo rr # 负载均衡算法:rr=轮询
lb_kind DR # LVS 模式:DR/NAT/TUN
persistence_timeout 50 # 会话保持时间(秒)
protocol TCP # 转发协议# 真实后端服务器 1 real_server 172.16.213.235 80 { weight 3 # 节点权重 TCP_CHECK { connect_timeout 3 # 连接超时 retry 3 # 重试次数 delay_before_retry 3 # 重试间隔 } } # 真实后端服务器 2 real_server 172.16.213.238 80 { weight 1 TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 } }}
备用节点BACKUP和权重修改即可
- 启动服务 systemctl start keepalived
- 查看目前的连接状态 ipvsadm -L -n

- 吧vip信息绑定在服务器上返回数据

#!/bin/bash
# LVS-DR 模式 RealServer ARP 抑制脚本
VIP=172.16.213.6
# 绑定 VIP 到本地回环网卡
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
# ARP 抑制核心参数
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
# 生效内核参数
sysctl -p


b. 高可用负载均衡集群过程
在节点关闭服务,三次尝试重连,然后移除服务,发送邮件

ipvsadm -L -n 查看服务,一个节点

恢复服务之后,添加节点,发送邮件


开启会话保持,当重新开启服务,还是原来的服务
8、LVS使用需要注意的问题以及常用集群网络架构
a. LVS使用需要注意的问题
1、网络方面,推荐关闭selinux
2、推荐lvs+keepalived组合
3、dr模式需要realserver绑定vip地址
b. LVS经常使用的集群网络架构
1、内网集群,外网映射VIP

2、全外网LVS集群(DR)模式
