高性能集群软件keepalived

2022-09-07 11:55:20 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

高性能集群软件keepalived

背景

网络的飞速发展,给网络带宽和服务器性能带来了巨大的挑战,基于互联网的应用系统越来越多地瓶颈出现在服务器端,这就对服务器提出了更高的要求,来保证服务的持续性。

集群简介

定义:集群是一组协同工作的服务集合。在外界看来,集群就是一个独立的服务实体,但实际上,在集群的内部,有两个或两个以上的服务器实体在协调、配合完成一系列复杂的工作。

组成:集群一般由两个或两个以上的服务器组建而成。每个服务器称为一个集群节点。同时,还需要有串口线、集群软件、共享存储设备(例如磁盘阵列)等。

集群节点通信方式:一种是基于RS232线的心跳监控,另一种是用一块单独的网卡跑心跳

作用:集群主要用来提供比单一服务更稳定、更高效、更具扩展性的服务平台。当一个节点出现故障时,集群的另一个节点可以自动接管故障节点的资源,从而保证服务持久、不间断地运行。

特点:集群具有节点间服务状态监控功能,同时必须具有服务实体的扩展功能,可以灵活地增加和剔除某个服务实体。

集群的特点和功能

  • 高可用性:必须保证服务24小时不间断运行。集群最大的优点之一就是具有高可用性,在服务器出现故障时,集群可以自动将服务从故障节点切换到另一个备用节点
  • 可扩展性:当集群服务实体不能满足需求时,可以向集群中动态地加入一个或多个服务节点,增强集群的整体性能
  • 负载均衡:集群系统可以灵活、有效地分担系统负载,通过集群自身定义的负载分担策略,将客户端的访问分配到各个服务节点。常见策略:轮询、权重分配等
  • 错误恢复:当一个任务在一个节点上还没有完成时,由于某种原因,执行失败,此时另一个服务节点应该能接着完成此任务。通过错误重定向的方式,保证每个执行任务都能有效地完成。
  • 心跳监测:心跳监测技术可以实现负载均衡、提供高可用服务和执行错误恢复,心跳线的数量应该为集群节点数减1。如果通过网卡来做心跳,每个节点需要两块网卡,其中一块通过私网直接连接到对方机器相应的网卡,用来监测对方心跳。心跳监控的效率直接影响故障切换时间的长短。
  • 漂移IP地址(一般称为VIP):在集群系统中,为了保证服务的不间断性,对外提供服务的IP地址一定是这个漂移的IP地址,这样才能在双机热备架构中,实现主节点宕机,备节点继续提供服务的效果。

集群的分类

  • 高可用集群

High Availability Cluster,HA集群,高可用指的是最大限度地可以使用。用于保障用户的应用程序持久、不间断提供服务。

常见的HA集群:双机热备、双机互备、多机互备等,一般由两个或两个以上的节点组成。

高可用集群软件:HeartBeat HA、Red Hat提供的RHCS、商业软件ROSE、Keepalived等

  • 负载均衡集群

Load Balance Cluster ,LB集群,分为前端负载调度和后端节点服务,负载调度负责把客户端的请求按照不同的策略分配给后端服务节点,后端服务节点是真正提供应用程序服务的

与HA不同的是,在LB集群中,所有后端节点都处于活动状态(Active),它们都对外提供服务,分摊系统工作负载。适用于业务繁忙、大负荷访问的应用系统。

缺点:当一个节点出现故障时,前端调度系统并不知道此节点已经不能提供服务,仍然会把客户端的请求调度到故障节点上来,这样就会访问失败。解决办法:负载调度系统一般都引入了节点监控系统,用于监控后端服务节点,当某个节点出现故障后,节点监控系统会自动将故障节点从集群中剔除;当此节点恢复正常后,节点监控系统又会自动将其加入集群中。

负载均衡软件:软件包括开源LVS集群、Oracle的RAC集群等,硬件为F5 Networks等

  • 分布式计算集群

Distributed Computing Cluster,DC集群。提供单个计算机所不能提供的强大的计算分析能力,包括数值计算和数据处理,并且倾向于追踪综合性能。

开源分布式计算平台:Hadoop、Spark,用于开发和处理海量数据。在这个平台上,分布式任务是并行运行的,因此处理速度非常快。

Hadoop工作原理:Hadoop可将大数据直接存储到HDFS这个分布式文件系统上,Hadoop的MapReduce功能实现了将单个任务打碎,并将碎片任务发送到多个节点上,之后再以单个数据集的形式加载到数据仓库里。

Keepalived简介

