keepalived+LVS-DR集群

Keepalived

Keepalived介绍:

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,主要用来提供故障切换和健康检查功能,如判断LVS负载调度器、节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入集群。后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件(如nginx、Mysql等应用服务)。

keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决路由器的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

VRRP协议说明

VRRP是针对局域网中配置静态网关出现单点故障的解决方案,一个局域网络内的所有主机都设置缺省路由(默认网关),当网内主机发出的目的地址不在本网段时,报文将被通过缺省路由发往外部路由器,从而实现了主机与外部网络的通信。当缺省路由器down掉(即端口关闭)之后,内部主机将无法与外部通信,如果路由器设置了VRRP时,那么这时,虚拟路由将启用备份路由器,从而实现全网通信。

工作流程如图:

keepalived+LVS-DR集群_第1张图片

VRRP是针对路由器的一种备份解决方案-----由多台路由器组成一个热备组。这个热备组里面有一个master和多个backup。master上面有一个对外提供服务的vip,通过vip地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的主服务器失败,其他服务器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。热备组内的每台服务器都可以成为主服务器,虚拟IP地址(VIP)可以在热备组内的服务器之间进行转移,所以也称为漂移IP地址,使用Keepalived时,漂移地址的实现不需要手动建立虚拟接口配置文件(如ens33:0),而是由Keepalived根据配置文件自动管理。

Keepalived高可用是如何实现故障切换转移的?

Keepalived高可用服务对(主备)之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。

拓展:OSI七层和OSI七层相关协议

OSI七层:

keepalived+LVS-DR集群_第2张图片

OSI七层相关协议

keepalived+LVS-DR集群_第3张图片

Keepalived工作原理

Layer3、4、5工作在IP/TCP协议栈的IP层,TCP层,及应用层。

keepalived具有3、4、5层交换及健康检测功能。

Layer3层检测:进行ICMP ping包检测,确认主机是否存活,如果异常,则会该主机从服务器集群中剔除。Keepalived 使用 Layer3 的方式工作式时, Keepalived 会定期向集群中的服务器发送一个 ICMP 的数据包(既我们平时用的 Ping 程序),如果发现某台服务的IP地址没有激活,Keepalived 便报告这台服务器失效,并将它从集群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3 的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

Layer4层检测: 进行端口检测,例如80、3306等,端口不通时,将服务器从集群中剔除;主要以TCP端口的状态来决定服务器工作正常与否。如 web server 的服务端口一般是80,如果 Keepalived 检测到 80 端口没有启动,则 Keepalived 将把这台服务器从服务器群中删除。

Layer5层检测:这个就是基于应用的了,如http返回码是否为200,确认主机是否正常。Layer5 就是工作在具体的应用层了,比 Layer3,Layer4 要复杂一点,在网络上占用的带宽也要大一些。 Keepalived 将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则 Keepalived 将把服务器从服务器群中剔除(例如:http返回码是否为200,确认主机是否正常)。

Keepalived的功能和核心组件

Keepalived服务的三个重要功能:

1.管理LVS

2.对LVS集群节点检查

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

Keepalived核心组件

下图是keepalived的组件图:

keepalived+LVS-DR集群_第4张图片

    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状态。

经典高可用web架构:

LVS+keepalived+nginx+tomcat(apache+php+eaccelerator)+nfs(nfs可选)

注:eaccelertor [əkˈseləreɪtər]是一个开放源代码的php加速、优化和动态内容缓存的扩展模块,它可以提升php程序的缓存性能,降低PHP程序在解析时对服务器的性能开销。eaccelerator还有对PHP优化的作用,加快其执行效率。

keepalived+LVS-DR集群_第5张图片

    Nginx做反向代理,若出现Nginx单机故障,则导致整个系统无法正常运行。针对系统架构设计的高可用要求,我们需要解决Nginx出现单机故障时,系统正常运行的需求。所以系统架构引入Lvs+Keepalived组件,实现系统高可用。

keepalived官网

Keepalived for Linux

keepalived+LVS-DR集群_第6张图片

keepalived下载:

Keepalived for Linux

keepalived+LVS-DR集群_第7张图片

使用Keepalived构建LVS-DR模式的高可用集群

