专栏
天翼云开发者社区

Keepalived组件简析及其在注册配置中心Nacos集群中的实践

2023-04-28 15:09:41 27阅读

一,组件引入

1.1 概述

       Keepalived是一种流行的开源软件包,为Linux系统提供高可用性。它旨在通过提供自动故障转移和负载平衡功能来确保关键网络服务的连续可用性。在本文中,我们将详细讨论Keepalived及其特点,包括其架构、组件和配置,通过具体项目使用场景的介绍,进一步说明其功能特性;

1.2 原理

       Keepalived使用虚拟路由冗余协议(VRRP)来提供故障转移和负载平衡功能。VRRP是一种协议,允许多个路由器共同工作,以呈现单个虚拟路由器的外观。Keepalived在群集中的每个节点上运行,并监视其配置的服务的可用性。如果某个节点无法提供服务,则Keepalived会自动将该服务转移到另一个节点。

1.3 架构

主要功能组件:

  • 控制平面:
    Keepalived 配置通过文件 keepalived.conf 完成。解析器解析配置文件后,使用关键字树层次结构将每个配置关键字与特定处理程序映射,在解析期间,配置文件被加载到内存中。 
  • 内存管理:
    提供对一些通用内存管理功能的访问,如分配、重新分配、释放等。
  • WatchDog:
    提供子进程监控(VRRP 和健康检查),每个子进程都建立watch dog unix domain socket连接。父进程向这个子 unix domain socket发送“hello”消息。Hello 消息在父端使用 I/O 多路复用器发送,并在子端使用 I/O 多路复用器接受/处理。如果父进程检测到socket broken,它会使用 sysV 信号测试子进程是否还活着并重新启动它。
  • VRRP Stack:
    核心的 Keepalived 功能。VRRP(虚拟路由器冗余协议) 专注于 director takeover,它为路由器备份提供底层设计。VRRP 代码可以在没有 LVS 支持的情况下使用,它被设计为独立使用。它在父进程监控的独立进程中运行。
  • Checkers:
    Keepalived 的主要功能之一。Checker负责实时服务器健康检查,Checker测试 real server 是否存在;

1.4 核心网络协议

1.4.1 VRRP协议:

      虚拟路由冗余协议,避免路由器出现单点故障的一种容错协议,多个运行着VRRP协议的路由器抽象成一个虚拟路由器(从外边来看,就像只有一个真实的路由器在工作),这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,组成虚拟路由器的一组路由器会有一个会成为Master路由器,其余的会成为Backup路由器。正常情况下,会由Master完成该虚拟路由器的工作。Master一旦出现故障,从Backup中选出一个成为Master继续工作,从而避免路由器单点问题,VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信;

      VRRP基于vip(虚拟IP),也叫IP别名或者辅助IP,是一个不与特定计算机或网络接口卡(NIC)相连的IP地址;Linux系统给网卡配置VIP的方法常见的有两种,即别名IP(alias ip)以及辅助IP(secondary ip address)

  1. alias IP 是由 Linux 系统的 ifconfig 命令来创建和维护的,别名IP就是在网卡设备上绑定的第二个及以上的IP,它的配置方法如下
    ifconfig eth0:1 192.168.40.20 netmask 255.255.255.0 up 
  2. 辅助IP(secondary ip address)则是由Linux系统的ip命令创建和维护的,ip addr add 创建的辅助IP,不能通过ifconfig查看,但是通过ifconfig创建的别名IP却可以在ip addr show 命令查看
    ip addr add 192.168.40.20/24 dev eth0

    创建VRRP实例时,会自动注册vip并绑定到Master实例上

1.4.2 VRRP工作模式

        VRRP有三种工作状态,分别是:Initialize,Master,Backup;当VRRP设备处于Master状态时,它将会承担虚拟路由设备的所有转发工作,并定期向整个虚拟内发送VRRP通告报文。

        当Master状态节点故障时,通过选举机制选举新的Master;每个路由器都拥有一个优先级,抢占模式下,一旦有优先级高的路由器加入,立即成为Master;非抢占模式下,只要Master存活,优先级高的路由器只能等待;

如图所示为wireshark抓取的VRRP协议报文,集群节点通过广播或者单播VRRP协议报文到其他集群节点进行选举或者信息同步,其中Priority报文字段描述当前节点的优先级

上图展示了客户端通过192.168.1.43这个vip来访问集群,keepalived通过vrrp来实现负载均衡功能,每次vip只会注册到一台后端服务器上,如果该节点宕机,keepalived会重新注册vip到另一个可用节点上。

 

