ITPub博客

首页 > Linux操作系统 > Linux操作系统 > keepalived原理及配置文件详解

keepalived原理及配置文件详解

原创 Linux操作系统 作者:lhrbest 时间:2020-02-20 19:40:18 0 删除 编辑

keepalived原理及配置文件详解



1   KeepAlived 的安装

下载:

http://www.keepalived.org/software/

http://rpmfind.net/linux/rpm2html/search.php?query=keepalived&submit=%E6%90%9C%E7%B4%A2...+&system=&arch=

 

安装Keepalived 并将其配置成系统服务。 master1 master2 两台机器上同样进行如下操作:

yum install -y openssl-devel
cd /soft
wget http://www.keepalived.org/software/keepalived-2.0.19.tar.gz
tar -zvxf keepalived-2.0.19.tar.gz
cd keepalived-2.0.19
./configure --prefix=/usr/local/keepalived
make && make install
 
--或:yum install -y keepalived
 
 
cp /soft/keepalived-2.0.19/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
echo "/etc/init.d/keepalived start" >> /etc/rc.local
chkconfig keepalived on
systemctl enable keepalived.service


 

编译完成后:

[root@rhel6lhr keepalived-2.0.19]$ ./configure --prefix=/usr/local/keepalived
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
。。。。。。。。。。。。。。。。。。。。。
checking whether SCHED_RESET_ON_FORK is declared... yes
checking for sphinx-build... No
checking for rpm... Yes
checking for rpmbuild... No
 
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating keepalived/Makefile
config.status: creating lib/Makefile
config.status: creating keepalived/core/Makefile
config.status: creating keepalived.spec
config.status: creating genhash/Makefile
config.status: creating keepalived/check/Makefile
config.status: creating keepalived/vrrp/Makefile
config.status: creating keepalived/bfd/Makefile
config.status: creating doc/Makefile
config.status: creating bin_install/Makefile
config.status: creating keepalived/dbus/Makefile
config.status: creating keepalived/etc/Makefile
config.status: creating keepalived/etc/init/Makefile
config.status: creating keepalived/etc/init.d/Makefile
config.status: creating doc/man/man8/Makefile
config.status: creating lib/config.h
config.status: creating lib/config_warnings.h
config.status: executing depfiles commands
 
Keepalived configuration
------------------------
Keepalived version       : 2.0.19
Compiler                 : gcc
Preprocessor flags       : -D_GNU_SOURCE
Compiler flags           : -g -g -O2 -Wall -Wextra -Wunused -Wstrict-prototypes -Wbad-function-cast -Wcast-align -Wcast-qual -Wdisabled-optimization -Wfloat-equal -Wformat-security -Wframe-larger-than=5120 -Winit-self -Winline -Wlogical-op -Wmissing-declarations -Wmissing-field-initializers -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Woverlength-strings -Wpointer-arith -Wredundant-decls -Wshadow -Wstack-protector -Wstrict-overflow=4 -Wstrict-prototypes -Wsync-nand -Wundef -Wuninitialized -Wunknown-pragmas -Wunused-macros -Wvariadic-macros -Wwrite-strings -fPIE -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions --param=ssp-buffer-size=4 -O2
Linker flags             : -pie -Wl,-z,relro -Wl,-z,now
Extra Lib                : -lm -lcrypto -lssl
Use IPVS Framework       : Yes
IPVS use libnl           : No
IPVS syncd attributes    : No
IPVS 64 bit stats        : No
HTTP_GET regex support   : No
fwmark socket support    : Yes
Use VRRP Framework       : Yes
Use VRRP VMAC            : Yes
Use VRRP authentication  : Yes
With ip rules/routes     : Yes
With track_process       : Yes
With linkbeat            : Yes
Use BFD Framework        : No
SNMP vrrp support        : No
SNMP checker support     : No
SNMP RFCv2 support       : No
SNMP RFCv3 support       : No
DBUS support             : No
SHA1 support             : No
Use JSON output          : No
libnl version            : None
Use IPv4 devconf         : No
Use iptables             : Yes
Use libiptc              : No
Use libipset             : No
Use nftables             : No
init type                : upstart
Strict config checks     : No
Build genhash            : Yes
Build documentation      : No
 
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

 

