1、介绍

主要用来管理并监控LVS集群系统中各个服务节点的状态,用来提供故障切换的和健康检查功能,判断LVS负载调度器,节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入集群。

keepalived软件主要通过VRRP协议实现高可用功能的,VRRP是虚拟路由冗余协议的缩写,VRRP是为了解决单点故障问题的,他能保证当个别的节点宕机时,整个网络可以不断的运行。

1.2、keepalivaed 高可用是如何实现故障切换的

keepalived 服务工作时,主master节点会不断地向备用节点发送心跳信息,告诉backup节点自己还活着。当主节点发生故障时,就无法发送心跳了,于是会调用自身的接管程序,接管主节点的ip资源和服务。

1.3、keepalived工作原理

keppalived具有3、4、5层交换机健康检测功能

1、Layer3层检测:是以服务器的ip地址是否有效作为服务器工作正常与否的标准

2、Layer4层检测:进行端口检测,主要是以TCP端口的状态决定服务器工作是否正常、

3、Layer5层检测:是基于应用层的方式检测,是靠访问返回的状态码来确定主机是否正常,

1.5、Keepalived服务的三个重要功能

1、管理LVS

2、对LVS集群节点检查

3、作为其他网络服务的高可用功能

1.6、keepalived核心组件

keepalived也是模块化设计,不同模块负责不同的功能,它主要有三个模块,分别是core、check和VRRP,其中:

    core模块:为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析;

    check:负责健康检查,包括常见的各种检查方式;

    VRRP模块:是来实现VRRP协议的。

 其他组件:

    system call:系统调用

    watch dog:监控check和vrrp进程的看管者,check负责检测健康状态,当其检测到master上的服务不可用时则通告vrrp将其转移至backup服务器上。

    大致如下:

    1.利用VRRP协议进行主备通信。组播224.0.0.18

    2.利用VRRP协议进行主备竞选,产生VIP

    3.利用VRRP协议主向备发送组播包。当备服务器接收不到主服务器的组播包,就会认为主出现故障,主动接管资源

    4.当主恢复时,根据配置决定是否抢占备服务器资源

    ipvs wrapper:为集群内的所有节点生成IPVS规则

注意,keepalived和LVS完全是两码事,只不过他们各负其责,相互配合而已。

Keepalived启动后会有三个进程:

父进程:内存管理,子进程管理等等

子进程:vrrpd子进程

子进程:healthchecker子进程

由上图可知,两个子进程都被系统WatchDog看管,两个子进程各自实现自己的事,healthchecker子进程实现检查各自服务器的健康程度,例如HTTP,LVS等等,如果healthchecker子进程检查到MASTER上服务不可用,就会通知本机上的VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。

1.7keeppalived官网

http://www.keepalived.org/

2、使用keepalived 构建LVS-DR模式的高可用集群

2.1、实验环境

vip:172.168.1.160/24

角色主机名外网接口外网ip内网接口内网ip
主调度器masterens33192.168.1.160ens33192.168.1.4
从调度器dockupens33192.168.1.160ens33192.168.1.5
RS节点1RS01ens33192.168.1.160ens33192.168.1.6
RS节点02RS02ens33192.168.1.160ens33192.168.1.7

注:关闭防火墙和selinux

  使用keppalived构建集群时,也需要用到ipvsadm管理工具,但大部分工作会由keepailed完成

不需要手动执行ipvsadm

2.2、安装keepalived

安装依赖包:

yum -y install gcc openssl-devel pcre-devel libnl-devel

tar zxf keepalived-2.0.18.tar.gz   #进入在安装包内

 ./configure --prefix=/usr/local/keepalived     #预编译

make && make install    #编译安装

2.3、配置keepalived+LVS-DR模式

  在这种模式下,虚拟ip在某时刻只能属于一个节点,另一个节点作为备用节点存在。当主节点宕机时,备用节点会接管虚拟ip,提供正常服务

2.4、主节点配置

keepalived 只有一个配置文件 keepalived.conf , 里面主要包括global_defs、vrrp_instance和virtual_server

global_defs:只要是配置故障发生时的通知对象以及机器标识、

vrrp_instance:用来定义对外服务的vip区域及相关属性

virtual_server:虚拟服务器定义

