Keepalived的高可用实现



一、 Keepalived概述与安装

1VRRP协议介绍

在介绍keepalived之前,不得不先介绍下一个协议——VRRP。之所以要介绍这个协议,是因为VRRP协议是keepalived实现的基础。下面先来一块看下这个这协议是干吗用的吧。

如上图所示,通常,同一网段内的所有主机都设置一条相同的、以网关为下一跳的缺省路由。主机发往其他网段的报文将通过缺省路由发往网关,再由网关进行转发,从而实现主机与外部网络的通信。当网关发生故障时,本网段内所有以网关为缺省路由的主机将无法与外部网络通信,仅能实现内部主机间通信。缺省路由为用户的配置操作提供了方便,但是对缺省网关设备提出了很高的稳定性要求。增加出口网关是提高系统可靠性的常见方法,此时如何在多个出口之间进行选路就成为需要解决的问题。而VRRP正好解决了此问题。

VRRPVirtual Router Redundancy Protocol,虚拟路由冗余协议。VRRP说白了就是实现地址漂移的,是一种容错协议,在提高可靠性的同时,简化了主机的配置。该协议能够实现将可以承担网关功能的一组路由器加入到备份组中,形成一台虚拟路由器,由VRRP的选举机制决定哪台路由器承担转发任务,局域网内的主机只需将虚拟路由器配置为缺省网关。

VRRP协议出现之前,为了不让单个路由器成为本地与外部通信的瓶颈,我们需要有多个路由,在此种模式下,我们内部的主机就需要将自己的网关指向不同的路由器,这样的配置对我们的网关管理员来说是很麻烦的,且不容易实现。在VRRP协议出现后,为了不让单个路由器成为本地与外部通信的瓶颈,我们仍需要有多个路由,但可以使用同一个缺省网关,我们只需将内部主机指定一个缺省网关即可。VRRP协议会根据优先级来选择一个正常的路由作为主路由器实现与外部的通信,而其他路由则作为备份路由不参与转发。在此模式下,多个路由器组成虚拟路由器组,物理上是多个路由器组成,但在逻辑上却是表现为只有一个路由。效果如下图所示:

在上图中,Router ARouter BRouter C组成一个虚拟路由器。各虚拟路由器都有自己的IP地址。局域网内的主机将虚拟路由器设置为缺省网关。Router ARouter BRouter C中优先级最高的路由器作为Master路由器,承担网关的功能。其余两台路由器作为Backup路由器。当master路由器出故障后,backup路由器会根据优先级重新选举新的master路由器承担网关功能。Master 路由器周期性地发送VRRP 报文,在虚拟路由器中公布其配置信息(优先级等)和工作状况。Backup路由器通过接收到VRRP 报文的情况来判断Master 路由器是否工作正常。

VRRP根据优先级来确定备份组中每台路由器的角色(Master 路由器或Backup 路由器)。优先级越高,则越有可能成为Master 路由器。VRRP优先级的可配置的取值范围为1 254

为了防止非法用户构造报文攻击备份组,VRRP通过在VRRP报文中增加认证字的方式,验证接收到的VRRP报文。VRRP提供了两种认证方式:

simple:简单字符认证。发送VRRP 报文的路由器将认证字填入到VRRP 报文中,而收到VRRP 报文的路由器会将收到的VRRP 报文中的认证字和本地配置的认证字进行比较。如果认证字相同,则认为接收到的报文是真实、合法的VRRP 报文;否则认为接收到的报文是一个非法报文。

md5MD5 认证。发送VRRP 报文的路由器利用认证字和MD5 算法对VRRP 报文进行摘要运算,运算结果保存在Authentication Header(认证头)中。收到VRRP 报文的路由器会利用认证字和MD5 算法进行同样的运算,并将运算结果与认证头的内容进行比较。如果相同,则认为接收到的报文是真实、合法的VRRP 报文;否则认为接收到的报文是一个非法报文。