Keepalived是Linux下一个轻量级的高可用解决方案。主要通过虚拟路由冗余来实现高可用功能。根据第3~5层的交换机制检测每个服务节点的状态,如果某个服务节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现故障的服务节点从集群系统中剔除;而在故障节点恢复正常后,Keepalived又可以自动将此服务节点重新加入到服务器集群中,这些工作全部自动完成。后来,Keepalived又加入了VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议),目的是为了解决静态路由出现的单点故障问题,通过VRPP可以实现网络不间断地、稳定地运行。

VRRP与工作原理

VRRP是一种主备协议,通过VRRP可以在网络发生故障时透明地进行设备切换而不影响主机间的数据通信,这涉及到两个概念:物理路由器和虚拟路由器。

VRRP可以将两台或多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务。在虚拟路由器内部,多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务。每个虚拟路由器都有一个唯一标识,称为VRID,一个VRID与一组IP地址构成了一个虚拟路由器。

对外提供服务的物理服务器称为MASTER,一般情况下通过选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如ARP请求、ICMP、数据转发等。其他物理服务器仅仅接收MASTER的VRRP状态通告信息,这些路由器统称为BACKUP。当主路由器失效时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续对外提供服务。

Keepalived工作原理

Keepalived工作在TCP/IP参考模型的第三层、第四层和第五层,也就是网络层、传输层和应用层。根据各层所能实现的功能,Keepalived运行机制如下:

  • 网络层的4个重要协议:互联网协议(IP)、互联网控制报文协议(ICMP)、地址转换协议(ARP)以及反向地址转换协议(RARP)。Keepalived主要通过ICMP向服务器集群中的每个节点发送一个ICMP数据包,如果某个节点没有返回响应数据包,则认为此节点发生了故障,Keepalived将报告此节点失效,并从服务器集群中剔除故障节点。
  • 传输层的2个重要协议:传输控制协议(TCP)、用户数据协议(UDP)。TCP可以提供可靠的数据传输服务,要获得TCP服务,需要在发送机的一个端口上和接收机的一个端口上建立连接,Keepalived在传输层就是利用TCP的端口连接和扫描技术来判断集群节点是否正常,如果发现TCP端口没有响应数据返回,就认为这些端口发生异常,然后强制将此端口对应的节点从服务器集群组中移除。
  • 应用层协议:FTP、TELNET、SMTP、DNS等各种不同类型的高层协议,用户可以自定义Keepalived工作方式,例如通过编写程序来运行Keepalived,而Keepalived将根据用户的设定监测各种程序或服务是否运行正常,如果Keepalived的监测结果与用户设定不一致时,Keepalived将把对应的服务从服务器中移除。

Keepalived体系结构

Keepalived是一个高度模块化的软件,结构简单,但是扩展性很强。Keepalived的体系结构从整体上分为两层,分别是用户空间(User Space)层和内核空间(Kernel Space)层。

内核空间层,包括IPVS和NETLINK两个模块,IPVS是Keepalived引入的第三方模块,通过IPVS可以实现基于IP的负载均衡集群。IPVS默认包含在LVS集群软件中。在keepalived中,IPVS模块是可配置的,如果需要负载均衡功能,可以在编译Keepalived时打开负载均衡功能,反之,也可以通过配置编译参数关闭。NETLINK模块主要用于实现高级路由框架和一些相关的网络功能,完成用户空间层Netlink Reflector模块发来的各种网络请求。

用户空间层,包括Core components(核心组件)、Control Plane(控制面板:对配置文件进行编译和解析)、Memory Management(Mngt)(内存管理机制:访问内存的方法)、Scheduler I/O Multiplexer(IO复用调度:处理内部的任务请求)

核心组件中各个模块的功能如下:

  • WatchDog:用来监控Checkers和VRRP进程。
  • Checkers:对服务器运行状态监测和故障隔离
  • VRRP Stack:实现HA集群中的故障切换功能
  • IPVS wrapper:将设置好的IPVS规则发送到内核空间并提交给IPVS模块
  • Netlink Reflector:实现HA集群中故障转移时虚拟IP(VIP)的设置和切换

Keepalived的安装

官方下载地址:https://www.keepalived.org/download.html

代码语言:javascript复制
# 安装依赖
# yum install -y libnl libnl-devel 用于支持IPv6
# yum install -y openssl-devel
​
wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
tar zxf keepalived-2.2.4.tar.gz 
./configure --sysconf=/etc
make
make install

默认配置文件位置:/usr/local/etc/keepalived/keepalived.conf

默认可执行文件位置:/usr/local/sbin/keepalived

Keepalived的配置

Keepalived配置分为三类,分别是:全局配置(Global Configuration)、VRRPD配置和LVS配置。Keepalived的配置文件都是以块(block)的形式组织的,每个块的内容都包含在{}中,以“#”和“!”开头的行都是注释。