Use IPVS Framework IPVS 框架一 也 即 LVS 的核心代码框架,如果不

使用LVS ,可以在 configure 时指定参数 disable-lus, 这样的话,这里看

到的就是No 而不是 Yes

IPVS sync daemon support IPVS 同步进程,很显然,如果前面那项

No 的话,那么这里肯定也是 No ,当然如果前面这项是 Yes- 即使

LVS ,而不想使用 LVS 的同步进程 (sync daemon), 可以在 configure

时候指定disable-lus-syncd.

Use VRRP Framework VRRP 框架,这基本上是必须的, Keepalived

核心进程vrpd

Use LinkWatch 所谓的 Linkwatch 大概意思是通过接收内核发出的关于网

卡的状态信息来判断网卡的状态,因为是内核发出的信息,这样在用

户端只需要捕捉这些信息即可,相比直接在用户端通过其他方式来

实现看起来会更省资源,Keepalived 在网卡超过 20 块的情况下推荐使

用。

简而言之,如果不使用LVS 功能,那么只要看到 Use VRRP Frame-

work Yes 就可以,反之,必须有 Use IPVS Framework Yes ,其他都

optional 的。


VRRP工作原理简述

那么这个VRRP协议是干嘛用呢?传统上来说我们通过一个路由器上网,如果故障那就不能用了,如果使用2个路由器,有一个故障你就需要手动的设置客户端切换到另外的路由器上,或者使用ARP客户端也可以实现,但总之部署比较麻烦不利于管理,就像下图:

有没有一种办法可以自动转移而省去手动配置呢?我们就可以通过VRRP协议来实现路由器的故障转移。如下图:

这里有个问题,VRRP提供一个VIP,它可以来设定那个路由器是活动节点,然后出现故障进行切换,VIP也随之对应到新的路由器上,但是内网是用过MAC地址来寻址的,虽然VIP对应到了新的路由器上,可是MAC变了,客户端的ARP表也没有更新,所以还是用不了,为了解决这个问题VRRP不但提供VIP还提供VMAC地址,这个VMAC地址是VRRP单独申请的,大家都可以正常使用。

故障切换的时候虽然改变了后端路由器,但是由于客户端使用的是VIP和VMAC地址,这样就不会有任何影响了。

所以Keepalived就是在Linux系统上提供了VRRP功能,当然还提供了服务监控功能,比如监控后端服务器的健康检查、LVS服务可用性检查。

VRRP的工作过程是这样的:

  1. 虚拟路由器中的路由器根据优先级选举出Master,Master路由器通过发送免费ARP报文,将自己的虚拟MAC地址通告给与它连接的设备。
  2. Master路由器周期性发送VRRP报文,以公布自己的配置信息(优先级等)和工作状态
  3. 如果Master故障,虚拟路由器中的Backup路由器将根据优先级重新选举新的Master
  4. 虚拟路由器状态切换时,Master路由器由一台设备切换会另外一台设备,新的Master路由器只是简单的发送一个携带虚拟MAC地址和虚拟IP的免费ARP报文,这样就可以更新其他设备中缓存的ARP信息
  5. Backup路由器的优先级高于Master时,由Backup的工作方式(抢占式或者非抢占式)决定是否重新选举Master。

VRRP还支持认证,就是为了防止随意一个VRRP设备加入到当前的虚拟路由组离来,它提供无认证、简单8位字符串认证和MD5认证(该认证方式Keepalive不支持)。



 


keepalived原理及配置介绍

什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是 保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,Keepalived通过请求一个vip来达到请求真是IP地址的功能,而VIP能够在一台机器发生故障时候,自动漂移到另外一台机器上,从来达到了高可用HA功能。那说到keepalived时不得不说的一个协议就是VRRP协议,可以说这个协议就是keepalived实现的基础,那么首先我们来看看VRRP协议。
注:搞运维的要有足够的耐心,不理解协议就很难透彻的掌握keepalived的了

VRRP协议

