Keepalived搭建高可用LVS负载均衡器

Keepalived介绍

前面我们介绍了LVS的原理和DR模式的搭建,搭建完成后我们发现整个架构存在两个重要的隐患:

1、LVS解决了Real Server的过载的问题,但是LVS本身存在单点问题,如果LVS挂了,那么整个服务将不可用。

2、目前搭建的LVS无法识别后端Real Server是否存活,如果某个Real Server服务挂掉,那么任何请求到这个Real Server的请求将会失败。

本章就通过引入Keepalived来解决这两个问题。

学习任何组件首先我们应该有个习惯,就是首先要搞清楚学习目标组件两个问题:

1、what?(是什么)

2、why?(解决什么)

 

通常这两个问题都可以在组件的官方网站找到答案,所以下面我们进入keepalived官方网站:

https://www.keepalived.org/

从官网提取几句关键描述:

1、Keepalived是用C语言编写的路由软件。(what)

2、Keepalived是开源免费的软件。(what)

3、Keepalived基于Linux虚拟服务器LVS实现负载。(why)

4、Keepalived基于ARRP协议实现高可用性。(why)

5、Keepalived通过一组检查器检查负载后端Real Server存活状态。(why)

 

Keepalived原理

 

Keepalived启动时,首先会创建一个master主进程,然后由master父进程forked出来的两个孩子进程,这两个子进程分别是VRRP协议进程和Real Server检查器进程。每个子进程都有自己的I / O多路复用器。master父进程通过定期发送hello数据包来检测子进程是否存活,如果父进程无法将hello数据包发送给子进程,则重新启动子进程。

Keepalived使用四个Linux内核组件:

1、LVS框架:使用getsockopt和setsockopt调用来获取和设置LVS套接字上的参数。

2、Netfilter框架:支持NAT和Masquerading的IPVS代码。

3、Netlink接口:设置和删除网络接口上的VRRP虚拟IP。

4、Multicast:将VRRP通告发送到保留的VRRP MULTICAST组(224.0.0.18)。

 

下面是Keepalived架构图:

下面分别介绍每个模块的作用。

Control Plane

该模块主要负责解析并检查配置文件keepalived.conf,将解析后的keepalived.conf保存到内存中。

Scheduler-I/O Multiplexer

该模块通过selector多路I/O复用器模型提供调度进程中所有内部任务的支持。

Memory Management

该模块提供对某些通用内存管理功能的访问,例如分配,重新分配,发布等。可以在两种模式下使用:normal_mode和debug_mode。

Core Components

该模块定义了所有代码中都使用的一些通用库和全局库。这些库是:html解析,链接列表,计时器,向量,字符串格式,缓冲区转储,网络实用程序,守护程序管理,pid处理,低级TCP layer4。

WatchDog

该模块提供master父进程对子进程的健康监视器(VRRP和Real Server检查器)。

Checkers

该模块提供Keepalived对Real Server可用性的监视,该模块运行在master进程forked出一个单独的子进程中。运行过程中当监测到后端负载的某个Real Server挂掉时会将该RS从可用的负载均衡服务池中删除,当监测到后端负载的某个Real Server恢复时,会将该RS重新添加到可用的负载均衡服务池中。支持根据第4层、第5/7层的方式来监测,下面介绍每一层监测原理:

1、TCP_CHECK(第4层):在第4层工作。为确保此检查,我们使用TCP Vanilla检查,该检查使用无阻塞/超时的TCP连接。如果远程服务器未回复此请求(超时),则测试错误,同时将该服务器从服务器池中删除。

2、HTTP_GET(第5/7层):在第5层工作。对指定的URL执行HTTP GET。然后,使用MD5算法对HTTP GET结果进行求和。如果此MD5值和与期望值不匹配,则测试错误,同时将该服务器从服务器池中删除。

3、SSL_GET(第5/7层):与HTTP_GET相同,但使用到远程Web服务器的SSL连接。

4、MISC_CHECK此检查允许将用户定义的脚本作为运行状况检查器运行,结果必须为0或1,可以使用完整路径(即/path_to_script/script.sh)调用在不带参数的情况下运行的脚本,如果调用需要参数的变量需要用双引号引起来(即“ /path_to_script/script.sh arg 1 ... arg n”)

 

