[一]Keepalived——Keepalived从安装到配置

一、什么是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,其中:

  • core模块:为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析;
  • check:负责健康检查,包括常见的各种检查方式;
  • VRRP模块:是来实现VRRP协议的。

在Keepalived当中IPVS模块是可配置的,如果需要负载均衡功能,可以在编译Keepalived时开打负载均衡功能,也可以通过编译参数关闭。

**内核空间(Kernel Space):**NetLINK模块主要用于实现一些高级路由框架和一些相关参数的网络功能,完成用户空间层Netlink Reflector模块发来的各种网络请求。

**用户空间层(User Space):**这个图我们可以看到用户空间层,是建立在内核空间层(Kernel Space)之上的,主要有4个部分:

  • Scheduler I/O Multiplexer 是一个I/O复用分发调度器,它负载安排Keepalived所有内部的任务请求。
  • Memory Mngt 是一个内存管理机制,这个框架提供了访问内存的一些通用方法。
  • Control Plane 是keepalived的控制版面,可以实现对配置文件编译和解析。
  • Core componets 为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析。

  Core componets 又包括5个部分:

  • Watchdog:是计算机可靠领域中极为简单又非常有效的检测工具,Keepalived正是通过它监控Checkers和VRRP进程的。
  • Checkers: 这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离。
  • VRRP Stack: 这时keepalived后来引用VRRP功能,可以实现HA集群中失败切换功能。
  • IPVS wrapper: 这个是IPVS功能的一个实现,IPVS warrper模块将可以设置好的IPVS规则发送的内核空间并且提供给IPVS模块,最终实现IPVS模块的负载功能。
  • Netlink Reflector:用来实现高可用集群Failover时虚拟IP(VIP)的设置和切换 ,Netlink Reflector的所有请求最后都发送到内核空间层的NETLINK 模块来完成。

注意,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,当Keepalived不够用的时候才选择Heartbeat
  •     lvs的高可用建议用Keepavlived
  •     业务的高可用用Heartbeat

五、Keepalived安装和配置

   (一)下载

    官方地址:http://www.keepalived.org/download.html  当前最新版本 2.0.10

  (二)解压、编译、安装

1[root@localhost local]# tar zxvf keepalived-2.0.10.tar.gz //解压 2[root@localhost local]# cd keepalived-2.0.10 3[root@localhost keepalived-2.0.10]# ./configure --prefix=/usr/local/keepalived 4[root@localhost keepalived-2.0.10]# make 5[root@localhost keepalived-2.0.10]# make install 6

  (三)配置

    安装完成后,进入安装目录的etc目录下,将keepalived相应的配置文件拷贝到系统相应的目录当中。keepalived启动时会从/etc/keepalived目录下查找keepalived.conf配置文件,如果没有找到则使用默认的配置。/etc/keepalived目录安装时默认是没有安装的,需要手动创建。配置文件目录结构如下:

1[root@localhost etc]# tree -l keepalived/ sysconfig/ 2keepalived/ 3├── keepalived.conf 4└── samples 5 ├── client.pem 6 ├── dh1024.pem 7 ├── keepalived.conf.conditional_conf 8 ├── keepalived.conf.fwmark 9 ├── keepalived.conf.HTTP_GET.port 10 ├── keepalived.conf.inhibit 11 ├── keepalived.conf.IPv6 12 ├── keepalived.conf.misc_check 13 ├── keepalived.conf.misc_check_arg 14 ├── keepalived.conf.quorum 15 ├── keepalived.conf.sample 16 ├── keepalived.conf.SMTP_CHECK 17 ├── keepalived.conf.SSL_GET 18 ├── keepalived.conf.status_code 19 ├── keepalived.conf.track_interface 20 ├── keepalived.conf.virtualhost 21 ├── keepalived.conf.virtual_server_group 22 ├── keepalived.conf.vrrp 23 ├── keepalived.conf.vrrp.localcheck 24 ├── keepalived.conf.vrrp.lvs_syncd 25 ├── keepalived.conf.vrrp.routes 26 ├── keepalived.conf.vrrp.rules 27 ├── keepalived.conf.vrrp.scripts 28 ├── keepalived.conf.vrrp.static_ipaddress 29 ├── keepalived.conf.vrrp.sync 30 ├── root.pem 31 ├── sample.misccheck.smbcheck.sh 32 └── sample_notify_fifo.sh 33sysconfig/ 34└── keepalived 35 361 directory, 30 files 37 38

将配置文件拷贝到系统对应的目录下:

1[root@localhost ~]# mkdir /etc/keepalived/ 2[root@localhost ~]# cp /usr/local/keepalived/etc/keepalived.conf 3 /etc/keepalived/keepalived.conf 4[root@localhost ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived 5 /etc/sysconfig/keepalived 6

配置文件说明:

1! Configuration File for keepalived 2 3global_defs { 4 notification_email { #指定Keepalived在发生事情的时候,发送邮件通知,每行一个地址 5 acassen@firewall.loc 6 failover@firewall.loc 7 sysadmin@firewall.loc 8 } 9 notification_email_from Alexandre.Cassen@firewall.loc #指定发件人 10 smtp_server 192.168.200.1 #发送email的smtp地址 11 smtp_connect_timeout 30 #超时时间 12 router_id LVS_DEVEL #运行Keepalived的机器标识号,主从机必须不同 13 vrrp_skip_check_adv_addr #注释掉vrrp_strict相关可以解决虚拟ip,ping不通的问题 14 vrrp_strict 15 vrrp_garp_interval 0 16 vrrp_gna_interval 0 17} 18 19vrrp_instance VI_1 { 20 state MASTER 21 interface ens33 #物理网卡名称,主节点和备节点需要相同 22 virtual_router_id 51 #唯一的id,主从机必须相同 23 priority 100 #优先级,主节点大于备节点,建议至少相差50 24 advert_int 1 #通信检查间隔时间1s 25 authentication { 26 auth_type PASS 27 auth_pass 1111 28 } 29 virtual_ipaddress { 30 192.168.200.16 #虚拟ip,会绑定在ens33网卡,官方默认配置 31 192.168.200.17 #虚拟ip,会绑定在ens33网卡,官方默认配置 32 192.168.200.18 #虚拟ip,会绑定在ens33网卡,官方默认配置 33 } 34} 35#虚拟服务器 36virtual_server 192.168.200.100 443 { 37 delay_loop 6 #健康检查时间间隔,单位:秒 38 lb_algo rr #负载均衡调度算法,互联网应用常用方式为wlc或rr 39 lb_kind NAT #负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。 40 persistence_timeout 50 #http服务会话保持时间,单位:秒 41 protocol TCP #转发协议,分为TCP和UDP两种 42 #真实服务器 43 real_server 192.168.201.100 443 { 44 weight 1 #负载权重,值越大,转发的优先级越高 45 SSL_GET { 46 url { 47 path / 48 digest ff20ad2481f97b1754ef3e12ecd3a9cc 49 } 50 url { 51 path /mrtg/ 52 digest 9b3a0c85a887a256d6939da88aabd8cd 53 } 54 connect_timeout 3 55 retry 3 56 delay_before_retry 3 57 } 58"/etc/keepalived/keepalived.conf" 159L, 3581C 59

(三)运行、停止、重启

1[root@localhost ~]# cd /usr/local/keepalive/sbin/ 2[root@localhost sbin]# systemctl start keepalived 3#========启动后,可以通过以下命令来查看是否安装正确,启动后有3个keepalive进程表示正确==========: 4[root@localhost sbin]# ps -ef | grep keepalive 5root 44931 1 0 19:22 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D 6root 44932 44931 0 19:22 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D 7root 44933 44931 0 19:22 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D 8root 87557 108463 0 20:00 pts/5 00:00:00 grep --color=auto keepalive 9#========ifconfig只能查看物理网卡,ip addr或者ip a才能看见虚拟ip============================ 10[root@localhost sbin]# ip addr 111: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 12 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 13 inet 127.0.0.1/8 scope host lo 14 valid_lft forever preferred_lft forever 15 inet6 ::1/128 scope host 16 valid_lft forever preferred_lft forever 172: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 18 link/ether 00:0c:29:2e:ca:93 brd ff:ff:ff:ff:ff:ff 19 inet 192.168.7.248/24 brd 192.168.7.255 scope global noprefixroute dynamic ens33 20 valid_lft 14115sec preferred_lft 14115sec 21 inet 192.168.200.16/32 scope global ens33 #======默认虚拟IP 22 valid_lft forever preferred_lft forever 23 inet 192.168.200.17/32 scope global ens33 #======默认虚拟IP 24 valid_lft forever preferred_lft forever 25 inet 192.168.200.18/32 scope global ens33 #======默认虚拟IP 26 valid_lft forever preferred_lft forever 27 inet6 fe80::6c64:1b21:8af2:b124/64 scope link noprefixroute 28 valid_lft forever preferred_lft forever 293: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 30 link/ether 52:54:00:47:22:fd brd ff:ff:ff:ff:ff:ff 31 inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 32 valid_lft forever preferred_lft forever 334: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 34 link/ether 52:54:00:47:22:fd brd ff:ff:ff:ff:ff:ff 35 36

停止

1[root@localhost sbin]# systemctl stop keepalived 2[root@localhost sbin]# ps -ef | grep keepalive 3root 94210 108463 0 20:06 pts/5 00:00:00 grep --color=auto keepalive 4

重启

1[root@localhost sbin]# ps -ef | grep keepalive 2root 94210 108463 0 20:06 pts/5 00:00:00 grep --color=auto keepalive 3[root@localhost sbin]# systemctl restart keepalived 4[root@localhost sbin]# ps -ef | grep keepalive 5root 95392 1 0 20:07 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D 6root 95393 95392 0 20:07 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D 7root 95394 95392 0 20:07 ? 00:00:00 /usr/local/keepalive/sbin/keepalived -D 8root 95467 108463 0 20:07 pts/5 00:00:00 grep --color=auto keepalive 9

 

 

代码交流 2021