一、 Keepalived概述与安装
1、VRRP协议介绍
在介绍keepalived之前,不得不先介绍下一个协议——VRRP。之所以要介绍这个协议,是因为VRRP协议是keepalived实现的基础。下面先来一块看下这个这协议是干吗用的吧。
如上图所示,通常,同一网段内的所有主机都设置一条相同的、以网关为下一跳的缺省路由。主机发往其他网段的报文将通过缺省路由发往网关,再由网关进行转发,从而实现主机与外部网络的通信。当网关发生故障时,本网段内所有以网关为缺省路由的主机将无法与外部网络通信,仅能实现内部主机间通信。缺省路由为用户的配置操作提供了方便,但是对缺省网关设备提出了很高的稳定性要求。增加出口网关是提高系统可靠性的常见方法,此时如何在多个出口之间进行选路就成为需要解决的问题。而VRRP正好解决了此问题。
VRRP:Virtual Router Redundancy Protocol,虚拟路由冗余协议。VRRP说白了就是实现地址漂移的,是一种容错协议,在提高可靠性的同时,简化了主机的配置。该协议能够实现将可以承担网关功能的一组路由器加入到备份组中,形成一台虚拟路由器,由VRRP的选举机制决定哪台路由器承担转发任务,局域网内的主机只需将虚拟路由器配置为缺省网关。
在VRRP协议出现之前,为了不让单个路由器成为本地与外部通信的瓶颈,我们需要有多个路由,在此种模式下,我们内部的主机就需要将自己的网关指向不同的路由器,这样的配置对我们的网关管理员来说是很麻烦的,且不容易实现。在VRRP协议出现后,为了不让单个路由器成为本地与外部通信的瓶颈,我们仍需要有多个路由,但可以使用同一个缺省网关,我们只需将内部主机指定一个缺省网关即可。VRRP协议会根据优先级来选择一个正常的路由作为主路由器实现与外部的通信,而其他路由则作为备份路由不参与转发。在此模式下,多个路由器组成虚拟路由器组,物理上是多个路由器组成,但在逻辑上却是表现为只有一个路由。效果如下图所示:
在上图中,Router A、Router B和Router C组成一个虚拟路由器。各虚拟路由器都有自己的IP地址。局域网内的主机将虚拟路由器设置为缺省网关。Router A、Router B和Router 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 报文;否则认为接收到的报文是一个非法报文。
md5:MD5 认证。发送VRRP 报文的路由器利用认证字和MD5 算法对VRRP 报文进行摘要运算,运算结果保存在Authentication Header(认证头)中。收到VRRP 报文的路由器会利用认证字和MD5 算法进行同样的运算,并将运算结果与认证头的内容进行比较。如果相同,则认为接收到的报文是真实、合法的VRRP 报文;否则认为接收到的报文是一个非法报文。
在有多个路由器组成的虚拟路由中,当我们的内部主机很多时,如果所有主机都使用同一个master路由,会使得其他路由器很清闲,很浪费资源,我们期望我们本地的内部主机平分到各个路由器上,即让我们的内部主机的缺省网关指向不同的路由,从而减轻因只有一个master路由而造成网络带宽拥堵的负担。这就是负载分担VRRP。但这个如何实现呢?先看下面的配置效果图:
在此情况下,同一台路由器同时加入多个VRRP备份组,在不同备份组中有不同的优先级,从而实现负载分担。
在上图中,有三个备份组存在:
备份组1:对应虚拟路由器1。Router A作为Master路由器,Router B和Router C作为Backup路由器。
备份组2:对应虚拟路由器2。Router B作为Master路由器,Router A和Router C作为Backup路由器。
备份组3:对应虚拟路由器3。Router C作为Master路由器,Router A和Router B作为Backup路由器。
为了实现业务流量在RouterA、Router B和Router C之间进行负载分担,需要将局域网内的主机的缺省网关分别设置为虚拟路由器1、2和3。在配置优先级时,需要确保三个备份组中各路由器的VRRP优先级形成交叉对应。为了便于理解,我们假定有三个路由设备Router A、B、C和三台主机Host A、B、C,列举有在不同的虚拟路由组中。对路由器A来说,因在虚拟路由组1中Router A的优先级高于另外两个,因此,Router A 作为Router B 和Router C 作为B来说,因在虚拟路由器组2中Router B的优先级高于另外两个,因此,Router B 作为Router A 和Router C 作为Backup路由器;对路由器C来说,因在虚拟路由器组3中Router C的优先级高于另外两个,因此,Router C 作为Router A 和Router B 作为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体系结构
1、watchdog 负责监控checkers和vrrp进程的状况。
2、Checkers 负责真实服务器的健康监测,是keepalived最主要的功能,换一句话说,可以没有vrrp statck,但是健康检查healthcheckping一定要有。
3、Vrrp statck 负责负载均衡器之间失败切换failover。如果只用一个负载均衡器,则vrrp不是必须的。
4、Ipvs warpper是用来发送设定的规则封装到内核ipvs代码。
5、Netlink reflector 用来设定vrrp的vip地址等。
Keepalived功能十分强大,但是配置工作十分简单,keepalived各种功能的实现是通过设定配置文件keepalived.conf来完成的。
3、Keepalived的安装
①、安装keepalived
二进制编译安装三步骤:
l ./confgiure
l Make
l make install
②、问题汇总
问题汇总:
1.无gcc等编译工具
Yum install gcc gcc-c++
2.无openssl-devel支持
Yum install openssl-devel
3.无ipvs framework、ipvs 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/,下面三个目录
Keepalived、rc.d、sysconfig
③、启动设置
设置开机自启动:
[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
正在启动[确定]
[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,配置文件格式包含多个必填/可选的配置段,部分重要配置含义如下:
SMTP配置。
-vrrp_instance: vrrp实例配置。
-vrrp_script: 健康检查脚本配置。
细分下去,vrrp_instance配置段包括:
MASTER和一(多)个BACKUP。可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。
ID,有效范围为0-255。
MASTER用到,有效范围为0-255。
-advert_int: VRRP协议通告间隔。
VRRP多播协议包的网卡。节点固有IP(非VIP)的网卡,用来发VRRP包。
VRRP协议通告的本机IP地址。
-authentication: 认证方式。
-virtual_ipaddress: VIP。
-track_script: 健康检查脚本。
vrrp_script配置段包括:
0(成功)或非0(失败),keepalived以此为依据判断其监控的服务状态。
-interval: 健康检查周期。
-weight: 优先级变化幅度。
-fall: 判定服务异常的检查次数。
-rise: 判定服务正常的检查次数。
选举制度:
二、选举算法
keepalived中优先级高的节点为MASTER。MASTER其中一个职责就是响应VIP的arp包,将VIP和mac地址映射关系告诉局域网内其他主机,同时,它还会以多播的形式(目的地址224.0.0.18)向局域网中发送VRRP通告,告知自己的优先级。网络中的所有BACKUP节点只负责处理MASTER发出的多播包,当发现MASTER的优先级没自己高,或者没收到MASTER的VRRP通告时,BACKUP将自己切换到MASTER状态,然后做MASTER该做的事:1.响应arp包,2.发送VRRP通告。
MASTER和BACKUP节点的优先级如何调整?
首先,每个节点有一个初始优先级,由配置文件中的priority配置项指定,MASTER节点的priority应比BAKCUP高。运行过程中keepalived根据vrrp_script的weight设定,增加或减小节点优先级。规则如下:
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脚本执行失败,也比BACKUP的priority + weight大,就没法进行VIP漂移了。所以priority和weight值的设定应遵循: abs(MASTER priority – BAKCUP priority) < abs(weight)。
另外,当网络中不支持多播(例如某些云环境),或者出现网络分区的情况,keepalived BACKUP节点收不到MASTER的VRRP通告,就会出现脑裂(split brain)现象,此时集群中会存在多个MASTER节点。
目录:
全局配置
VRRP Group配置
VRRP Instance配置
LVS配置DR
LVS配置RS
2、全局配置
global_defs {
keepalived在发生切换时需要发送email到的对象,一行一个邮件地址
xuequn@163.com
}
notification_email_from xuequn@163.com #指定发件人
smtp服务器地址
smtp连接超时时间
keepalived机器的一个标识,必须唯一
}
3、VRRP Group配置
vrrp_sync_group VG_1{ #监控多个网段的实例
group {
1
2
}
master时,执行的脚本
backup时,执行的脚本
notify_fault "path/xx.sh VG_1" #故障时执行的脚本
notify /path/xx.sh
global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
4、VRRP Instance配置
vrrp_instance inside_network {
master,哪个为backup,如果设置了nopreempt这个值不起作用,主备靠priority决定
interface eth0 #设置实例绑定的网卡,这个网卡就是和对端通讯,用于选举用的
vrrp的interface错误(默认不设置)
track_interface{ #设置跟踪对象,里面哪个网卡出现问题都会切换,这里内外网有问题都会切换
eth0
eth1
}
primary ip
master状态后,延迟进行gratuitous ARP请求
ID标记,同一组为同一个值
master
1秒
backup主机上,而且这个主机优先级要比另外一台高
5分钟
debug #debug级别
authentication { #设置认证
auth_type PASS #认证方式
8个字符作为校验对象
}
vip
192.168.202.200
}
}
5、LVS配置DR
virtual_server 192.168.202.200 23 {
delay_loop 6 #健康检查时间间隔
rr|wrr|lc|wlc|lblc|sh|dh
NAT|DR|RUN
persistence_timeout 5 #会话保持时间
protocol TCP #使用的协议
255.255.255.0时表示一个段。
web服务器的虚拟主机(host:头)
realserver失效后启用
}
6、LVS配置RS
real_server 192.168.200.5 23 {
1,0为失效
0,而不是直接从ipvs中删除
server up后执行脚本
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,可以指定多个
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>
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 #脚本执行超时时间
0 正常,不修改;返回1,检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2
}
}
三、实战:
1、环境
如上图所示:
mater为proxy-master,keepalived的slave为proxy-slave。
要求:当mater出现问题时,主动切换到slave上。这里只是进行简单的主从切换展示,后续会有专门一节将zabbix proxy高可用方式。
2、配置文件
①、master的配置文件
cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
xuequn@kingsoft.com
}
notification_email_from zabbix@kingsoft.com
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 {
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"
backup后,执行的脚本
}
②、slave上的配置:
cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
xuequn@kingsoft.com
}
notification_email_from zabbix@kingsoft.com
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
}
master后,执行的脚本
#notify_backup "/etc/keepalived/change_to_backup.sh"
}
3、启动并测试
1、正常启动
2、故障切换
3、nopreempt测试