VRRP Stack(虚拟路由器冗余协议:RFC2338)

该模块提供基于ARRP协议实现LVS高可用能力,该模块不需要依赖LVS可以单独使用。该模块也是运行在master进程forked出一个单独的子进程中。

ARRP大致原理:可以指定2/多个VRRP实例之间的状态监视,也称为VRRP同步组,它保证该同步组VRRP实例保持相同状态,同步组的实例直接相互监视,同一个同步组内只有一个实例为MASTER,其它为BACKUP,当BACKUP监测到MASTER挂掉时,则会根据Keepalived.conf配置文件定义的优先级字段来决定哪个BACKUP接管MASTER的工作(创建VIP),当挂掉的MASTER恢复后,该MASTER会重新拿回MASTER的角色,BACKUP会让位继续做BACKUP角色(删除VIP)。

System Call

该模块提供启动额外系统脚本的功能。它主要用于MISC检查器中。

 

Netlink Refector

该模块与IPVS包装器功能相同,是Keepalived使用其自己的网络接口表示形式。

SMTP

该模块提供SMTP协议管理通知能力,比如发送邮件。

IPVS Wrapper

该模块提供将规则发送到内核IPVS代码。它提供了Keepalived内部数据表示和IPVS rule_user表示之间的转换。它使用IPVS libipvs来保持与IPVS代码的通用集成。

IPVS

该模块便是章文嵩博士编写的LVS的负载均衡器。

NETLINK

该模块用于在内核和用户空间进程之间传输信息。由Alexey Kuznetov提供的Linux Kernel代码,具有非常好的高级路由功能。它由一个用于用户空间进程的基于套接字的标准接口和一个用于内核模块的内部内核API组成。

 

Syslog

所有keepalived守护程序通知消息都是使用syslog服务记录的。

Keepalived官方参考文档地址:https://www.keepalived.org/doc/

Keepalived 搭建

Keepalived负载均衡器基于LVS,LVS负载均衡有3大模式,最常用的为DR(直接路由)模式,这里搭建也是基于LVS的DR模式进行搭建。

1、准备4台搭建服务器清单:

节点名称

角色

IP

VIP

node1

VS(MASTER)

10.68.212.101

10.68.212.100

node2

VS(BACKUP)

10.68.212.102

10.68.212.100

node3

RS 1

10.68.212.103

10.68.212.100

node4

RS 2

10.68.212.104

10.68.212.100

 

2、关闭所有节点防火墙、所有节点做时间同步:

# 关闭防火墙
systemctl stop firewalld
# 时间同步
yum install ntpdate -y
ntpdate -u ntp.api.bz

 

3、RS节点安装apache httpd模拟web服务(node3、node4节点都要执行):

yum install -y httpd
# 写入点内容区分后面负载均衡测试效果
echo "this is `hostname` real server" > /var/www/html/index.html
# 启动httpd服务
systemctl start httpd.service
# 通过curl命令测试httpd服务
curl 10.68.212.103
curl 10.68.212.104

 

 

4、虚拟服务节点VS安装Keepalived(node1、node2都要配置):

yum install keepalived -y

 

5、修改keepalived.conf配置信息:

vi /etc/keepalived/keepalived.conf

内容如下:

! Configuration File for keepalived
 