VRRP协议
学过网络的朋友都知道,网络在设计的时候必须考虑到冗余容灾,包括线路冗余,设备冗余等,防止网络存在单点故障,那在路由器或三层交换机处实现冗余就显得尤为重要,在网络里面有个协议就是来做这事的,这个协议就是VRRP协议,Keepalived就是巧用VRRP协议来实现高可用性(HA)的
VRRP协议有一篇文章写的非常好,大家可以直接看这里(记得认真看看哦,后面基本都已这个为基础的了)
帖子地址: http://bbs.ywlm.net/thread-790-1-1.html
只需要把服务器当作路由器即可!在《 VRRP协议》里讲到了虚拟路由器的ID也就是VRID在这里比较重要。keepalived完全遵守VRRP协议,包括竞选机制等等。

Keepalived原理

keepalived也是模块化设计,不同模块复杂不同的功能,下面是keepalived的组件 core check vrrp libipfwc libipvs-2.4 libipvs-2.6
core:是keepalived的核心,复杂主进程的启动和维护,全局配置文件的加载解析等
check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析
vrrp:VRRPD子进程,VRRPD子进程就是来实现VRRP协议的
libipfwc:iptables(ipchains)库,配置LVS会用到
libipvs*:配置LVS会用到
注意,keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已

1.png

keepalived启动后会有三个进程
父进程:内存管理,子进程管理等等
子进程:VRRP子进程
子进程:healthchecker子进程
有图可知,两个子进程都被系统WatchDog看管,两个子进程各自复杂自己的事,healthchecker子进程复杂检查各自服务器的健康程度,例如HTTP,LVS等等,如果 healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的兄弟 VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态

Keepalived配置文件详解

keepalived有三类配置区域,注意不是三种配置文件,是一个配置文件里面三种不同类别的配置区域
全局配置(Global Configuration)
VRRPD配置
LVS配置

一、全局配置

全局配置又包括两个子配置:
全局定义(global definition)
静态路由配置(static ipaddress/routes)
1,全局定义(global definition)配置范例

  1. global_defs #全局配置标识,表明这个区域{}是全局配置
  2. {
  3. notification_email
  4. {
  5. admin@example.com #表示发送通知邮件时邮件源地址是谁
  6. }
  7. notification_email_from admin@example.com #表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个notification_email_from  admin@example.com
  8. smtp_server 127.0.0.1 #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
  9. stmp_connect_timeout 30 #连接smtp连接超时时间
  10. router_id node1 #机器标识
  11. }

2,静态地址和路由配置范例

  1. static_ipaddress
  2. {
  3. 192.168.1.1/24 brd + dev eth0 scope global #相当于: ip addr add 192.168.1.1/24 brd + dev eth0 scope global
  4. 192.168.1.2/24 brd + dev eth1 scope global #就是给eth1配置IP地址
  5. }
  6. static_routes
  7. {
  8. src $SRC_IP to $DST_IP dev $SRC_DEVICE #路由和ip同理,一般这个区域不需要配置
  9. src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE
  10. }

这里实际上就是给服务器配置真实的IP地址和路由的,在复杂的环境下可能需要配置, 一般不会用这个来配置,我们可以直接用vi /etc/sysconfig/network-script/ifcfg-eth1来配置!

二、VRRPD配置

VRRPD配置包括三个类
VRRP同步组(synchroization group)
VRRP实例(VRRP Instance) VRRP脚本
1,VRRP同步组(synchroization group)配置范例

  1. vrrp_sync_group VG_1 {
  2. group {
  3. http #实例名
  4. mysql #实例名
  5. }
  6. notify_master /path/to/to_master.sh #表示当切换到master状态时,要执行的脚本
  7. notify_backup /path_to/to_backup.sh #表示当切换到backup状态时,要执行的脚本
  8. notify_fault "/path/fault.sh VG_1"
  9. notify /path/to/notify.sh
  10. smtp_alert #表示切换时给global defs中定义的邮件地址发送右键通知
  11. }