在有多个路由器组成的虚拟路由中,当我们的内部主机很多时,如果所有主机都使用同一个master路由,会使得其他路由器很清闲,很浪费资源,我们期望我们本地的内部主机平分到各个路由器上,即让我们的内部主机的缺省网关指向不同的路由,从而减轻因只有一个master路由而造成网络带宽拥堵的负担。这就是负载分担VRRP。但这个如何实现呢?先看下面的配置效果图:

在此情况下,同一台路由器同时加入多个VRRP备份组,在不同备份组中有不同的优先级,从而实现负载分担。

在上图中,有三个备份组存在:

备份组1:对应虚拟路由器1Router A作为Master路由器,Router BRouter C作为Backup路由器。

备份组2:对应虚拟路由器2Router B作为Master路由器,Router ARouter C作为Backup路由器。

备份组3:对应虚拟路由器3Router C作为Master路由器,Router ARouter B作为Backup路由器。

为了实现业务流量在RouterARouter BRouter C之间进行负载分担,需要将局域网内的主机的缺省网关分别设置为虚拟路由器123。在配置优先级时,需要确保三个备份组中各路由器的VRRP优先级形成交叉对应。为了便于理解,我们假定有三个路由设备Router ABC和三台主机Host ABC,列举有在不同的虚拟路由组中。对路由器A来说,因在虚拟路由组1Router A的优先级高于另外两个,因此,Router A 作为 Master 路由器,Router B Router C 作为 Backup路由器;同样,对路由器B来说,因在虚拟路由器组2Router B的优先级高于另外两个,因此,Router B 作为 Master 路由器,Router A Router C 作为Backup路由器;对路由器C来说,因在虚拟路由器组3Router C的优先级高于另外两个,因此,Router C 作为 Master 路由器,Router A Router B 作为 Backup路由器。对不同的主机来说,一旦其master路由器出故障后,会在另外正常的路由器中根据优先级重新选定master路由。如这里假定Host A的默认网关指向Router A,即Host A指向虚拟路由器组1的默认网关,对主机A来说,如果其master路由出现故障,即Router A出现故障,则会从另外两个正常的备份虚拟路由中根据各自的优先级选取高优先级的作为新的master路由,这里就是选取Router B作为其master路由来完成网关功能。假如想了解更多关于VRRP协议相关的信息请查阅相关资料,这里不再过多介绍。

2、、Keepalived概述

本文主要了解开源高可用负载均衡集群利器keepalived,掌握keepalived的安装,运用keepalived配置高可用集群,并能够实现keepalived与负载均衡集群LVS的完美组合。

①、什么是keepalived

keepalived是一个类似于三、四、五层交换机的软件,也是我们平时说的第三层、第四层、第五层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后keepalived自动将web服务器加入到服务器集群中,这些工作全部自动完成,不需要人工干涉,需要人工做的知识修复故障的web服务器。

②、Keepalived的工作原理

三层、四层、五层工作在TCP/IP协议栈的IP层、TCP层、应用层。原理如下:

三层:keepalived使用三层方式工作是,keepalived会定期向服务器集群中的服务器发送一个IMCP的数据包,也就是ping程序,如果发现某台服务器的IP地址没有激活,keepalived便报告这台服务器失效,并将它从集群中删除,这种情况的典型例子是某台服务器被非法关机。三层的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

四层:主要是以TCP端口的状态来决定服务器工作正常与否。如web服务器的端口一般是80,如果keepalived检测到80端口没有启动,则keepalived将这台服务器从集群中剔除。

五层:应用层,比三层和四层要复杂一点,在网上占用的带宽也大一些,keepalived将根据用户的设定检查服务器程序运行是否正常,如果与用户设定的不相符,则keepalived将把服务器从服务器集群中剔除。

③、keepalived的作用

l  负载均衡-横向扩展。

l  高可用-可持续的服务器质量。

l  实现对失效服务器的隔离-通过健康监测,保证服务的可用性。

l  实现:vrrp协议实现。(冗余网关路由协议)。

④、keepalived体系结构

 

1watchdog 负责监控checkersvrrp进程的状况。

2Checkers 负责真实服务器的健康监测,是keepalived最主要的功能,换一句话说,可以没有vrrp statck,但是健康检查healthcheckping一定要有。