# 全局配置块
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实例配置块,一个实例一个块
vrrp_instance VI_1 {
    # 标识该节点为MASTER
    state MASTER
    # 配置网卡接口,根据ifconfig命令查到
    interface enp0s3
    # 指定实例所属的VRRP路由器id,类似集群id
    virtual_router_id 52
    # 优先级,MASTER要比BACKUP高
    priority 100
    # 指定广播间隔,1s
    advert_int 1
    # 这里配置不动
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 配置LVS VIP
    virtual_ipaddress {
        # ifconfig enp0s3:1 10.68.212.100/24
        10.68.212.100/24 dev enp0s3 label enp0s3:1
    }
}
 
 
# 配置LVS虚拟服务
virtual_server 10.68.212.100 80 {
    # 每间隔6s检测一次
    delay_loop 6
    # 调度算法
    lb_algo rr
    # LVS模式
    lb_kind DR
    # 同一个IP在多少s内转发给同一个RS
    persistence_timeout 0
    protocol TCP
 
    # RS 1心跳检测配置,需要配置RS默认网卡IP
    real_server 10.68.212.103 80 {
        # 权重
        weight 1
        HTTP_GET {
            # 配置url信息,可以配置多个
            url {
              # 心跳检测地址
              path /
              # 心跳教程返回状态码
              status_code 200
            }
            # 超时时间3s
            connect_timeout 3
            # 检测重试次数
            nb_get_retry 3
            # 每间隔3s重试一次
            delay_before_retry 3
        }
    }
 
   # RS 2
   real_server 10.68.212.104 80 {
        # 权重
        weight 1
        HTTP_GET {
            # 配置url信息,可以配置多个
            url {
              # 心跳检测地址
              path /
              # 心跳教程返回状态码
              status_code 200
            }
            # 超时时间3s
            connect_timeout 3
            # 检测重试次数
            nb_get_retry 3
            # 每间隔3s重试一次
            delay_before_retry 3
        }
    }
}

6、启动keepalived:

systemctl start keepalived

7、查看VIP子网卡创建情况:

ifconfig

可以看到Keepalived根据我们的配置自动在enp0s3网卡子接口enp0s3:1上创建了VIP:

 

8、安装ipvsadm客户端程序:

yum install -y ipvsadm
ipvs -ln

通过ipvsadm -ln命令看到keepalived根据配置自动创建LVS虚拟服务规则并检测到可用的RS信息:

 

 

我们测试将node3的httpd服务停掉,一小段时间后再查看检测RS的结果已经正确地将node3节点剔除掉,这就解决了一开始提到的第2个问题:

 

测试完成后将node3节点httpd服务重新启动:systemctl start httpd。

 

9、现在我们访问VIP:10.68.212.100:80是访问不了,因为RS服务没有配置VIP,现在通过下面命令创建VIP(node3、node4节点都要执行):

# 修改arp请求和响应方式,注意这种方式重启服务器后就失效
echo 1  > /proc/sys/net/ipv4/conf/enp0s3/arp_ignore
echo 1  > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2  > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2  > /proc/sys/net/ipv4/conf/enp0s3/arp_announce
# 在回环网卡子接口创建VIP,注意这种方式重启服务器或网卡后就失效,可以通过新增网卡文件(vi /etc/sysconfig/network-scripts/ifcfg-lo:1)的方式永久来创建
ifconfig lo:1 10.68.212.100 netmask 255.255.255.255

可以看到环回网卡lo子接口lo:1成功创建了VIP:

10、在其它节点上执行如下命令测试如下:

for i in {1..10}; do curl 10.68.212.100 ;done

 

11、继续配置node2使之成为虚拟服务备份,在node2服务器上安装keepalived:

yum install keepalived -y

12、从node1上将keepalived.conf配置文件scp到node2节点,然后vi修改相关配置点:

scp -r /etc/keepalived/keepalived.conf root@10.68.212.102:/etc/keepalived/

修改下面截图内容:

12、启动keepalived:

systemctl start keepalived

13、查看node2的网卡信息,可以看到node2并没有创建VIP(只能有一个MASTER,也就不能重复创建VIP),因为MASTER还存活,但是通过ipvsadm命令可以看到node2和node1的RS信息是一致的:

ifconfig

ipvsadm -ln

14、为了验证keepalived高可用能力,我们现在将node1的网卡enp0s3关掉:

ifconfig enp0s3 down

注意,此时你的ssh客户端应该处于阻带状态,因为网卡被关闭,无法对外提供通信。

15、现在回到node2可以看到node2创建了VIP(发送了IP漂移),开始接管MASTER的工作:

16、此时我们继续找另外一台非集群的机子测试访问:

for i in {1..10}; do curl 10.68.212.100 ;done

 

可以看到依然能够使用。

 

17、我们继续将node1网卡启动后,可以看到node1重新成为MASTER,node2退回到BACKUP,下面是期间node2从BACKUP到MASTER来回切换的过程日志记录:

Keepalived的日志文件位置:/var/log/message。

 

至此,Ke'e'pa'lived + LVS 原理和搭建讲解完毕!

       ---------------------- 正文结束 ------------------------

长按扫码关注微信公众号

Java软件编程之家

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值