2,VRRP实例(instance)配置范例

  1. vrrp_instance http {
  2. state MASTER
  3. interface eth0
  4. dont_track_primary
  5. track_interface {
  6. eth0
  7. eth1
  8. }
  9. mcast_src_ip <IPADDR>
  10. garp_master_delay 10
  11. virtual_router_id 51
  12. priority 100
  13. advert_int 1
  14. authentication {
  15. auth_type PASS
  16. autp_pass 1234
  17. }
  18. virtual_ipaddress {
  19. #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
  20. 192.168.200.17/24 dev eth1
  21. 192.168.200.18/24 dev eth2 label eth2:1
  22. }
  23. virtual_routes {
  24. # src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tab
  25. src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
  26. 192.168.110.0/24 via 192.168.200.254 dev eth1
  27. 192.168.111.0/24 dev eth2
  28. 192.168.112.0/24 via 192.168.100.254
  29. }
  30. nopreempt
  31. preemtp_delay 300
  32. debug
  33. }

state:state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定,里如果这里设置为master,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为master
interface:实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
dont track primary:忽略VRRP的interface错误
track interface:跟踪接口,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)状态,例如,用nginx做均衡器的时候,内网必须正常工作,如果内网出问题了,这个均衡器也就无法运作了,所以必须对内外网同时做健康检查
mcast src ip:发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
garp master delay:在切换到master状态后,延迟进行免费的ARP(gratuitous ARP)请求
virtual router id:这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
priority 100:设置本节点的优先级,优先级高的为master
advert int:检查间隔,默认为1秒
virtual ipaddress:这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系,这里可以设置多个IP地址
virtual routes:原理和virtual ipaddress一样,只不过这里是增加和删除路由
lvs sync daemon interface:lvs syncd绑定的网卡
authentication:这里设置认证
auth type:认证方式,可以是PASS或AH两种认证方式
auth pass:认证密码
nopreempt:设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须别另外的高
preempt delay:抢占延迟
debug:debug级别
notify master:和sync group这里设置的含义一样,可以单独设置,例如不同的实例通知不同的管理人员,http实例发给网站管理员,mysql的就发邮件给DBA
3,VRRP脚本

  1. vrrp_script check_running {
  2.    script "/usr/local/bin/check_running"
  3.    interval 10
  4.    weight 10
  5. }
  6.  
  7. vrrp_instance http {
  8.    state BACKUP
  9.    smtp_alert
  10.    interface eth0
  11.    virtual_router_id 101
  12.    priority 90
  13.    advert_int 3
  14.    authentication {
  15.    auth_type PASS
  16.    auth_pass whatever
  17.    }
  18.    virtual_ipaddress {
  19.    1.1.1.1
  20.    }
  21.    track_script {
  22.    check_running weight 20
  23.    }
  24. }

首先在vrrp_script区域定义脚本名字和脚本执行的间隔和脚本执行的优先级变更
vrrp_script check_running {

script "/usr/local/bin/check_running"
interval 10     #脚本执行间隔
weight 10      #脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10
}

然后在 实例(vrrp_instance)里面引用,有点类似脚本里面的函数引用一样:先定义,后引用函数名
track_script {
check_running weight 20
}
注意:VRRP脚本(vrrp_script)和VRRP实例(vrrp_instance)属于同一个级别

LVS配置


如果你没有配置LVS+keepalived那么无需配置这段区域,里如果你用的是nginx来代替LVS,这无限配置这款,这里的LVS配置是专门为keepalived+LVS集成准备的。
注意了,这里LVS配置并不是指真的安装LVS然后用ipvsadm来配置他,而是用keepalived的配置文件来代替ipvsadm来配置LVS,这样会方便很多,一个配置文件搞定这些,维护方便,配置方便是也!
这里LVS配置也有两个配置
一个是虚拟主机组配置
一个是虚拟主机配置
1,虚拟主机组配置文件详解
这个配置是可选的,根据需求来配置吧,这里配置主要是为了让一台realserver上的某个服务可以属于多个Virtual Server,并且只做一次健康检查
virtual_server_group <STRING> {
# VIP port
<IPADDR> <PORT>
<IPADDR> <PORT>
fwmark <INT>
}
2,虚拟主机配置
virtual server可以以下面三种的任意一种来配置

  1. 1. virtual server IP port
  2. 2. virtual server fwmark int
  3. 3. virtual server group string