1.5 keepalived故障检测原理

     了解了VRRP协议的功能后,我们可以更进一步熟悉Keepalived的工作原理。它工作在TCP/IP参考模型的第三、四和第五层,也就是网络层、传输层和应用层。

  • 网络层:通过ICMP协议向集群每个节点发送一个ICMP数据包(类似于ping功能),如果某个节点没有返回响应数据包,那么认定此节点发生了故障,Keepalived将报告此节点失效,并从集群中剔除故障节点;
  • 传输层:通过TCP协议的端口连接和扫描技术来判断集群节点是否正常,keepalived一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口所对应的节点发生故障,从集群中剔除故障节点;
  • 应用层:用户可以通过编写程序脚本来运行keepalived,keepalived根据脚本来检测各种程序或者服务是否正常,如果检测到有故障,则把对应的服务从服务器中删除;

二,项目实践

2.1 组件安装

  • linux系统可以使用包管理器来直接安装keepalived,比如centos可以使用yum -y install keepalived;
  • 另一种方式就是使用源码编译二进制安装包,这种方式更适合内网环境,本文所引述的注册配置中心项目即是采用这种方式,同时考虑系统差异和基础系统镜像中可能存在的类库缺失,将依赖包都打进安装包里面;

2.2 配置

       一个功能比较完整的keepalived配置文件,其配置文件keepalived.conf可以包含三个文本块:全局定义块、VRRP实例定义块及虚拟服务器定义块。全局定义块和虚拟服务器定义块是必须的,虚拟服务器定义块主要服务于LVS相关功能,本文未使用到,略去不谈。

全局定义块示例

global_defs {
    notification_email
    notification_email_from用于设置邮件的发送地址,即报警邮件发送者
    smtp_server用于设置邮件的SMTP Server地址
    smtp_connect_timeout   smtp连接超时时间
    router_id  全局路由id
    vrrp_skip_check_adv_addr:设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。
    vrrp_strict:严格遵守VRRP协议。下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址。会让防火墙对vip产生drop
    vrrp_iptables  #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置
    vrrp_garp_interval 0    #gratuitous ARP messages 报文发送延迟,0表示不延迟
    vrrp_gna_interval 0   #unsolicited NA messages (不请自来)消息发送延迟
}

VRRP实例定义块示例

vrrp_instance {
    state MASTER         #指定实例初始状态,实际的MASTER和BACKUP是选举决定的。
    interface eth0       #指定实例绑定的网卡
    virtual_router_id 51 #设置VRID标记,多个集群不能重复(0..255)
    priority 100         #设置优先级,优先级高的会被竞选为Master,Master要高于BACKUP至少50
    advert_int 1         #检查的时间间隔,默认1s
    nopreempt            #设置为不抢占,说明:这个配置只能在BACKUP主机上面设置
    preempt_delay        #抢占延迟,默认5分钟
    debug                #debug级别
    authentication {     #设置认证
        auth_type PASS    #认证方式,支持PASS和AH,官方建议使用PASS
        auth_pass 1111    #认证的密码
    }
    virtual_ipaddress {     #设置VIP,可多个,用于切换时的地址绑定
        192.168.1.43/24 dev eth0 label eth0:1
    }
}

2.3 定制化配置

由于项目部署环境中上层路由器不支持广播,因此选择单播模式,集群内节点地址必须明确,进行点对点协议发送

	unicast_src_ip 192.168.1.44:指定发送单播数据包的源IP地址。默认是绑定VRRP实例的接口的主IP地址。
	unicast_peer {   采用单播的方式发送VRRP通告,指定单播邻居的IP地址
   		192.168.1.45
                 192.168.1.46
	}

同时为了有效监测后端Nacos服务的可用性,也添加了应用层探活脚本

#!/bin/bash
result=`echo -e "\n" | telnet 127.0.0.1 47588 2>/dev/null | grep Connected | wc -l`
if [ $result -eq 1 ]; then
      exit 0
else
      exit 1
fi

并在VRRP实例配置中添加引用

    track_script {
        nacos_check
    }

总结:

因为Nacos集群本身具有选举机制,follower节点会转发请求到主节点进行处理,所以客户端的请求可以打到任意一个节点都能有效处理。为了防止客户端指定ip访问到异常节点,集群需要绑定vip,解析到集群内任意一个节点即可,客户端通过访问vip,进而做到有效的故障转移。而通过在集群中每一个节点上部署一个keepalived组件,并应用前述配置,可以很好地实现这一目标。

  • 0
  • 0
  • 0
0 评论
0/1000
评论(0) 发表评论
廖****锋

廖****锋

10 篇文章 0 粉丝
关注