3Vrrp statck 负责负载均衡器之间失败切换failover。如果只用一个负载均衡器,则vrrp不是必须的。

4Ipvs warpper是用来发送设定的规则封装到内核ipvs代码。

5Netlink reflector  用来设定vrrpvip地址等。

 

Keepalived功能十分强大,但是配置工作十分简单,keepalived各种功能的实现是通过设定配置文件keepalived.conf来完成的。

3Keepalived的安装

①、安装keepalived

二进制编译安装三步骤:

l  ./confgiure

l  Make

l  make install

②、问题汇总

问题汇总:

1.gcc等编译工具

Yum install  gcc gcc-c++

2.openssl-devel支持

Yum  install openssl-devel

3.ipvs frameworkipvs syncdeamon support

查看kernels文件:

ls /usr/src/kernels

安装ipvsadm

Yum install kernel-devel ipvsadm

做软连接:

ln -s /usr/src/kernels/2.6.****   /usr/src/linux

4.make工具

Yum install  make

编译安装后,默认安装目录为/usr/local/etc/,下面三个目录

Keepalivedrc.dsysconfig

③、启动设置

设置开机自启动:

[root@master etc]# cp /usr/local/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/

[root@master etc]# cp /usr/local/etc/sysconfig/keepalived  /etc/sysconfig/

备份配置文件

[root@master etc]# mkdir /etc/keepalived

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

[root@master etc]# cp /usr/local/sbin/keepalived /usr/sbin/

 

[root@master etc]# service keepalived start

env: /etc/init.d/keepalived: 权限不够

[root@master etc]# chmod 755 /etc/init.d/keepalived

[root@master etc]# service keepalived start

正在启动 keepalived[确定]

[root@master etc]# ps xua|grep keep

root     29312  0.0  0.0   6852   748 ?        Ss   03:57   0:00 keepalived -D

root     29314  0.0  0.2   6908  2024 ?        S    03:57   0:00 keepalived -D

root     29315  0.7  0.1   6908  1244 ?        S    03:57   0:00 keepalived -D

 至此,keepalived安装完成。下一节开始实战。

二、配置文件详解:

1、配置说明:

keepalived的配置位于/etc/keepalived/keepalived.conf,配置文件格式包含多个必填/可选的配置段,部分重要配置含义如下:

         -global_defs: 全局定义块,定义主从切换时通知邮件的SMTP配置。

         -vrrp_instance: vrrp实例配置。

         -vrrp_script: 健康检查脚本配置。

 

细分下去,vrrp_instance配置段包括:

         -state: 实例角色。分为一个MASTER和一()BACKUP可以是MASTERBACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。

         -virtual_router_id: 标识该虚拟路由器的ID,有效范围为0-255

         -priority: 优先级初始值,竞选MASTER用到,有效范围为0-255

         -advert_int: VRRP协议通告间隔。

         -interface: VIP所绑定的网卡,指定处理VRRP多播协议包的网卡。节点固有IP(非VIP)的网卡,用来发VRRP包。

         -mcast_src_ip: 指定发送VRRP协议通告的本机IP地址。

         -authentication: 认证方式。

         -virtual_ipaddress: VIP

         -track_script: 健康检查脚本。

 

vrrp_script配置段包括:

         -script: 一句指令或者一个脚本文件,需返回0(成功)或非0(失败)keepalived以此为依据判断其监控的服务状态。

         -interval: 健康检查周期。

         -weight: 优先级变化幅度。

         -fall: 判定服务异常的检查次数。

         -rise: 判定服务正常的检查次数。

选举制度:

二、选举算法

keepalived中优先级高的节点为MASTERMASTER其中一个职责就是响应VIParp包,将VIPmac地址映射关系告诉局域网内其他主机,同时,它还会以多播的形式(目的地址224.0.0.18)向局域网中发送VRRP通告,告知自己的优先级。网络中的所有BACKUP节点只负责处理MASTER发出的多播包,当发现MASTER的优先级没自己高,或者没收到MASTERVRRP通告时,BACKUP将自己切换到MASTER状态,然后做MASTER该做的事:1.响应arp包,2.发送VRRP通告。