下面以第一种比较常用的方式来配详细解说一下
virtual_server 192.168.1.2 80 {                     #设置一个virtual server: VIP:Vport
delay_loop 3                                                  # service polling的delay时间,即服务轮询的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh                        #LVS调度算法
lb_kind NAT|DR|TUN                                      #LVS集群模式                      
persistence_timeout 120                                #会话保持时间(秒为单位),即以用户在120秒内被分配到同一个后端realserver
persistence_granularity <NETMASK>              #LVS会话保持粒度,ipvsadm中的-M参数,默认是0xffffffff,即每个客户端都做会话保持
protocol TCP                                                  #健康检查用的是TCP还是UDP
ha_suspend                                                   #suspendhealthchecker’s activity
virtualhost <string>                                       #HTTP_GET做健康检查时,检查的web服务器的虚拟主机(即host:头)
sorry_server <IPADDR> <PORT>                 #备用机,就是当所有后端realserver节点都不可用时,就用这里设置的,也就是临时把所有的请求都发送到这里啦
real_server <IPADDR> <PORT>                    #后端真实节点主机的权重等设置,主要,后端有几台这里就要设置几个
{
weight 1                                                         #给每台的权重,0表示失效(不知给他转发请求知道他恢复正常),默认是1
inhibit_on_failure                                            #表示在节点失败后,把他权重设置成0,而不是冲IPVS中删除
notify_up <STRING> | <QUOTED-STRING>  #检查服务器正常(UP)后,要执行的脚本
notify_down <STRING> | <QUOTED-STRING> #检查服务器失败(down)后,要执行的脚本
HTTP_GET                                                     #健康检查方式
{
url {                                                                #要坚持的URL,可以有多个
path /                                                             #具体路径
digest <STRING>                                            
status_code 200                                            #返回状态码
}
connect_port 80                                            #监控检查的端口
bindto <IPADD>                                             #健康检查的IP地址
connect_timeout   3                                       #连接超时时间
nb_get_retry 3                                               #重连次数
delay_before_retry 2                                      #重连间隔
} # END OF HTTP_GET|SSL_GET
#下面是常用的健康检查方式,健康检查方式一共有HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK这些
#TCP方式
TCP_CHECK {
connect_port 80
bindto 192.168.1.1
connect_timeout 4
} # TCP_CHECK

# SMTP方式,这个可以用来给邮件服务器做集群
SMTP_CHECK
host {
connect_ip <IP ADDRESS>
connect_port <PORT>                                     #默认检查25端口
14 KEEPALIVED
bindto <IP ADDRESS>
}
connect_timeout <INTEGER>
retry <INTEGER>
delay_before_retry <INTEGER>
# "smtp HELO"?|·-?ê§?à"
helo_name <STRING>|<QUOTED-STRING>
} #SMTP_CHECK

#MISC方式,这个可以用来检查很多服务器只需要自己会些脚本即可
MISC_CHECK
{
misc_path <STRING>|<QUOTED-STRING> #外部程序或脚本
misc_timeout <INT>                                    #脚本或程序执行超时时间

misc_dynamic                                               #这个就很好用了,可以非常精确的来调整权重,是后端每天服务器的压力都能均衡调配,这个主要是通过执行的程序或脚本返回的状态代码来动态调整weight值,使权重根据真实的后端压力来适当调整,不过这需要有过硬的脚本功夫才行哦
#返回0:健康检查没问题,不修改权重
#返回1:健康检查失败,权重设置为0
#返回2-255:健康检查没问题,但是权重却要根据返回代码修改为 返回码-2,例如如果程序或脚本执行后返回的代码为200,#那么权重这回被修改为 200-2
}
} # Realserver
} # Virtual Server
配置文件到此就讲完了,下面是一份未加备注的完整配置文件

  1. global_defs
  2. {
  3. notification_email
  4. {
  5. admin@example.com
  6. }
  7. notification_email_from admin@example.com
  8. smtp_server 127.0.0.1
  9. stmp_connect_timeout 30
  10. router_id node1
  11. }
  12. notification_email
  13. {
  14. admin@example.com
  15. admin@ywlm.net
  16. }
  17.  
  18. static_ipaddress
  19. {
  20. 192.168.1.1/24 brd + dev eth0 scope global
  21. 192.168.1.2/24 brd + dev eth1 scope global
  22. }
  23. static_routes
  24. {
  25. src $SRC_IP to $DST_IP dev $SRC_DEVICE
  26. src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE
  27. }
  28.  
  29. vrrp_sync_group VG_1 {
  30. group {
  31. http
  32. mysql
  33. }
  34. notify_master /path/to/to_master.sh
  35. notify_backup /path_to/to_backup.sh
  36. notify_fault "/path/fault.sh VG_1"
  37. notify /path/to/notify.sh
  38. smtp_alert
  39. }
  40. group {
  41. http
  42. mysql
  43. }
  44.  
  45.  
  46. vrrp_script check_running {
  47.    script "/usr/local/bin/check_running"
  48.    interval 10
  49.    weight 10
  50. }
  51.  
  52.  
  53. vrrp_instance http {
  54. state MASTER
  55. interface eth0
  56. dont_track_primary
  57. track_interface {
  58. eth0
  59. eth1
  60. }
  61. mcast_src_ip <IPADDR>
  62. garp_master_delay 10
  63. virtual_router_id 51
  64. priority 100
  65. advert_int 1
  66. authentication {
  67. auth_type PASS
  68. autp_pass 1234
  69. }
  70. virtual_ipaddress {
  71. #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
  72. 192.168.200.17/24 dev eth1
  73. 192.168.200.18/24 dev eth2 label eth2:1
  74. }
  75. virtual_routes {
  76. # src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tab
  77. src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
  78. 192.168.110.0/24 via 192.168.200.254 dev eth1
  79. 192.168.111.0/24 dev eth2
  80. 192.168.112.0/24 via 192.168.100.254
  81. }
  82. track_script {
  83. check_running weight 20
  84. }
  85.  
  86. nopreempt
  87. preemtp_delay 300
  88. debug
  89. }
  90.  
  91. virtual_server_group <STRING> {
  92. # VIP port
  93. <IPADDR> <PORT>
  94. <IPADDR> <PORT>
  95. fwmark <INT>
  96. }
  97.  
  98. virtual_server 192.168.1.2 80 {
  99. delay_loop 3
  100.  
  101. lb_algo rr|wrr|lc|wlc|lblc|sh|dh
  102. lb_kind NAT|DR|TUN
  103. persistence_timeout 120
  104. persistence_granularity <NETMASK>
  105. protocol TCP
  106. ha_suspend
  107. virtualhost <string>
  108.  
  109. sorry_server <IPADDR> <PORT>
  110.  
  111. real_server <IPADDR> <PORT>
  112. {
  113. weight 1
  114. inhibit_on_failure 
  115. notify_up <STRING> | <QUOTED-STRING>
  116. notify_down <STRING> | <QUOTED-STRING>
  117.  
  118. #HTTP_GET方式
  119. HTTP_GET | SSL_GET
  120. {
  121. url { 
  122. path / 
  123. digest <STRING>                                            
  124. status_code 200
  125. }
  126. connect_port 80 
  127.  
  128. bindto <IPADD>
  129. connect_timeout   3
  130. nb_get_retry 3
  131. delay_before_retry 2
  132. }
  133. }

注意,这里仅仅是罗列,并不是可用的配置文件。里面需要根据自己的时间情况稍加配置才能用。

2>keepalived主从配置介绍

环境配置:

172.31.2.31(安装keepalived)(实例配置里面的VIP为172.31.2.100)

172.31.2.32(安装keepalived)(实例配置里面的VIP为172.31.2.100)

注:

本次实验中,必须能让上述两台机器的keepalived能够通信(增加相应iptables规则或者临时实验关闭iptables -F)

两台机器需要时间同步:简单起见都执行:ntpdate cn.pool.ntp.org

keepalived的日志默认在:tailf /var/log/messages

上述两台机器都需要安装keepalived:

yum install keepalived -y

配置主节点:172.31.2.31

vim /etc/keepalived/keepalived.conf

配置从节点:172.31.2.32

vim /etc/keepalived/keepalived.conf

主从节点都必须有的检测haproxy服务状态的文件(注:该文件必须有可执行权限!!!):

vim /opt/check_haproxy.sh 

解释脚本:

#!/bin/bash

if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then###判断haproxy是否已经启动

     systemctl start haproxy###如果没有启动,则启动haproxy程序

fi

sleep 2###睡眠两秒钟,等待haproxy完全启动

if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then###判断haproxy是否已经启动

      systemctl stop keepalived###如果haproxy没有启动起来,则将keepalived停掉,则VIP

                                                     自动漂移到另外一台haproxy机器,实现了对haproxy的高可用

fi

注:有上述脚本可以看出,每次启动keepalived的同时,第一件事,就是先启动haproxy。

接下来测试VIP漂移:

此时为初始状态即keepalived和haproxy服务都没有启动。

首先在主从节点分别查看eth0网卡情况:

主节点172.31.2.31:

从节点172.31.2.32:

在从节点172.31.2.32上启动keepalived,在查看eth0网卡(在启动keepalived的同时,首先会将haproxy启动)

这样我们可以通过请求172.31.2.100来达到直接访问172.31.2.32的目的(因为172.31.2.100是VIP,请求VIP则会自动将之转发到172.31.2.32):

上述在从节点启动keepalived完成。(VIP安装预期绑定到了eth0网卡)。

那么接下来实现将主节点172.31.2.31上的keepalived启动起来:

预测:由于172.31.2.31上配置的主节点的优先级比从节点高,因此,启动主节点的keepalived,则从节点上面172.31.2.100的VIP应该自动删除,漂移到主节点:

正常推测此时从节点的VIP应该不在了:




keepalived产生脑裂的原因与解决方法


脑裂产生的原因

一般来说,裂脑的发生,有以下几种原因:

  • 高可用服务器对之间心跳线链路发生故障,导致无法正常通信。

    • 因心跳线坏了(包括断了,老化)。

    • 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。

    • 因心跳线间连接的设备故障(网卡及交换机)。

    • 因仲裁的机器出问题(采用仲裁的方案)。

  • 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。

  • 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。

  • 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。

  • Keepalived配置里同一 VRRP实例如果 virtual_router_id两端参数配置不一致也会导致裂脑问题发生。

常见的解决方案

在实际生产环境中,我们可以从以下几个方面来防止裂脑问题的发生:

同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息。

当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith、feyce)。相当于备节点接收不到心跳消患,通过单独的线路发送关机命令关闭主节点的电源。