Keepalived组件简析及其在注册配置中心Nacos集群中的实践

2023-04-28 15:09:41 27阅读

一,组件引入

1.1 概述

       Keepalived是一种流行的开源软件包,为Linux系统提供高可用性。它旨在通过提供自动故障转移和负载平衡功能来确保关键网络服务的连续可用性。在本文中,我们将详细讨论Keepalived及其特点,包括其架构、组件和配置,通过具体项目使用场景的介绍,进一步说明其功能特性;

1.2 原理

       Keepalived使用虚拟路由冗余协议(VRRP)来提供故障转移和负载平衡功能。VRRP是一种协议,允许多个路由器共同工作,以呈现单个虚拟路由器的外观。Keepalived在群集中的每个节点上运行,并监视其配置的服务的可用性。如果某个节点无法提供服务,则Keepalived会自动将该服务转移到另一个节点。

1.3 架构

主要功能组件:

  • 控制平面:
    Keepalived 配置通过文件 keepalived.conf 完成。解析器解析配置文件后,使用关键字树层次结构将每个配置关键字与特定处理程序映射,在解析期间,配置文件被加载到内存中。 
  • 内存管理:
    提供对一些通用内存管理功能的访问,如分配、重新分配、释放等。
  • WatchDog:
    提供子进程监控(VRRP 和健康检查),每个子进程都建立watch dog unix domain socket连接。父进程向这个子 unix domain socket发送“hello”消息。Hello 消息在父端使用 I/O 多路复用器发送,并在子端使用 I/O 多路复用器接受/处理。如果父进程检测到socket broken,它会使用 sysV 信号测试子进程是否还活着并重新启动它。
  • VRRP Stack:
    核心的 Keepalived 功能。VRRP(虚拟路由器冗余协议) 专注于 director takeover,它为路由器备份提供底层设计。VRRP 代码可以在没有 LVS 支持的情况下使用,它被设计为独立使用。它在父进程监控的独立进程中运行。
  • Checkers:
    Keepalived 的主要功能之一。Checker负责实时服务器健康检查,Checker测试 real server 是否存在;

1.4 核心网络协议

1.4.1 VRRP协议:

      虚拟路由冗余协议,避免路由器出现单点故障的一种容错协议,多个运行着VRRP协议的路由器抽象成一个虚拟路由器(从外边来看,就像只有一个真实的路由器在工作),这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,组成虚拟路由器的一组路由器会有一个会成为Master路由器,其余的会成为Backup路由器。正常情况下,会由Master完成该虚拟路由器的工作。Master一旦出现故障,从Backup中选出一个成为Master继续工作,从而避免路由器单点问题,VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信;

      VRRP基于vip(虚拟IP),也叫IP别名或者辅助IP,是一个不与特定计算机或网络接口卡(NIC)相连的IP地址;Linux系统给网卡配置VIP的方法常见的有两种,即别名IP(alias ip)以及辅助IP(secondary ip address)

  1. alias IP 是由 Linux 系统的 ifconfig 命令来创建和维护的,别名IP就是在网卡设备上绑定的第二个及以上的IP,它的配置方法如下
    ifconfig eth0:1 192.168.40.20 netmask 255.255.255.0 up 
  2. 辅助IP(secondary ip address)则是由Linux系统的ip命令创建和维护的,ip addr add 创建的辅助IP,不能通过ifconfig查看,但是通过ifconfig创建的别名IP却可以在ip addr show 命令查看
    ip addr add 192.168.40.20/24 dev eth0

    创建VRRP实例时,会自动注册vip并绑定到Master实例上

1.4.2 VRRP工作模式

        VRRP有三种工作状态,分别是:Initialize,Master,Backup;当VRRP设备处于Master状态时,它将会承担虚拟路由设备的所有转发工作,并定期向整个虚拟内发送VRRP通告报文。

        当Master状态节点故障时,通过选举机制选举新的Master;每个路由器都拥有一个优先级,抢占模式下,一旦有优先级高的路由器加入,立即成为Master;非抢占模式下,只要Master存活,优先级高的路由器只能等待;

如图所示为wireshark抓取的VRRP协议报文,集群节点通过广播或者单播VRRP协议报文到其他集群节点进行选举或者信息同步,其中Priority报文字段描述当前节点的优先级

上图展示了客户端通过192.168.1.43这个vip来访问集群,keepalived通过vrrp来实现负载均衡功能,每次vip只会注册到一台后端服务器上,如果该节点宕机,keepalived会重新注册vip到另一个可用节点上。

 

