1、Keepalived介绍
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。所以,Keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。
2、Keepalived核心功能
2.1、管理LVS负载均衡软件
早期的LVS软件,需要通过命令行或脚本实现管理,并且没有针对LVS节点的健康检查功能。为了解决LVS的这些使用不便的问题,就诞生了Keepalived,Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动、停止等功能,这使得LVS的应用更加简单方便了。
2.2、实现对LVS集群节点健康检查功能(healthcheck)
Keepalived可以通过在自身的keepalived.conf文件里配置LVS的节点IP和相关参数实现对LVS的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务时,Keepalived服务会自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复以后,Keepalived服务又会自动地把它们加入到正常转发队列中,对客户提供服务。
2.3、作为系统网络服务的高可用功能(failover)
Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡、Nginx反向代理这样的服务器。
3、Keepalived软件结构
- WatchDog:负载监控checkers和VRRP进程的状况
- VRRP Stack:负载负载均衡器之间的失败切换FailOver,如果只用一个负载均稀器,则VRRP不是必须的。
- Checkers:负责真实服务器的健康检查healthchecking,是keepalived最主要的功能。换言之,可以没有VRRP Stack,但健康检查healthchecking是一定要有的。
- IPVS wrapper:用户发送设定的规则到内核ipvs代码
- Netlink Reflector:用来设定vrrp的vip地址等。
4、文档适用范围
| 软件工具 | 支持版本 |
|---|---|
| Centos | 7.0+ |
| Keepalived | 2.0+ |
5、安装与配置Keepalivedd
5.1、下载安装
从官网下载keepalived的最新版本,本文以当前最新版本2.2.4为例。
$ cd /usr/local/src$ wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz$ tar -zxvf keepalived-1.2.24.tar.gz$ cd keepalived-1.2.24$ ./configure --prefix=/usr/local/keepalived$ make && make install
5.2、生成Keepalived配置文件
Keepalived安装完成后会生成如下目录结构
$ tree -l /usr/local/keepalived/etc-- keepalived| |-- keepalived.conf| `-- samples| |-- keepalived.conf.status_code| |-- keepalived.conf.track_interface| |-- keepalived.conf.vrrp| |-- 。。。|-- rc.d| `-- init.d| `-- keepalived`-- sysconfig`-- keepalived
拷贝配置文件
$ mkdir /etc/keepalived$ cp /usr/local/keepalived/etc/keepalived.conf /etc/keepalived/keepalived.conf$ cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived$ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
5.3、keepalived.conf配置文件说明
keepalived服务安装完成之后,后面的主要工作就是在keepalived.conf文件中配置HA和负载均衡。一个功能比较完整的常用的keepalived配置文件,主要包含三部分内容:
1、全局定义块
2、VRRP实例定义块
3、虚拟服务器定义块
全局定义块是必须的,如果keepalived只用来做ha,虚拟服务器是可选的。下面是一个功能比较完整的配置文件模板: ```json全局定义块
global_defs {
邮件通知配置
notification_email {
test@qq.com # 设置报警邮件地址,可多行每行一个。
} notification_email_from email # 设置邮件的发送地址 smtp_server 127.0.0.1 # 设置SMTP server地址 smtp_connect_timeout 30 # 设置SMTP超时时间
router_id string # 标识本节点的字符串,通常为hostname }
VRRP 实例定义块
vrrp_sync_group string { group { string } }
vrrp_instance VI_1 { # 定义一个vrrp实例,不同实例的实例编号不一样。 state MASTER|BACKUP # 定义在keepalived的角色MASTER表示为主服务器,BACKUP为备服务器。 virtual_router_id num # 虚拟路由标示,同一个实例里的路由标示相同,且唯一。MASTER和BACKUP的路由标识一样,且唯一。 interface string # 指定HA检测的网络接口 priority num # 定义此服务器在此虚拟路由器中的优先级,优先级大权限高 advert_int num # 检测时间间隔 authentication { # 设置验证类型和密码,主从的密码必须相同,要不两者不通讯。 auth_type PASS|AH auth_pass string }
virtual_ipaddress { # 设置虚拟IP地址,可以设置多个虚拟IP地址。
@IP
@IP
}
}
虚拟服务器定义块
virtual_server (@IP PORT)|(fwmark num) { delay_loop num lb_algo rr|wrr|lc|wlc|sh|dh|lblc lb_kind NAT|DR|TUN persistence_timeout num protocol TCP|UDP real_server @IP PORT { weight num notify_down /path/script.sh TCP_CHECK { connect_port num connect_timeout num } }
real_server @IP PORT {
weight num
MISC_CHECK {
misc_path /path_to_script/script.sh(or misc_path “/path_to_script/script.sh <arg_list>”)
}
}
real_server @IP PORT {
weight num
HTTP_GET|SSL_GET {
url {
digest alphanum
}
connect_port num
connect_timeout num
nb_get_retry num
delay_before_retry num
}
}
}
<a name="bzjvU"></a>
##### 5.3.1、全局定义块
1、email通知(notification_email、smtp_server、smtp_connect_timeout):用于服务有故障时发送邮件报警,可选项,不建议用。需要系统开启sendmail服务,建议用第三独立监控服务,如用nagios全面监控代替。<br />2、lvs_id:lvs负载均衡器标识,在一个网络内,它的值应该是唯一的。<br />3、router_id:用户标识本节点的名称,通常为hostname<br />4、花括号{}:用来分隔定义块,必须成对出现。如果写漏了,keepalived运行时不会得到预期的结果。由于定义块存在嵌套关系,因此很容易遗漏结尾处的花括号,这点需要特别注意。
<a name="S53q1"></a>
##### 5.3.2、VRRP实例定义块
vrrp_sync_group:同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪<br />group:至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致<br />vrrp_instance:vrrp实例名
<a name="JJOmO"></a>
##### 5.3.3、虚拟服务器virtual_server定义块
virtual_server:定义一个虚拟服务器,这个ip是virtual_ipaddress中定义的其中一个,后面一个空格,然后加上虚拟服务的端口号。<br />1> delay_loop:健康检查时间间隔,单位:秒<br />2> lb_algo:负载均衡调度算法,互联网应用常用方式为wlc或rr<br />3> lb_kind:负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。<br />4> persistence_timeout:http服务会话保持时间,单位:秒<br />5> protocol:转发协议,分为TCP和UDP两种<br />real_server:真实服务器IP和端口,可以定义多个<br />1> weight:负载权重,值越大,转发的优先级越高<br />2> notify_down:服务停止后执行的脚本<br />3> TCP_CHECK:服务有效性检测<br />* connect_port:服务连接端口<br />* connect_timeout:服务连接超时时长,单位:秒<br />* nb_get_retry:服务连接失败重试次数<br />* delay_before_retry:重试连接间隔,单位:秒
<a name="bwp5m"></a>
#### 5.4、配置开机启动
```bash
$ chkconfig keepalived on
$ service keepalived start #启动服务
$ service keepalived stop #停止服务
$ service keepalived restart #重启服务
检查服务进程是否启动
$ ps -ef | grep keepalived root 831 1 0 11:22 ? 00:00:00 keepalived -D root 840 831 0 11:22 ? 00:00:00 keepalived -D root 841 831 0 11:22 ? 00:00:00 keepalived -D检查Keepalived日志
- 主服务器日志
Jan 14 20:27:41 localhost Keepalived_vrrp[20840]: Opening file '/etc/keepalived/keepalived.conf'. Jan 14 20:27:41 localhost Keepalived_vrrp[20840]: Configuration is using : 36304 Bytes Jan 14 20:27:41 localhost Keepalived_vrrp[20840]: Using LinkWatch kernel netlink reflector... Jan 14 20:27:41 localhost Keepalived[20837]: Starting VRRP child process, pid=20840 Jan 14 20:27:41 localhost Keepalived_vrrp[20840]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(11,12)] Jan 14 20:27:42 localhost Keepalived_vrrp[20840]: VRRP_Instance(VI_1) Transition to MASTER STATE Jan 14 20:27:43 localhost Keepalived_vrrp[20840]: VRRP_Instance(VI_1) Entering MASTER STATE Jan 14 20:27:43 localhost Keepalived_vrrp[20840]: VRRP_Instance(VI_1) setting protocol VIPs. Jan 14 20:27:43 localhost Keepalived_vrrp[20840]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.41.249 Jan 14 20:27:43 localhost Keepalived_vrrp[20840]: Netlink reflector reports IP 192.168.41.249 added Jan 14 20:27:43 localhost avahi-daemon[3207]: Registering new address record for 192.168.41.249 on eth0. Jan 14 20:27:43 localhost Keepalived_healthcheckers[20839]: Netlink reflector reports IP 192.168.41.249 added Jan 14 20:27:44 localhost avahi-daemon[3207]: Invalid query packet. Jan 14 20:27:46 localhost last message repeated 8 times Jan 14 20:27:48 localhost Keepalived_vrrp[20840]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.41.249 Jan 14 20:27:48 localhost avahi-daemon[3207]: Invalid query packet.
- 主服务器日志
备服务器日志 ```bash
Jan 14 19:55:26 localhost Keepalived_vrrp[19423]: Opening file ‘/etc/keepalived/keepalived.conf’. Jan 14 19:55:26 localhost Keepalived_vrrp[19423]: Configuration is using : 36302 Bytes Jan 14 19:55:26 localhost Keepalived_vrrp[19423]: Using LinkWatch kernel netlink reflector… Jan 14 19:55:26 localhost Keepalived[19420]: Starting VRRP child process, pid=19423 Jan 14 19:55:26 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Entering BACKUP STATE Jan 14 19:55:26 localhost Keepalived_vrrp[19423]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(11,12)]
- 当主web服务器的keepalived停掉后,及主keepalived重新启动时的日志
```bash
Jan 14 20:25:57 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jan 14 20:25:58 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Entering MASTER STATE
Jan 14 20:25:58 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) setting protocol VIPs.
Jan 14 20:25:58 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.41.249
Jan 14 20:25:58 localhost Keepalived_vrrp[19423]: Netlink reflector reports IP 192.168.41.249 added
Jan 14 20:25:58 localhost Keepalived_healthcheckers[19422]: Netlink reflector reports IP 192.168.41.249 added
Jan 14 20:26:03 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.41.249
###主keepalived重新启动后
Jan 14 20:27:42 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Received higher prio advert
Jan 14 20:27:42 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) Entering BACKUP STATE
Jan 14 20:27:42 localhost Keepalived_vrrp[19423]: VRRP_Instance(VI_1) removing protocol VIPs.