做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短倍就有上行和下行的区别。报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短.

当然,在实施高可用方案时,要根据业务实际需求确定是否能容忍这样的损失。对于一般的网站常规业务.这个损失是可容忍的。




1、什么是脑裂

    脑裂(split-brain):指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。

    对于无状态服务的HA,无所谓脑裂不脑裂;但对有状态服务(比如MySQL)的HA,必须要严格防止脑裂。

2、解决keepalived脑裂问题

    检测思路:正常情况下keepalived的VIP地址是在主节点上的,如果在从节点发现了VIP,就设置报警信息。脚本(在从节点上)如下:

vim split-brainc_check.sh

#!/bin/bash

# 检查脑裂的脚本,在备节点上进行部署

LB01_VIP=192.168.1.229

LB01_IP=192.168.1.129

LB02_IP=192.168.1.130

while true

do

  ping -c 2 -W 3 $LB01_VIP &>/dev/null

    if [ $? -eq 0 -a `ip add|grep "$LB01_VIP"|wc -l` -eq 1 ];then

        echo "ha is brain."

    else

        echo "ha is ok"

    fi

    sleep 5

done

3、曾经碰到的一个keepalived脑裂的问题(如果启用了iptables,不设置"系统接收VRRP协议"的规则,就会出现脑裂)

    曾经在做keepalived+Nginx主备架构的环境时,当重启了备用机器后,发现两台机器都拿到了VIP。这也就是意味着出现了keepalived的脑裂现象,检查了两台主机的网络连通状态,发现网络是好的。然后在备机上抓包:

# tcpdump -i eth0|grep VRRP 

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 

listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 

22:10:17.146322 IP 192.168.1.54 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 160, authtype simple, intvl 1s, length 20 

22:10:17.146577 IP 192.168.1.96 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 50, authtype simple, intvl 1s, length 20 

22:10:17.146972 IP 192.168.1.54 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 160, authtype simple, intvl 1s, length 20 

22:10:18.147136 IP 192.168.1.96 > vrrp.mcast.net: VRRPv2, Advertisement, vrid 51, prio 50, authtype simple, intvl 1s, length 20 

    抓包发现备机能接收到master发过来的VRRP广播,那为什么还会有脑裂现象?

    接着发现iptables开启着,检查了防火墙配置。发现系统不接收VRRP协议。于是修改iptables,添加允许系统接收VRRP协议的配置:

    -A INPUT -i lo -j ACCEPT  

    -----------------------------------------------------------------------------------------

    自己添加了下面的iptables规则:

    -A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT       #允许组播地址通信

    -A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT             #允许VRRP(虚拟路由器冗余协)通信

    -----------------------------------------------------------------------------------------

    最后重启iptables,发现备机上的VIP没了。

    虽然问题解决了,但备机明明能抓到master发来的VRRP广播包,却无法改变自身状态。只能说明网卡接收到数据包是在iptables处理数据包之前。