1.5 keepalived故障检测原理

     了解了VRRP协议的功能后,我们可以更进一步熟悉Keepalived的工作原理。它工作在TCP/IP参考模型的第三、四和第五层,也就是网络层、传输层和应用层。

  • 网络层:通过ICMP协议向集群每个节点发送一个ICMP数据包(类似于ping功能),如果某个节点没有返回响应数据包,那么认定此节点发生了故障,Keepalived将报告此节点失效,并从集群中剔除故障节点;
  • 传输层:通过TCP协议的端口连接和扫描技术来判断集群节点是否正常,keepalived一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口所对应的节点发生故障,从集群中剔除故障节点;
  • 应用层:用户可以通过编写程序脚本来运行keepalived,keepalived根据脚本来检测各种程序或者服务是否正常,如果检测到有故障,则把对应的服务从服务器中删除;

二,项目实践

2.1 组件安装

  • linux系统可以使用包管理器来直接安装keepalived,比如centos可以使用yum -y install keepalived;
  • 另一种方式就是使用源码编译二进制安装包,这种方式更适合内网环境,本文所引述的注册配置中心项目即是采用这种方式,同时考虑系统差异和基础系统镜像中可能存在的类库缺失,将依赖包都打进安装包里面;

2.2 配置

       一个功能比较完整的keepalived配置文件,其配置文件keepalived.conf可以包含三个文本块:全局定义块、VRRP实例定义块及虚拟服务器定义块。全局定义块和虚拟服务器定义块是必须的,虚拟服务器定义块主要服务于LVS相关功能,本文未使用到,略去不谈。

全局定义块示例

global_defs {
    notification_email
    notification_email_from用于设置邮件的发送地址,即报警邮件发送者
    smtp_server用于设置邮件的SMTP Server地址
    smtp_connect_timeout   smtp连接超时时间
    router_id  全局路由id
    vrrp_skip_check_adv_addr:设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。
    vrrp_strict:严格遵守VRRP协议。下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址。会让防火墙对vip产生drop
    vrrp_iptables  #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置vrrp_strict项,则无需启用此项配置
    vrrp_garp_interval 0    #gratuitous ARP messages 报文发送延迟,0表示不延迟
    vrrp_gna_interval 0   #unsolicited NA messages (不请自来)消息发送延迟
}

VRRP实例定义块示例

vrrp_instance {
    state MASTER         #指定实例初始状态,实际的MASTER和BACKUP是选举决定的。
    interface eth0       #指定实例绑定的网卡
    virtual_router_id 51 #设置VRID标记,多个集群不能重复(0..255)
    priority 100         #设置优先级,优先级高的会被竞选为Master,Master要高于BACKUP至少50
    advert_int 1         #检查的时间间隔,默认1s
    nopreempt            #设置为不抢占,说明:这个配置只能在BACKUP主机上面设置
    preempt_delay        #抢占延迟,默认5分钟
    debug                #debug级别
    authentication {     #设置认证
        auth_type PASS    #认证方式,支持PASS和AH,官方建议使用PASS
        auth_pass 1111    #认证的密码
    }
    virtual_ipaddress {     #设置VIP,可多个,用于切换时的地址绑定
        192.168.1.43/24 dev eth0 label eth0:1
    }
}

2.3 定制化配置

由于项目部署环境中上层路由器不支持广播,因此选择单播模式,集群内节点地址必须明确,进行点对点协议发送

	unicast_src_ip 192.168.1.44:指定发送单播数据包的源IP地址。默认是绑定VRRP实例的接口的主IP地址。
	unicast_peer {   采用单播的方式发送VRRP通告,指定单播邻居的IP地址
   		192.168.1.45
                 192.168.1.46
	}

同时为了有效监测后端Nacos服务的可用性,也添加了应用层探活脚本

#!/bin/bash
result=`echo -e "\n" | telnet 127.0.0.1 47588 2>/dev/null | grep Connected | wc -l`
if [ $result -eq 1 ]; then
      exit 0
else
      exit 1
fi

并在VRRP实例配置中添加引用

    track_script {
        nacos_check
    }

总结:

因为Nacos集群本身具有选举机制,follower节点会转发请求到主节点进行处理,所以客户端的请求可以打到任意一个节点都能有效处理。为了防止客户端指定ip访问到异常节点,集群需要绑定vip,解析到集群内任意一个节点即可,客户端通过访问vip,进而做到有效的故障转移。而通过在集群中每一个节点上部署一个keepalived组件,并应用前述配置,可以很好地实现这一目标。

文章来自专栏

微服务&中间件

10 篇文章 2 订阅
0 评论
0/1000
评论(0) 发表评论
  • 0
    点赞
  • 0
    收藏
  • 0
    评论