MASTERBACKUP节点的优先级如何调整?

首先,每个节点有一个初始优先级,由配置文件中的priority配置项指定,MASTER节点的priority应比BAKCUP高。运行过程中keepalived根据vrrp_scriptweight设定,增加或减小节点优先级。规则如下:

1. weight > 0时,vrrp_script script脚本执行返回0(成功)时优先级为priority + weight, 否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。

2. weight < 0时,vrrp_script script脚本执行返回非0(失败)时优先级为priority + weight, 否则为priority。当BACKUP发现自己的优先级大于MASTER通告的优先级时,进行主从切换。

3. 当两个节点的优先级相同时,以节点发送VRRP通告的IP作为比较对象,IP较大者为MASTER

主从的优先级初始值priority和变化量weight设置非常关键,配错的话会导致无法进行主从切换。比如,当MASTER初始值定得太高,即使script脚本执行失败,也比BACKUPpriority + weight大,就没法进行VIP漂移了。所以priorityweight值的设定应遵循: abs(MASTER priority BAKCUP priority) < abs(weight)

另外,当网络中不支持多播(例如某些云环境),或者出现网络分区的情况,keepalived BACKUP节点收不到MASTERVRRP通告,就会出现脑裂(split brain)现象,此时集群中会存在多个MASTER节点。

目录:

全局配置
VRRP Group
配置
VRRP Instance
配置
LVS
配置DR
LVS
配置RS

2、全局配置

global_defs {

         notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个邮件地址

                   [email protected]

         }

         notification_email_from [email protected] #指定发件人

         smtp_server localhost #指定smtp服务器地址

         smtp_connect_timeout 30 #指定smtp连接超时时间

         router_id LVS_DEVEL #运行keepalived机器的一个标识,必须唯一

}

3VRRP Group配置

vrrp_sync_group VG_1{ #监控多个网段的实例

         group {

                   inside_network #实例名,同一组的实例1

                   outside_network #实例名,同一组的实例2

         }

         notify_master /path/xx.sh #指定当切换到master时,执行的脚本

         netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本

         notify_fault "path/xx.sh VG_1" #故障时执行的脚本

         notify /path/xx.sh

         smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知

}

4VRRP Instance配置

vrrp_instance inside_network {

         state BACKUP #指定哪个为master,哪个为backup,如果设置了nopreempt这个值不起作用,主备靠priority决定

         interface eth0 #设置实例绑定的网卡,这个网卡就是和对端通讯,用于选举用的

         dont_track_primary #忽略vrrpinterface错误(默认不设置)

         track_interface{ #设置跟踪对象,里面哪个网卡出现问题都会切换,这里内外网有问题都会切换

                   eth0

                   eth1

         }

         mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip

         garp_master_delay #在切换到master状态后,延迟进行gratuitous ARP请求

         virtual_router_id 50 #路由ID标记,同一组为同一个值

         priority 99 #优先级,高优先级竞选为master

         advert_int 1 #检查间隔,默认1

         nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高

         preempt_delay #抢占延时,默认5分钟

         debug #debug级别

         authentication { #设置认证

                   auth_type PASS #认证方式

                   auth_pass 111111 #认证密码,密码无论设置多长,它也只会截取前面8个字符作为校验对象

         }

         virtual_ipaddress { #设置vip

                   192.168.202.200

         }

}

5LVS配置DR

virtual_server 192.168.202.200 23 {

         delay_loop 6 #健康检查时间间隔

         lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh

         lb_kind DR #负载均衡转发规则NAT|DR|RUN

         persistence_timeout 5 #会话保持时间

         protocol TCP #使用的协议

         persistence_granularity <NETMASK> #lvs会话保持粒度,掩码为255.255.255.0时表示一个段。

         virtualhost <string> #检查的web服务器的虚拟主机(host:头)

         sorry_server<IPADDR> <port> #备用机,所有realserver失效后启用

}

6LVS配置RS