4、预防keepalived脑裂问题

(1)可以采用第三方仲裁的方法。由于keepalived体系中主备两台机器所处的状态与对方有关。如果主备机器之间的通信出了网题,就会发生脑裂,此时keepalived体系中会出现双主的情况,产生资源竞争。

(2)一般可以引入仲裁来解决这个问题,即每个节点必须判断自身的状态。最简单的一种操作方法是,在主备的keepalived的配置文件中增加check配置,服务器周期性地ping一下网关,如果ping不通则认为自身有问题 。

(3)最容易的是借助keepalived提供的vrrp_script及track_script实现。如下所示:

#vim /etc/keepalived/keepalived.conf

   ......

   vrrp_script check_local {

    script "/root/check_gateway.sh"

    interval 5

    }

   ...... 

   track_script {    

   check_local                  

   }

   脚本内容:

   # cat /root/check_gateway.sh

   #!/bin/sh

   VIP=$1

   GATEWAY=192.168.1.1

   /sbin/arping -I em1 -c 5 -s $VIP $GATEWAY &>/dev/null  

   check_gateway.sh 就是我们的仲裁逻辑,发现ping不通网关,则关闭keepalived。

5、推荐自己写脚本

    写一个while循环,每轮ping网关,累计连续失败的次数,当连续失败达到一定次数则运行service keepalived stop关闭keepalived服务。

如果发现又能够ping通网关,再重启keepalived服务。最后在脚本开头再加上脚本是否已经运行的判断逻辑,将该脚本加到crontab里面。





About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在itpub、博客园、CSDN和个人微 信公众号( xiaomaimiaolhr)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文博客园地址: http://www.cnblogs.com/lhrbest

● 本文CSDN地址: https://blog.csdn.net/lihuarongaini

● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群号: 230161599 、618766405

● 微 信群:可加我微 信,我拉大家进群,非诚勿扰

● 联系我请加QQ好友 646634621 ,注明添加缘由

● 于 2020-02-01 06:00 ~ 2020-02-31 24:00 在西安完成

● 最新修改时间:2020-02-01 06:00 ~ 2020-02-31 24:00

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

小麦苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麦苗出版的数据库类丛书http://blog.itpub.net/26736162/viewspace-2142121/

小麦苗OCP、OCM、高可用网络班http://blog.itpub.net/26736162/viewspace-2148098/

小麦苗腾讯课堂主页https://lhr.ke.qq.com/

........................................................................................................................

使用 微 信客户端扫描下面的二维码来关注小麦苗的微 信公众号( xiaomaimiaolhr)及QQ群(DBA宝典)、添加小麦苗微 信, 学习最实用的数据库技术。

........................................................................................................................

欢迎与我联系

 

 



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2676459/,如需转载,请注明出处,否则将追究法律责任。

上一篇: linux运维工具pssh
下一篇: LVS介绍
请登录后发表评论 登录
全部评论
QQ:646634621| 网名:小麦苗| 微信公众号:xiaomaimiaolhr| 11g OCM| QQ群:618766405 微信群:私聊| 《数据库笔试面试宝典》作者| OCP、OCM、高可用(RAC+DG+OGG)网络班开讲啦,有需要的小伙伴可以私聊我。

注册时间:2012-09-23

  • 博文量
    1422
  • 访问量
    8493722