keepalived是什么:
keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。
但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现.
keepalived工作原理:
其工作在OSI的Layer3,4,7层。工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:
Layer3网络层:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被
非法关机
。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
Layer4传输层:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
Layer7应用层:Layer7就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
Layer3网络层:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被 非法关机 。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
Layer7应用层:Layer7就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。
core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
check负责健康检查,包括常见的各种检查方式。
vrrp模块是来实现VRRP协议的。
keepalived的配置文件:
keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是
global_defs、 故障时默认邮件发送 参数
static_ipaddress、 设置本节点的IP 如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置
static_routes、 设置本节点路由信息 如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置
vrrp_script、 用来做健康检查,检查失败时会将vrrp_instance的priority减少相应的值。
vrrp_instance 用来定义对外提供服务的VIP区域及其相关属性
virtual_server 一般在超大型的LVS中用到,一般LVS用不到,略过
全局配置又包括两个子配置
全局定义(global definition)
静态路由配置(static ipaddress/routes)
实战阶段:
配置范例
global_defs { notification_email 发生诸如切换操作时发送email通知邮件地址 可以多个每行一个 { admin@example.com } notification_email_from admin@example.com 发送通知邮件时邮件源地址是谁 smtp_server 127.0.0.1 发送email时使用的smtp服务器地址 stmp_connect_timeout 30 连接smtp连接超时时间 router_id node1 机器标识 节点名标识,主要用于通知中 }
2静态地址和路由配置范例
static_ipaddress { 10.210.214.163/24 brd 10.210.214.255 dev eth0 这里实际上和系统里面命令配置IP地址和路由一样 ... } static_routes { 10.0.0.0/8 via 10.210.214.1 dev eth0 ... }
以上分别表示启动/关闭keepalived时在本机执行的如下命令:
# /sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0 # /sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0 # /sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0 # /sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0
注意: 请忽略这两个区域,一般这个区域不需要配置,因为我坚信你的机器肯定已经配置了IP和路由。
二、VRRPD配置
VRRPD配置包括三个类
VRRP同步组(synchroization group)
VRRP实例(VRRP Instance)
VRRP脚本
1.VRRP同步组(synchroization group)配置范例
定义vrrp_intance组,使得这个组内成员动作一致。
例如两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。vrrp_sync_group VG_1 { group { http mysql } notify_master /path/to/to_master.sh 表示当切换到master状态时要执行的脚本 notify_backup /path_to/to_backup.sh 表示当切换到backup状态时要执行的脚本 notify_fault "/path/fault.sh VG_1" 表示出错状态时要执行的脚本 notify /path/to/notify.sh 表示任何状态切换时都调用该脚本,该脚本在以上三个脚本执行完成之后进行调用 smtp_alert 表示切换时给global defs中定义的邮件地址发送邮件通知 }
2.VRRP实例(instance)vrrp_instance http { state MASTER 实例初始状态(还要根据priority值确定)可以是MASTER 或 BACKUP
如果设置了nopreempt 则这个值不起作用,主从根据priority确定
interface eth0 实例节点固有IP(非VIP)的网卡,用来发VRRP包 dont_track_primary 忽略VRRP网卡错误。(默认未设置) track_interface { 监控以下网卡,如果任何一个不通就会切换到FALT状态。(可选项) eth0 eth1 } mcast_src_ip <IPADDR> vrrp组播包的源地址,默认源地址为master的IP 这里相当于heartbeat的心跳端口 garp_master_delay 10 当切为主状态后多久更新ARP缓存 virtual_router_id 51 虚拟路由标识 相同的VRID为一个组 他将决定多播的MAC地址 priority 100 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER 的优先级必须大于BACKUP。
这个选项的值最好高于其他机器50个点,该项范围是1-255
advert_int 1 检查间隔默认为1秒
authentication { 设置认证
auth_type PASS 认证方式可以是PASS或AH两种认证方式
autp_pass 1234 认证密码
}virtual_ipaddress { 设置虚拟IP 可以设置多个 #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL> 192.168.200.17/24 dev eth1 192.168.200.18/24 dev eth2 label eth2:1 }virtual_routes { 这里就是设置虚拟路由的地方了 # src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tab src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1 192.168.110.0/24 via 192.168.200.254 dev eth1 192.168.111.0/24 dev eth2 192.168.112.0/24 via 192.168.100.254 }nopreempt 允许一个priority比较低的节点作为master,即使有priority更高的节点启动(详见下文注意事项) preemtp_delay 300 抢占延迟 master启动多久之后进行接管资源(VIP/Route信息等), 前提是没有nopreempt选项 debug debug级别}3.VRRP脚本
告诉 keepalived 在什么情况下切换,所以尤为重要。可以有多个 vrrp_script
vrrp_script check_running {script "/usr/local/bin/check_running" 定义脚本名字 interval 10 脚本执行的间隔 weight -10 脚本执行的优先级 } 如果script中的指令执行失败,那么相应的vrrp_instance
的优先级会减少10个点
- 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
- 如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
- 其他情况,原本配置的优先级不变,即配置文件中priority对应的值。
注意事项: 设置state为 双备原理通常如果master服务死掉后backup会变成master,但是当master服务又好了的时候 master此时会抢占VIP,这样就会发生两次切换对业务繁忙的网站来说是不好的。 所以我们要在配置文件加入 nopreempt 非抢占 参数,但是这个参数只能用于state 为backup,故我们在用HA的时候最好master 和backup的state都设置成backup 让其通过priority来竞争。 这样加上nopreempt的时候,即使master又好了,依旧不会切换 。
state nopreempt priority 主机 backup 设置 100 从机 backup 不设置 50