一、全局配置

代码语言:javascript复制
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_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
  • 以global_defs为标识
  • notification_email:设置报警邮件地址,每行一个。如果开启邮件报警,需要开启本机的Sendmail服务
  • notification_email_from:邮件发送地址
  • smtp_server:邮件的SMTP服务器
  • smtp_connect_timeout:连接SMTP服务器的超时时间
  • router_id:运行Keepalived服务器的一个标识,是发送邮件时显示在邮件主题中的信息

二、VRRPD配置

VRRP同步组配置:实现把多个实例放在一个组中管理。

代码语言:javascript复制
vrrp_sync_group G1 {
 group {
   VI_1
   VI_2
   VI_5
 }
 notify_backup "/usr/local/bin/vrrp.back arg1 arg2"
 notify_master "/usr/local/bin/vrrp.mast arg1 arg2"
 notify_fault "/usr/local/bin/vrrp.fault arg1 arg2"
}
vrrp_sync_group G2 {
 group {
   VI_3
   VI_4
 }
}
  • vrrp_sync_group是组标识,后面跟组名
  • notify_master:进入Master状态时要执行的脚本,可以是一个状态报警脚本,也可以是一个服务管理脚本,允许脚本传入参数
  • notify_backup:进入Backup状态时要执行的脚本,可以是一个状态报警脚本,也可以是一个服务管理脚本,允许脚本传入参数
  • notify_fault:进入Fault状态时要执行的脚本,可以是一个状态报警脚本,也可以是一个服务管理脚本,允许脚本传入参数
  • notify_stop:当Keepalived程序终止时,需要执行的脚本

VRRP实例配置:配置节点角色(主或从)、实例绑定的网络接口、节点间验证机制、集群服务IP等

代码语言:javascript复制
vrrp_instance VI_1 {
   state MASTER
   interface eth0
   virtual_router_id 51
   priority 100
   advert_int 1
   mcast_src_ip <IPADDR>
   garp_master_delay 10
    
   track_interface {
     eth0
     eth1
   }
    
   authentication {
       auth_type PASS
       auth_pass 1111
   }
   virtual_ipaddress {
   # <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
       192.168.200.16
       192.168.200.17 dev eth1
       192.168.200.18 dev eth2
   }
   virtual_routers {
   # src <IPADDR> [to] <IPADDR>/<MASK> via | gw <IPADDR> dev <STRING> scope <SCOPE>
       src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
       192.168.110.0/24 via 192.168.200.254 dev eth1
       192.168.111.0/24 dev eth2
       192.168.112.0/24 via 192.168.100.254
       192.168.113.0/24 via 192.168.100.252 or 192.168.100.253
   }
   nopreempt
   preemtp_delay 300
}
  • vrrp_instance是VRRP实例开始的标识,后面是实例名
  • state:MASTER 表示主服务器,BACKUP表示备用服务器
  • interface:指定HA监测网络的接口
  • virtual_router_id:虚拟路由标识,同一个vrpp实例使用唯一的标识,在同一个vrrp_instance下,MASTER和BACKUP必须是一致的
  • priority:定义节点优先级,数字越大优先级越高,在同一个vrrp_instance下,MASTER优先级必须大于BACKUP的优先级
  • advert_int:设定MASTER和BACKUP主机之间同步检查的时间间隔,单位是秒
  • mcast_src_ip:设置发送多播包的地址,不设置的话,默认使用绑定的网卡所对应的IP地址
  • garp_master_delay:在切换到MASTER状态后,延时进行Gratuitous arp请求的时间
  • track_interface:用于设置一些额外的网络监控接口,其中任何一个网络接口出现故障,Keepalived都会进入FAULT状态
  • authentication:用于设定节点间通信验证类型和密码,验证类型主要有:PASS 和 AH 两种,在一个vrrp_instance 下,MASTER和BACKUP必须使用相同的密码才能正常通信
  • virtual_ipaddress:设定虚拟IP地址(VIP),可以设置多个,每行一个。Keepalived通过“ip address add”命令的形式将VIP添加到系统中,通过“ip add”可查看系统中的VIP地址
  • virtual_routers:同virtual_ipaddress,使用“ip route”可以查看路由信息是否添加成功。
  • nopreempt:设置高可用集群中不抢占功能,为了避免频繁切换,一般需要做此设置。在使用此功能时,只能在state状态为“BACKUP”的节点上设置,而且这个节点的优先级必须高于其他节点
  • preemtp_delay:设置抢占的延时时间,单位是秒。有时系统启动或重启之后,网络需要经过一段时间才能正常工作,在这种情况下没必要进行主备切换

三、LVS配置

