一、什么是keepalived?
官方网站是这么说的:Keepalived是一个用C语言编写的路由软件。该项目的主要目标是为Linux系统和基于Linux的基础架构提供简单而强大的负载均衡和高可用性设施。 负载平衡框架依赖于众所周知且广泛使用的Linux虚拟服务器(IPVS )内核模块,提供Layer4负载均衡。Keepalived实现了一组检查程序,以根据其运行状况动态地和自适应地维护和管理负载均衡的服务器池。另一方面,VRRP实现了高可用性协议。VRRP是路由器故障转移的基础。此外,Keepalived为VRRP有限状态机实现了一组挂钩,提供低级和高速协议交互。Keepalived框架可以单独使用,也可以一起使用,以提供灵活的基础架构。
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。Keepalived借助于第三方模块IPVS就可以很方便地搭建一套负载均衡系统,在这里有个误区,由于Keepalived可以和IPVS一起很好的工作,以为Keepalived就是一个负载均衡软件,这种理解是错误。
后来Keepalived又加入了VRRP的功能,VRRP出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能,下面介绍一下VRRP协议实现的过程。
关键词:IPVS (IP Virtual Server) 是运行在LVS下的提供负载平衡功能的一种技术。
关键词:LVS(Linux Virtual Server),虚拟服务器是一个高度可扩展性和高可用性的服务器,建立在一个集群的服务器中。服务器集群的架构对用户是完全透明的,并且用户使用起来感觉它只有一个高性能虚拟服务器。
因为LVS的IP负载平衡技术就是通过IPVS模块来实现的,所以IPVS是LVS的关键,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
关键词:虚拟路由冗余协议(Virtual Router Redundancy Protocol VRRP) 具体可参考 http://blog.51cto.com/billy98/2064252
二、Keepalived工作原理和体系结构
keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能;keepalived是以VRRP虚拟路由冗余协议为基础实现高可用的,可以认为是实现路由器高可用的协议,即将N台提供相同功能的物理路由器组成一个虚拟路由器,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived也是模块化设计,不同模块复杂不同的功能,它主要有三个模块,分别是core、check和VRRP,其中:
在Keepalived当中IPVS模块是可配置的,如果需要负载均衡功能,可以在编译Keepalived时开打负载均衡功能,也可以通过编译参数关闭。
内核空间(Kernel Space):NetLINK模块主要用于实现一些高级路由框架和一些相关参数的网络功能,完成用户空间层Netlink Reflector模块发来的各种网络请求。
用户空间层(User Space):这个图我们可以看到用户空间层,是建立在内核空间层(Kernel Space)之上的,主要有4个部分:
Core componets 又包括5个部分:
注意,keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
keepalived正常启动的时候,共启动3个进程:
一个是父进程,负责监控其子进程;一个是VRRP子进程,另外一个是checkers子进程;两个子进程都被系统watchlog看管,两个子进程各自负责复杂自己的事。
Healthcheck子进程检查各自服务器的健康状况,,例如http,LVS。如果healthchecks进程检查到master上服务不可用了,就会通知本机上的VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。
三、Keepalived的用途
Keepalived主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
四、Keepalived和Heartbeat之间的对比
( 一)Keepalived使用更简单:从安装、配置、使用、维护等角度上对比,Keepalived都比Heartbeat要简单得多,尤其是Heartbeat2.1.4后拆分成3个子项目,安装、配置、使用都比较复杂,尤其是出问题的时候,都不知道具体是哪个子系统出问题了;而Keepalived只有1个安装文件、1个配置文件,配置文件也简单很多;
(二)Heartbeat功能更强大:Heartbeat虽然复杂,但功能更强大,配套工具更全,适合做大型集群管理,而Keepalived主要用于集群倒换,基本没有管理功能;
( 三)协议不同:Keepalived使用VRRP协议进行通信和选举,Heartbeat使用心跳进行通信和选举;Heartbeat除了走网络外,还可以通过串口通信,貌似更可靠;
Keepalived使用的vrrp协议方式,虚拟路由冗余协议 ;Heartbeat是基于主机或网络的服务的高可用方式;
Keepalived的目的是模拟路由器的双机;Heartbeat的目的是用户service的双机
(四)使用方式基本类似:如果要基于两者设计高可用方案,最终都要根据业务需要写自定义的脚本,Keepalived的脚本没有任何约束,随便怎么写都可以;Heartbeat的脚本有约束,即要支持service start/stop/restart这种方式,而且Heartbeart提供了很多默认脚本,简单的绑定ip,启动apache等操作都已经有了;
使用建议:
五、Keepalived安装和配置
(一)下载
官方地址:http://www.keepalived.org/download.html 当前最新版本 2.0.10
(二)解压、编译、安装
[root@localhost local]# tar zxvf keepalived-2.0.10.tar.gz //解压
[root@localhost local]# cd keepalived-2.0.10
[root@localhost keepalived-2.0.10]# ./configure --prefix=/usr/local/keepalived
[root@localhost keepalived-2.0.10]# make
[root@localhost keepalived-2.0.10]# make install
(三)配置
安装完成后,进入安装目录的etc目录下,将keepalived相应的配置文件拷贝到系统相应的目录当中。keepalived启动时会从/etc/keepalived目录下查找keepalived.conf配置文件,如果没有找到则使用默认的配置。/etc/keepalived目录安装时默认是没有安装的,需要手动创建。配置文件目录结构如下:
[root@localhost etc]# tree -l keepalived/ sysconfig/
keepalived/
├── keepalived.conf
└── samples
├── client.pem
├── dh1024.pem
├── keepalived.conf.conditional_conf
├── keepalived.conf.fwmark
├── keepalived.conf.HTTP_GET.port
├── keepalived.conf.inhibit
├── keepalived.conf.IPv6
├── keepalived.conf.misc_check
├── keepalived.conf.misc_check_arg
├── keepalived.conf.quorum
├── keepalived.conf.sample
├── keepalived.conf.SMTP_CHECK
├── keepalived.conf.SSL_GET
├── keepalived.conf.status_code
├── keepalived.conf.track_interface
├── keepalived.conf.virtualhost
├── keepalived.conf.virtual_server_group
├── keepalived.conf.vrrp
├── keepalived.conf.vrrp.localcheck
├── keepalived.conf.vrrp.lvs_syncd
├── keepalived.conf.vrrp.routes
├── keepalived.conf.vrrp.rules
├── keepalived.conf.vrrp.scripts
├── keepalived.conf.vrrp.static_ipaddress
├── keepalived.conf.vrrp.sync
├── root.pem
├── sample.misccheck.smbcheck.sh
└── sample_notify_fifo.sh
sysconfig/
└── keepalived
1 directory, 30 files
将配置文件拷贝到系统对应的目录下:
[root@localhost ~]# mkdir /etc/keepalived/
[root@localhost ~]# cp /usr/local/keepalived/etc/keepalived.conf
/etc/keepalived/keepalived.conf
[root@localhost ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived
/etc/sysconfig/keepalived
配置文件说明:
! Configuration File for keepalived
global_defs {
notification_email { #指定Keepalived在发生事情的时候,发送邮件通知,每行一个地址
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected] #指定发件人
smtp_server 192.168.200.1 #发送email的smtp地址
smtp_connect_timeout 30 #超时时间
router_id LVS_DEVEL #运行Keepalived的机器标识号,主从机必须不同
vrrp_skip_check_adv_addr #注释掉vrrp_strict相关可以解决虚拟ip,ping不通的问题
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33 #物理网卡名称,主节点和备节点需要相同
virtual_router_id 51 #唯一的id,主从机必须相同
priority 100 #优先级,主节点大于备节点,建议至少相差50
advert_int 1 #通信检查间隔时间1s
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16 #虚拟ip,会绑定在ens33网卡,官方默认配置
192.168.200.17 #虚拟ip,会绑定在ens33网卡,官方默认配置
192.168.200.18 #虚拟ip,会绑定在ens33网卡,官方默认配置
}
}
#虚拟服务器
virtual_server 192.168.200.100 443 {
delay_loop 6 #健康检查时间间隔,单位:秒
lb_algo rr #负载均衡调度算法,互联网应用常用方式为wlc或rr
lb_kind NAT #负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。
persistence_timeout 50 #http服务会话保持时间,单位:秒
protocol TCP #转发协议,分为TCP和UDP两种
#真实服务器
real_server 192.168.201.100 443 {
weight 1 #负载权重,值越大,转发的优先级越高
SSL_GET {
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
retry 3
delay_before_retry 3
}
"/etc/keepalived/keepalived.conf" 159L, 3581C
(三)运行、停止、重启
[root@localhost ~]# cd /usr/local/keepalive/sbin/
[root@localhost sbin]# systemctl start keepalived
#========启动后,可以通过以下命令来查看是否安装正确,启动后有3个keepalive进程表示正确==========:
[root@localhost sbin]# ps -ef | grep keepalive
root 44931 1 0 19:22 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D
root 44932 44931 0 19:22 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D
root 44933 44931 0 19:22 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D
root 87557 108463 0 20:00 pts/5 00:00:00 grep --color=auto keepalive
#========ifconfig只能查看物理网卡,ip addr或者ip a才能看见虚拟ip============================
[root@localhost sbin]# ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:2e:ca:93 brd ff:ff:ff:ff:ff:ff
inet 192.168.7.248/24 brd 192.168.7.255 scope global noprefixroute dynamic ens33
valid_lft 14115sec preferred_lft 14115sec
inet 192.168.200.16/32 scope global ens33 #======默认虚拟IP
valid_lft forever preferred_lft forever
inet 192.168.200.17/32 scope global ens33 #======默认虚拟IP
valid_lft forever preferred_lft forever
inet 192.168.200.18/32 scope global ens33 #======默认虚拟IP
valid_lft forever preferred_lft forever
inet6 fe80::6c64:1b21:8af2:b124/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: virbr0: mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:47:22:fd brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:47:22:fd brd ff:ff:ff:ff:ff:ff
停止
[root@localhost sbin]# systemctl stop keepalived
[root@localhost sbin]# ps -ef | grep keepalive
root 94210 108463 0 20:06 pts/5 00:00:00 grep --color=auto keepalive
重启
[root@localhost sbin]# ps -ef | grep keepalive
root 94210 108463 0 20:06 pts/5 00:00:00 grep --color=auto keepalive
[root@localhost sbin]# systemctl restart keepalived
[root@localhost sbin]# ps -ef | grep keepalive
root 95392 1 0 20:07 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D
root 95393 95392 0 20:07 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D
root 95394 95392 0 20:07 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D
root 95467 108463 0 20:07 pts/5 00:00:00 grep --color=auto keepalive