2.5、修改keepalived.conf 配置文件

ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/  #设置符号连接
mkdir /etc/keepalived/       #创建keepalived目录
cp /usr/local/keepalived/etc/keepalived/keepalived.conf   #将配置文件复制到创建好的目录下
vim  /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 server地址,即发邮件服务器

   smtp_connect_timeout 30   #设置smtp超时连接时间,以上参数可以不配置

   router_id m_director   #表示运行keepalived服务器的一个标识,这个标识(router_id)是唯一的

}

vrrp_instance lvs-dr {  #定义一个实例,一个集群就是一个实例。 默认VI_1 可以随意改

    state MASTER  #MASTER表示指定本节点为主节点,备用节点上设置为 BACKUP。注意节点状态均大写。

    interface ens33    #绑定虚拟 IP 的网络接口

    virtual_router_id 51  #虚拟路由ID标识,这个标识最好是一个数字,在一个keepalived.conf配置中是唯一的, MASTER和BACKUP配置中相同实例的virtual_router_id必须是一致的。

    priority 100    #节点的优先级(1-254之间),越大越优先。备用节点必须比主节点优先级低。

    advert_int 1   #为同步通知间隔。MASTER与BACKUP之间心跳检查的时间间隔,单位为秒,默认为1。

    authentication {  #设置验证信息,两个节点必须一致,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {    #指定虚拟 IP, 两个节点设置必须一样

        172.16.16.172

    }

}

#至此为止以上为实现高可用配置,如只需使用高可用功能下边配置可删除

#以下为虚拟服务器定义部分

#类似添加虚拟服务器 ipvsadm -A -t 172.16.16.172:80 -s rr

virtual_server 172.16.16.172 80 {    #设置虚拟服务器,指定虚拟IP和端口

    delay_loop 6            #健康检查时间为6秒,即Keepalived多长时间监测一次RS。

    lb_algo rr             #设置负载调度算法为rr算法

    lb_kind DR         #设置负载均衡模式,有NAT,TUN和DR三种模式可选

    nat_mask 255.255.255.0   #非NAT模式注释掉此行  注释用!号

    persistence_timeout 50  #连接保持时间,单位是秒。有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。同一IP地址的客户端50秒内的请求都发到同个real server ,这个会影响LVS的 rr 调度算法,同一IP的客户端超过50 秒后,再次访问,才会被转发到另一台real server上。Persistence是持久性的意思

    protocol TCP   #指定转发协议类型,有TCP和UDP两种

    real_server 172.16.16.177 80 { #配置RS节点1,需要指定 realserver 的真实 IP 地址和端口,IP和端口之间用空格隔开

        weight 1    ##权重,权重大小用数字表示,数字越大,权重越高 

        TCP_CHECK {     #节点健康检查。这段内容要手动添加,把原来的内容删除

                connect_timeout 3       #超时时间,表示3秒无响应超时。

                nb_get_retry 3          #表示重试次数

                delay_before_retry 3    #表示重试间隔

                connect_port 80         #检测端口,利用80端口检查

                }

    }

    real_server 172.16.16.178 80 {   #RS节点2

        weight 1

        TCP_CHECK {

                connect_timeout 3

                nb_get_retry 3

                delay_before_retry 3

                connect_port 80

                }

    }

}

#默认配置文件中还有两个 virtual_server 模版,把剩下的都删除了,就可以。 如:

#virtual_server 10.10.10.2 1358 {  。。。 }

#virtual_server 10.10.10.3 1358 {  。。。 }

2.6、重启keepalived

systemctl restart keepalived

2.7、安装ipvsadm

yum -y install ipvsadm          #安装ipvsadm
lsmod | grep ip_vs          #查看ip_vs

 ipvsadm -L –n  #查看LVS集群

 2.8、配置backup从节点

参考master节点的安装

2.9、修改keepalived配置文件

备用节点的keepalived.conf文件配置与主节点基本相同,只是router_id,state,priority三处不同,其他配置都相同

注:红色为改动项值

 ! Configuration File for keepalived

global_defs {

   router_id s_director

vrrp_instance lvs-dr {

    state BACKUP

    interface ens33

    virtual_router_id 51

    priority 99

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }  

    virtual_ipaddress {

        172.16.16.172

    }  

virtual_server 172.16.16.172 80 {

    delay_loop 6

    lb_algo rr

    lb_kind DR

    #persistence_timeout 50

    protocol TCP

   

    real_server 172.16.16.177 80 {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }  

    }  

    real_server 172.16.16.178 80 {

        weight 1

        TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }  

    }  

}