代码语言:javascript复制
virtual_server 10.10.10.3 1358 {
   delay_loop 3
   lb_algo rr
   lb_kind NAT
   persistence_timeout 50
   protocol TCP
   ha_suspend
   virtualhost <STRING>
   sorry_server 192.168.200.200 1358
​
   real_server 192.168.200.4 1358 {
       weight 1
       HTTP_GET {
           url {
             path /testurl/test.jsp
             digest 640205b7b0fc66c1ea91c463fac6334d
           }
           url {
             path /testurl2/test.jsp
             digest 640205b7b0fc66c1ea91c463fac6334d
           }
           url {
             path /testurl3/test.jsp
             digest 640205b7b0fc66c1ea91c463fac6334d
           }
           connect_timeout 3
           retry 3
           delay_before_retry 3
       }
   }
​
   real_server 192.168.200.5 1358 {
       weight 1
       HTTP_GET {
           url {
             path /testurl/test.jsp
             digest 640205b7b0fc66c1ea91c463fac6334d
           }
           url {
             path /testurl2/test.jsp
             digest 640205b7b0fc66c1ea91c463fac6334d
           }
           url {
             path /testurl3/test.jsp
             digest 640205b7b0fc66c1ea91c463fac6334d
           }
           connect_timeout 3
           retry 3
           delay_before_retry 3
       }
   }
}
  • virtual_server是LVS的配置标识,后面跟虚拟IP地址和服务端口,IP与端口之间用空格隔开
  • delay_loop:设置健康检查的时间间隔,单位是秒
  • lb_algo:设置调度算法,可选配置项:rr、wrr、lc、wlc、lblc、sh、dh等,常用为:rr和wlc
  • lb_kind:设置LVS实现负载均衡的机制,可选配置项:NAT、TUN、DR
  • persistence_timeout:会话保持时间,单位是秒,此参数标识最大无响应超时时间,如果用户在操作动态页面时,在50秒内没有执行任何操作,后面的操作会被分发到另外的节点,但是用户一直在操作动态页面不受50秒的时间限制
  • protocol:转发协议类型,有TCP和UDP两种可选
  • ha_suspend:节点从MASTER到BACKUP切换时,暂不启用real server节点的健康检查
  • virtualhost:通过HTTP_GET/SSL_GET做健康检查时,指定的Web服务器的虚拟主机地址
  • sorry_server:相当于备节点,在所有real_server失效后,这个备节点才启用
代码语言:javascript复制
real_server 192.168.200.5 80 {
 weight 3
 inhibit_on_failure
 notify_up <STRING> | <QUOTED-STRING>
 notify_down <STRING> | <QUOTED-STRING>
}
  • real_server:是真实服务器段的开始标识,用来指定real server节点,用IP地址端口配置,中间用空格隔开
  • weight:设置real server权重值大小,数字越大,权重值越高
  • inhibit_on_failure:在检测到real server节点失效后,把weight值设置为0,而不是从IPVS中删除
  • notify_up:后面跟一个脚本,在检测到real server节点服务处于UP状态后执行的脚本
  • notify_down:后面跟一个脚本,在检测到real server节点服务处于DOWN状态后执行的脚本

Keepalived的健康检查

健康检测段允许多种检查方式,常见的有HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK、MISC_CHECK。

TCP_CHECK检测配置

代码语言:javascript复制
TCP_CHECK {
   connect_port 80
   connect_timeout 3
   nb_get_retry 3
   delay_before_retry 3
}
  • connect_port:健康检查端口,如不指定,默认是real_server指定的端口
  • connect_timeout:表示无响应超时时间,单位是秒
  • nb_get_retry:表示重试次数
  • delay_before_retry:表示重试间隔时间,单位是秒

HTTP_GET | SSL_GET检测配置

代码语言:javascript复制
HTTP_GET | SSL_GET {
 url {
   path /index.html
   digest <STRING>
   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 server-address -p port -u url
  • status_code:指定HTTP检查返回正常状态码的类型,一般是200
  • bindto:表示通过此地址来发送请求对服务器进行健康检查

MISC_CHECK检测配置

代码语言:javascript复制
MISC_CHECK {
 misc_path /usr/local/bin/script.sh
 misc_timeout 5
 !misc_dynamic
}

MISC健康检查可以通过执行一个外部程序来判断real server节点的服务状态,使用非常灵活。

  • misc_path:指定外部程序或者脚本
  • misc_timeout:设定执行脚本的超时时间
  • misc_dynamic:是否启用动态调整real server节点权重

注意事项:Keepalived在启动时并不检测配置文件的正确性,即使没有配置文件,Keepalived也照样能够启动,所以一定要保障配置文件正确。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/155615.html原文链接:https://javaforall.cn

0 人点赞