文章大纲
前言
VRRP介绍
Keepalived详解
前言
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。我们都知道,在一个LVS集群中,虽然LVS能够对客户端的请求基于IP进行调度,但是LVS自身并不能提供高可靠性,即不能进行容错。并且LVS只能将客户端的服务基于某种调度算法调度至后端服务器进行处理,却不能检查后端服务器的状态,所以我们需要一个工具能够实现这些功能,而keepalived刚好能够提供这些功能,在keepalived与LVS配合组成高可用集群中(HAC),至少需要2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP(即LVS中的VIP),主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现,因此在介绍keepalived之前,先介绍一下VRRP的原理。
VRRP介绍
1 VRRP概念
VRRP是英文”Virtual Router Redundancy Protocol”的缩写,即虚拟路由冗余协议,他是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。VRRP具有如下优点:
简化网络管理。在具有多播或广播能力的局域网(如以太网)中,借助VRRP 能在某台设备出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息,也无需修改主机的默认网关配置。
适应性强。VRRP 报文封装在 IP 报文中,支持各种上层协议。
网络开销小。VRRP 只定义了一种报文——VRRP 通告报文,并且只有处于Master 状态的路由器可以发送 VRRP 报文。
2 VRRP工作过程
1) 虚拟路由器中的路由器根据优先级选举出 Master。Master 路由器通过发送免费 ARP 报文,将自己的虚拟 MAC 地址通知给与它连接的设备或者主机,从而承担报文转发任务;
2) Master 路由器周期性发送 VRRP 报文,以公布其配置信息(优先级等)和工作状况;
3) 如果 Master 路由器出现故障,虚拟路由器中的 Backup 路由器将根据优先级重新选举新的 Master;
4) 虚拟路由器状态切换时,Master 路由器由一台设备切换为另外一台设备,新的 Master路由器只是简单地发送一个携带虚拟路由器的 MAC 地址和虚拟 IP地址信息的免费 ARP报文,这样就可以更新与它连接的主机或设备中的ARP 相关信息。网络中的主机感知不到Master 路由器已经切换为另外一台设备。
5) Backup 路由器的优先级高于 Master 路由器时,由 Backup 路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举 Master。
终上所述,为了保证Master路由器和Backup路由器能够协调工作,VRRP需要实现以下功能:
Master 路由器的选举;
Master 路由器状态的通告;
同时,为了提高安全性,VRRP 还提供了认证功能;
3 MSTER选举方式
VRRP根据优先级来确定虚拟路由器中每台路由器的角色(Master路由器或Backup路由器)。优先级越高,则越有可能成为Master路由器。初始创建的路由器工作在Backup状态,通过VRRP报文的交互获知虚拟路由器中其他成员的优先级:
如果 VRRP 报文中 Master 路由器的优先级高于自己的优先级,则路由器保持在 Backup 状态;
如果 VRRP 报文中 Master 路由器的优先级低于自己的优先级,采用抢占工作方式的路由器将抢占成为 Master 状态,周期性地发送 VRRP 报文,采用非抢占工作方式的路由器仍保持 Backup 状态;
如果在一定时间内没有收到 VRRP 报文,则路由器切换为 Master
VRRP优先级的取值范围为0到255(数值越大表明优先级越高),可配置的范围是1到254,优先级0为系统保留给路由器放弃Master位置时候使用,255则是系统保留给IP地址拥有者使用。当路由器为IP地址拥有者时,其优先级始终为255。因此,当虚拟路由器内存在IP地址拥有者时,只要其工作正常,则为Master路由器。
4 VRRP的三种认证方式
无认证:不进行任何 VRRP 报文的合法性认证,不提供安全性保障。
简单字符认证:在一个有可能受到安全威胁的网络中,可以将认证方式设置为简单字符认证。发送 VRRP 报文的路由器将认证字填入到 VRRP 报文中,而收到 VRRP 报文的路由器会将收到的 VRRP 报文中的认证字和本地配置的认证字进行比较。如果认证字相同,则认为接收到的报文是合法的 VRRP 报文;否则认为接收到的报文是一个非法报文。
MD5 认证:在一个非常不安全的网络中,可以将认证方式设置为 MD5 认证。发送 VRRP 报文的路由器利用认证字和 MD5 算法对 VRRP 报文进行加密,加密后的报文保存在 Authentication Header(认证头)中。收到 VRRP报文的路由器会利用认证字解密报文,检查该报文的合法性。
Keepalived
1 keepalived工作原理
Keepalived是基于vrrp的原理开发的可实现高可用的服务软件,并且就有health-check功能,可以使用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能;keepalived在VRRP虚拟路由冗余协议为基础实现高可用,也可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。下面是官方给出的KeepAlived组件图
由上图可以看出,keepalived也是模块化设计,不同模块实现不同的功能,它主要有三个模块,分别是core、check和VRRP,其中:
core模块:为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析;
check模块:负责健康检查,包括常见的各种检查方式;
VRRP模块:是来实现VRRP协议的。
system call:系统调用
watch dog:监控check和vrrp进程的管理进程,他是用来对check和vrrp进程实现高可用的。
checkers:负责检测器子进程的健康状态,当其检测到master上的服务不可用时则通告vrrp将其转移至backup服务器上。
2 keepalived作用
Keepalived主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
3 keepalived配置文件
Keepalived是一个相对轻量级的服务,而且与LVS配合的非常好,它只有一个配置文件,主要包括global_defs、static_ipaddress、static_routes、VRRP_script、VRRP_instance和virtual_server的设置,而这个这些配置又可分为三大类:全局配置,VRRP的配置以及LVS配置。
1)全局配置
global_defs { # Block id notification_email { [email protected] # 指明接收keepalived信息的邮箱 ... } notification_email_from [email protected] # 邮箱名 smtp_server 127.0.0.1 # 收邮件的主机地址 smtp_connect_timeout 30 # integer, seconds router_id my_hostname # 一个标记该主机的字符串,可以不是主机名,建议使用主机名 vrrp_mcast_group4 224.0.0.18 # 多播组地址, 默认是 224.0.0.18 vrrp_mcast_group6 ff02::12 # ipv6多播组地址, 默认是 ff02::12 enable_traps # 启用SNMP陷阱,可以不启用 }
2)VRRP配置
VRRPD配置包括三个类:VRRP同步组(synchroization group)、VRRP实例(VRRP Instance)、VRRP脚本
******VRRP instance(s)******* # describes the moveable IP for each instance of a group in vrrp_sync_group. Here are described two IPs # (on inside_network and on outside_network), on machine "my_hostname", which belong to the group VG_1 and which # will transition together on any state change. vrrp_instance inside_network { state MASTER # interface eth0 # use_vmac# Use VRRP Virtual MAC. # vmac_xmit_base # VMAC interface dont_track_primary # track_interface { eth0 eth1 ... } mcast_src_ip # 多播组源ip unicast_src_ip unicast_peer { ... } lvs_sync_daemon_interface eth1 garp_master_delay 10 # secs, default 5 virtual_router_id 51 priority 100 # 优先级 advert_int 1 authentication { # 认证信息模块 auth_type PASS auth_pass 1234 # 认证密码,建议使用"openssl rand -hex 4"生成8位随机密码 } virtual_ipaddress { # vrrp实例 / brd dev scope label
3)LVS配置
如果你没有配置LVS+keepalived,那么无需配置这段区域,如果你用的是nginx来代替LVS,这无需配置这项,这里的LVS配置是专门为keepalived+LVS集成准备的。它是用keepalived的配置文件来代替ipvsadm来配置LVS,并不是利用ipvsadm来配置,这样会方便很多,一个配置文件搞定这些,维护也方便。这里LVS配置也有两个配置:一个是集群的定义,即VIP指定;二是添加真实服务器地址。
************Virtual server(s)*********** fwmark#防火墙标记,如果你是基于防火墙标记的LVS需要设置这一项 virtual_server group string { # 配置虚拟服务器,可以是virtual_server IP port | virtual_server fwmark int delay_loop # delay timer for service polling lb_algo rr|wrr|lc|wlc|lblc|sh|dh # LVS scheduler ops # Enable One-Packet-Scheduling for UDP (-O in ipvsadm) lb_kind NAT|DR|TUN # LVS forwarding method persistence_timeout # LVS persistence timeout, sec persistence_granularity # LVS granularity mask (-M in ipvsadm) protocol TCP # Only TCP is implemented ha_suspend # If VS IP address is not set,suspend healthchecker's activity virtualhost # VirtualHost string for HTTP_GET or SSL_GET,eg virtualhost www.firewall.loc alpha omega quorum hysteresis quorum_up | quorum_down | sorry_server # RS to add when all realservers are down real_server { weight # relative weight to use, default: 1 notify_up | notify_down | HTTP_GET|SSL_GET { # 如果是http则选择HTTP_GET,https时选择SSL_GET url { # 做做健康性检查时访问的url,可以定多个url digest # A url to test can have multiple entries here status_code # status code returned in the HTTP headereg status_code 200 } delay_before_retry # 失败后判断为宕机的延时 connect_ip # 连接IP地址 connect_port # 连接端口 bindto bind_port connect_timeout # 连接超时时间 fwmark warmup } TCP_CHECK { # 基于TCP_CHECK的健康性检测模块定义 connect_ip connect_port bindto bind_port connect_timeout fwmark warmup } SMTP_CHECK { # 基于邮件服务的健康性检查模块 host { connect_ip connect_port bindto bind_port connect_timeout fwmark } retry delay_before_retry helo_name | warmup } MISC_CHECK { misc_path | misc_timeout warmup misc_dynamic } } }
本章小结
上面分析几乎所有keepalived.conf的配置信息,有些地方我直接援引的官方说明,而没有翻译,我感觉英文说的更为准确。当然还有一些选项没有做详细的说明,我会在随后的文章中加以说明,接下来的文章会从实例出发,从实际案例中领悟这些指令的含义,当然了,在实际生产中并不是所有的指令都会使用,我们会选取最主要的进行定义,那时在看就会想得很轻松。