网络拓扑

上图设计目的是用Keepalived构建高可用性的LVS负载均衡集群。使用Keepalived构建LVS集群更加简便易用,主要优势体现在:对LVS负载调度器实现热备切换,提高可用性,对WEB服务器池中的节点进行健康检查,自动移除失败节点,恢复后再重新加入。

在基于LVS-Keepalived实现的LVS集群结构中,至少包括两台热备的负载调度器,两台或两台以上的web节点服务器,本例将以DR模式的LVS集群为基础,增加一台从负载调度器,使用Keepalived来实现主、从调度器的热备,从而构建建有负载均衡、高可用两种能力的LVS网站集群平台。

实验

keepalived+LVS-DR集群_第8张图片

注:关闭防火墙和selinux

Keepalived的设计目标是构建高可用的LVS负载均衡群集,可以调用ipvsadm工具来创建虚拟服务器、管理服务器池,而不仅仅用来做双机热备。使用Keepalived构建LVS群集更加简便易用,主要优势体现在:对LVS负载调度器实现热备切换,提高可用性;对服务器池中的节点进行健康检查,自动移除失效点节,恢复后再重新加入。

使用 Keepalived构建LVS群集时,也需要用到ipvsadm管理工具,但大部分工作会由Keepalived自动完成,不需要手动执行ipvsadm(除了查看和监控群集以外)

开一台虚拟机rs02,配置keepalived

第一种安装方法:

yum install –y keepalived

查看安装路径:

rpm -ql keepalived-1.3.5-1.el7.x86_64

第二种安装方法(源码安装)

本文采用第二种安装方法

在主节点ds02上安装keepalived

[root@ds02 ~]# yum -y install gcc openssl-devel pcre-devel libnl-devel   #安装依赖

[root@ds02 ~]# tar zxf keepalived-2.0.18.tar.gz    #解包

[root@ds02 ~]# cd keepalived-2.0.18/

[root@ds02 keepalived-2.0.18]# ./configure --prefix=/usr/local/keepalived

[root@ds02 keepalived-2.0.18]# make && make install

了解keepalived的文件

[root@ds02 keepalived-2.0.18]# cd /usr/local/keepalived/

[root@ds02 keepalived]# ls

bin  etc  sbin  share

#etc下有配置文件etc/keepalived/keepalived.conf

在从节点ds01上用同样的方法安装keepalived(过程略)

配置Keepalived+LVS-DR模式

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

配置说明:

节点ds02(主节点); 节点ds01(备用节点) ; 

虚拟 IP :192.168.10.100对外提供服务的 IP。 要求默认情况下由节点ds02提供服务,当节点ds02不可用时,由节点ds01提供服务(即虚拟 IP 漂移至节点ds01)。

主节点ds02配置

keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、vrrp_instance和virtual_server。

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

vrrp_instance:用来定义对外提供服务的VIP区域及其相关属性。

virtual_server:虚拟服务器定义。

修改keepalived.conf配置文件

Ds02主机上的keepalived.conf文件的修改:

[root@ds02 ~]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/

[root@ds02 ~]# mkdir /etc/keepalived/

[root@ds02 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

[root@ds02 ~]# vim  /etc/keepalived/keepalived.conf

! Configuration File for keepalived     #!表示注释

global_defs {                       #全局定义部分

   notification_email {              #设置警报邮箱

     [email protected]      #接收警报的邮箱地址,根据实际情况写

     [email protected]

     [email protected]

   }

   notification_email_from [email protected] #设置发件人地址

   smtp_server 192.168.200.1    #设置smtp server地址,即发邮件服务器

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

   router_id ds02   #表示运行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, 两个节点设置必须一样

        192.168.10.100

    }

}

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

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

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

virtual_server 192.168.10.100 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 192.168.10.5 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 192.168.10.6 80 {   #RS节点2

        weight 1

        TCP_CHECK {

                connect_timeout 3

                nb_get_retry 3

                delay_before_retry 3

                connect_port 80

                }

    }

}

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

keepalived.conf配置文件完整内容如下所示:

[root@ds02 ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id ds02
}

vrrp_instance lvs-dr {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100
    }
}