启动keepalived和安装ipvsadm

systemctl enable keepalived.service
 yum -y install ipvsadm

安装完成后不需要任何配置,启动方式由keepalived控制

3、测试主备切换

在master和backup上分别执行ip addr show ens33命令查看master和backup对VIP的控制权

master:

backup:

3.1、测试主备VIP漂移

 只需关闭主节点的keepalived服务,主节点的VIP地址消失,备节点显示VIP,再次开启主节点后备节点VIP消失,VIP又会回到主节点

systemctl stop keepalived.service      #停止keepalived

ip addr show ens33 

再次查看master节点的VIP消失 

查看从节点backup

现在backup节点显示VIP地址

3.2、keepalived脑裂现象

由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方存活心跳信息,从而导致互相抢占对方的资源和服务所有权,然而此时两台高可用服务器有都还存活。表现形式就是备节点上出现了虚拟IP, 此时主节点也是持有虚拟IP的。

 脑裂产生的原因:

 一般来说,裂脑的发生,有以下几种原因:

    高可用服务器对之间心跳线链路发生故障,导致无法正常通信。

         因心跳线坏了(包括断了,老化)。

         因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。

         因心跳线间连接的设备故障(网卡及交换机)。

    高可用服务器上开启了iptables防火墙阻挡了心跳消息传输。

    高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。

    其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。

    Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。

4、配置RS节点

4.1、关闭ARP转发

vim /etc/sysctl.conf           #在最后增加

net.ipv4.conf.ens33.arp_ignore = 1

net.ipv4.conf.ens33.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

4.2、配置虚拟ip地址

生成回环口配置文件

cd /etc/sysconfig/network-scripts/            
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0

DEVICE=lo:0

IPADDR=172.16.16.172

NETMASK=255.255.255.255

ONBOOT=yes

NAME=loopback

重启network

systemctl restart network

 ifconfig

4.3、安装httpd

 yum install -y httpd

systemctl start httpd

echo "192.168.1.6" > /var/www/html/index.html

5、配置RS02

跟rs01一样

5.2、测试VIP

在master节点上查看lvs状态

ipvsadm -LN

 访问vip地址

 

 5.3、keepalived的常见的健康检查方式

TCP_CHECK :tcp端口检测

HTTP_GET :http接口检测

MISC_CHECK :自定义脚本检测

 5.3.1、TCP_CHECK检测

real_server 172.16.16.177 80 {

            weight 100

            TCP_CHECK {

                connect_port 80  #检测端口,利用80端口检查

                connect_timeout 3  #连接超时时间

                nb_get_retry 3  #重连次数

                delay_before_retry 3  #重连间隔

            }

        }

5.3.2、HTTP_GET检测

是基于状态的检测

real_server 172.16.16.177 80 {

      weight 1

      HTTP_GET {

          url {

          path /index.html

          status_code 200 #http://172.16.16.177/index.html的返回状态码

            }

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

}

5.3.3、MISC_CHECK检测

自定义shell脚本监控

real_server 172.16.16.177 80 {

 weight 100

MISC_CHECK {

   misc_path "/opt/mytools/check_web.sh 172.16.16.177"  #脚本名,需全路径

   misc_timeout 30   #脚本执行的超时时间

   misc_dynamic          #如果设置了misc_dynamic,healthchecker程序的退出状态码会用来动态调整服务器的权重(weight)。

}

}

用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。脚本的返回值需为:

     #返回0:健康检查OK,权重不被修改

     #返回1:健康检查失败,权重设为0

     #返回2-255:健康检查OK,权重设置为:退出状态码-2,比如返回255,那么weight=255-2=253

 keepalived检测脚本内容/opt/mytools/check_web.sh,返回0代表检查正常,返回1代表检查异常

 /opt/mytools/check_web.sh内容如下

#!/bin/sh

serverip=$1

curl -s -m 2 http://$serverip

if [ $? -eq 0 ];then

    exit 0

else

    exit 1

fi

 注:curl命令中的-s选项表示静音模式,不输出任何东西。-m选项表示设置数据传输的最大时间。传输的最大允许时间

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