real_server 192.168.200.5 23 {

         weight 1 #默认为1,0为失效

         inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除

         notify_up <string> | <quoted-string> #在检测到server up后执行脚本

         notify_down <string> | <quoted-string> #在检测到server down后执行脚本

 

         TCP_CHECK {

                   connect_timeout 3 #连接超时时间

                   nb_get_retry 3 #重连次数

                   delay_before_retry 3 #重连间隔时间

                   connect_port 23 健康检查的端口的端口

                   bindto <ip>

         }

         HTTP_GET | SSL_GET{

                   url{ #检查url,可以指定多个

                   path /

                   digest <string> #检查后的摘要信息

                   status_code 200 #检查的返回状态码

         }

         connect_port <port>

         bindto <IPADD>

         connect_timeout 5

         nb_get_retry 3

         delay_before_retry 2

         }

 

         SMTP_CHECK{

                   host{

                   connect_ip <IP ADDRESS>

                   connect_port <port> #默认检查25端口

                   bindto <IP ADDRESS>

         }

         connect_timeout 5

         retry 3

         delay_before_retry 2

         helo_name <string> | <quoted-string> #smtp helo请求命令参数,可选

         }

         MISC_CHECK{

                   misc_path <string> | <quoted-string> #外部脚本路径

                   misc_timeout #脚本执行超时时间

                   misc_dynamic #如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2

         }

}

三、实战:

1、环境

 

如上图所示:

         keepalivedmaterproxy-masterkeepalivedslaveproxy-slave

要求:当mater出现问题时,主动切换到slave上。这里只是进行简单的主从切换展示,后续会有专门一节将zabbix proxy高可用方式。

2配置文件

①、master的配置文件

cat keepalived.conf

 

! Configuration File for keepalived

 

global_defs {

         notification_email {

                   [email protected]

         }

         notification_email_from [email protected]

         smtp_server 127.0.0.1

         smtp_connect_timeout 30

         router_id LVS_DEVEL

}

 

vrrp_script chk_zabbix_web {

         script "killall -0 zabbix_proxy"

         interval 10

         weight 20

}

 

vrrp_instance VI_ZBX_WEB {

         state BACKUP  #注意,这里因为考虑到切换成slave后我不再切回来,所以也配置成backup,且为nopreempt模式

         nopreempt #when myself is master,set this option.

         interface eth0

         virtual_router_id 160

         priority 100

         advert_int 1

         mcast_src_ip 192.168.1.102

         authentication {

                   auth_type PASS

                   auth_pass ZabbixServer

         }

         track_script {

                   chk_zabbix_web

         }

         virtual_ipaddress {

                   192.168.1.100

         }

         #notify_master "/etc/keepalived/change_to_master.sh"

         notify_backup "/etc/keepalived/change_to_backup.sh"   #切换为backup后,执行的脚本

}

②、slave上的配置:

cat keepalived.conf

 

! Configuration File for keepalived

 

global_defs {

         notification_email {

                   [email protected]

         }

         notification_email_from [email protected]

         smtp_server 127.0.0.1

         smtp_connect_timeout 30

         router_id LVS_DEVEL

}

 

vrrp_script chk_zabbix_web {

         script "killall -0 zabbix_agentd"

         interval 10

         weight 20

}

 

vrrp_instance VI_ZBX_WEB {

         state BACKUP

         #nopreempt #when myself is master,set this option.

         interface eth1

         virtual_router_id 160

         priority 90

         advert_int 1

         mcast_src_ip 192.168.1.101

         authentication {

                   auth_type PASS

                   auth_pass ZabbixServer

         }

         track_script {

                   chk_zabbix_web

         }

         virtual_ipaddress {

                   192.168.1.100

         }

         notify_master "/etc/keepalived/change_to_master.sh"  #切换为master后,执行的脚本 

         #notify_backup "/etc/keepalived/change_to_backup.sh"

}

3、启动并测试

1、正常启动

2、故障切换

3nopreempt测试

 

猜你喜欢

转载自blog.csdn.net/weixin_40006394/article/details/80451697