virtual_server 192.168.10.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP

    real_server 192.168.10.5 80 {
        weight 1
        TCP_CHECK {    
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.10.6 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }   
    }
}

重启keepalived服务和开机自启

[root@ds02 ~]# systemctl restart keepalived

[root@ds02 ~]# systemctl enable keepalived

[root@ds02 ~]# systemctl status keepalived

keepalived+LVS-DR集群_第9张图片

安装ipvsadm

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

[root@ds02 ~]# yum -y install ipvsadm  #俩台都装(ds01,ds02)

[root@ds02 ~]# lsmod | grep ip_vs

[root@ds02 ~]# ipvsadm -Ln

备用节点ds01配置

安装keepalived

和主节点ds02安装相同,请参考ds02的安装过程。

修改keepalived.conf配置文件

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

[root@ds01 ~]# mkdir /etc/keepalived

[root@ds01 ~]# scp [email protected]:/etc/keepalived/keepalived.conf /etc/keepalived/

复制过来之后,还要做一定的修改:

 [root@ds01 ~]# vim /etc/keepalived/keepalived.conf

注:红色为改动项值

 ! Configuration File for keepalived

global_defs {

   router_id ds01

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 {

        192.168.10.100

    }  

virtual_server 192.168.10.100 80 {

    delay_loop 6

    lb_algo rr

    lb_kind DR

    #persistence_timeout 50

    protocol TCP

   

    real_server 192.168.10.5 80 {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }  

    }  

    real_server 192.168.10.6 80 {

        weight 1

        TCP_CHECK {

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }  

    }  

}

重启keepalived服务和开机自启

[root@ds01 ~]# systemctl restart keepalived

[root@ds01 ~]# systemctl enable keepalived

测试主备切换

查看主备情况

在ds02和ds01分别执行ip addr show dev ens33命令查看ds02和ds01对VIP(群集虚拟IP)的控制权。

ds02主节点的查看结果:

[root@ds02 ~]# ip addr show dev ens33keepalived+LVS-DR集群_第10张图片

ds01从节点的查看结果:

[root@ds01 ~]# ip addr show dev ens33

从上面的显示结果可以看出ds02是主服务器,ds01为备用服务器。

测试主备vip地址漂移

主备vip漂移,只需关闭主节点的keepalived服务,主节点VIP地址消失,备节点显示VIP地址,开启主的keepalived服务,备VIP节点VIP地址消失,主节点显示VIP地址。

[root@ds02 ~]# systemctl stop keepalived

[root@ds02 ~]# ip addr show dev ens33

[root@ds01 ~]# ip addr show dev ens33

keepalived+LVS-DR集群_第11张图片

[root@ds02 ~]# systemctl start keepalived

[root@ds02 ~]# ip addr show dev ens33

keepalived+LVS-DR集群_第12张图片

keepalived脑裂现象

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

脑裂产生的原因:

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

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

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

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

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

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

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

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

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

配置rs

关闭ARP转发(在两台RS上都需要同样的操作)。

[root@rs01 ~]# 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

使内核参数修改生效:

[root@rs01 ~]# sysctl -p  #在rs02上也使内核参数生效

因为之前安装过httpd所以不用安装了,如果没有可以参考之前文章安装httpd

测试

先把之前keepalived配置文件中连接保持时间注释掉(ds01,ds02)

keepalived+LVS-DR集群_第13张图片

重启keepalived

systemctl restart keepalived

http://192.168.10.100

keepalived+LVS-DR集群_第14张图片

刷新一下

keepalived+LVS-DR集群_第15张图片

keepalived的常见的健康检查方式

TCP_CHECK :tcp端口检测

HTTP_GET :http接口检测

MISC_CHECK :自定义脚本检测

TCP_CHECK检测

 real_server 192.168.10.5 80 {
        weight 1
        TCP_CHECK{
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_prot 80
        }
        }

HTTP_GET检测

基于状态码的检测

 real_server 192.168.10.5 80 {
        weight 1
        HTTP_GET{
          url{
            path /index.html
            status_code 200
           }
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 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选项表示设置数据传输的最大时间。传输的最大允许时间

你可能感兴趣的:(运维)