天天看点

Keepalived原理与实战精讲

什么是Keepalived呢keepalived观其名可知保持存活在网络里面就是保持在线了 也就是所谓的高可用或热备用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生那说到keepalived时不得 不说的一个协议就是VRRP协议可以说这个协议就是keepalived实现的基础那么首先我们来看看VRRP协议

注搞运维的要有足够的耐心哦不理解协议就很难透彻的掌握keepalived的了

一VRRP协议

VRRP协议

学 过网络的朋友都知道网络在设计的时候必须考虑到冗余容灾包括线路冗余设备冗余等防止网络存在单点故障那在路由器或三层交换机处实现冗余就显得 尤为重要在网络里面有个协议就是来做这事的这个协议就是VRRP协议Keepalived就是巧用VRRP协议来实现高可用性(HA)的

VRRP协议有一篇文章写的非常好大家可以直接看这里(记得认真看看哦后面基本都已这个为基础的了)

只需要把服务器当作路由器即可

keepalived完全遵守VRRP协议包括竞选机制等等

二Keepalived原理

Keepalived原理

keepalived也是模块化设计不同模块复杂不同的功能下面是keepalived的组件

core check vrrp libipfwc libipvs-2.4 libipvs-2.6

core是keepalived的核心复杂主进程的启动和维护全局配置文件的加载解析等

check负责healthchecker(健康检查)包括了各种健康检查方式以及对应的配置的解析包括LVS的配置解析

vrrpVRRPD子进程VRRPD子进程就是来实现VRRP协议的

libipfwciptables(ipchains)库配置LVS会用到

libipvs*配置LVS会用到

注意keepalived和LVS完全是两码事只不过他们各负其责相互配合而已

Keepalived原理与实战精讲

keepalived启动后会有三个进程

父进程内存管理子进程管理等等

子进程VRRP子进程

子进程healthchecker子进程

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

三Keepalived配置文件详解

keepalived配置详解

keepalived有三类配置区域(姑且就叫区域吧)注意不是三种配置文件是一个配置文件里面三种不同类别的配置区域

全局配置(Global Configuration)

VRRPD配置

LVS配置

一全局配置

全局配置又包括两个子配置

全局定义(global definition)

静态路由配置(static ipaddress/routes)

1全局定义(global definition)配置范例

<a href="http://blog.51cto.com/xqtesting/1655613#">?</a>

1

2

3

4

5

6

7

8

9

10

11

<code>global_defs</code>

<code>{</code>

<code>notification_email</code>

<code>admin</code><code>@example</code><code>.com</code>

<code>}</code>

<code>notification_email_from admin</code><code>@example</code><code>.com</code>

<code>smtp_server </code><code>127.0</code><code>.</code><code>0.1</code>

<code>stmp_connect_timeout </code><code>30</code>

<code>router_id node1</code>

全局配置解析

global_defs全局配置标识表面这个区域{}是全局配置

<code>admin</code><code>@ywlm</code><code>.net</code>

表示keepalived在发生诸如切换操作时需要发送email通知以及email发送给哪些邮件地址邮件地址可以多个每行一个

表示发送通知邮件时邮件源地址是谁

smtp_server 127.0.0.1

表示发送email时使用的smtp服务器地址这里可以用本地的sendmail来实现

smtp_connect_timeout 30

连接smtp连接超时时间

router_id node1

机器标识

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

这里实际上和系统里面命令配置IP地址和路由一样例如

192.168.1.1/24 brd + dev eth0 scope global 相当于: ip addr add 192.168.1.1/24 brd + dev eth0 scope global

就是给eth0配置IP地址

路由同理

一般这个区域不需要配置

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

二VRRPD配置

VRRPD配置包括三个类

VRRP同步组(synchroization group)

VRRP实例(VRRP Instance)

VRRP脚本

1VRRP同步组(synchroization group)配置范例

<code>vrrp_sync_group VG_1 {</code>

<code>group {</code>

<code>http</code>

<code>mysql</code>

<code>notify_master /path/to/to_master.sh</code>

<code>notify_backup /path_to/to_backup.sh</code>

<code>notify_fault </code><code>"/path/fault.sh VG_1"</code>

<code>notify /path/to/notify.sh</code>

<code>smtp_alert</code>

其中

http和mysql是实例名和下面的实例名一致

<code>notify_master /path/to/to_master.sh表示当切换到master状态时要执行的脚本</code>

<code>notify_backup /path_to/to_backup.sh表示当切换到backup状态时要执行的脚本</code>

notify /path/to/notify.sh

smtp alter表示切换时给global defs中定义的邮件地址发送右键通知

2VRRP实例(instance)配置范例

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<code>vrrp_instance http {</code>

<code>state MASTER</code>

<code>interface eth0</code>

<code>dont_track_primary</code>

<code>track_interface {</code>

<code>eth0</code>

<code>eth1</code>

<code>mcast_src_ip &lt;IPADDR&gt;</code>

<code>garp_master_delay 10</code>

<code>virtual_router_id 51</code>

<code>priority 100</code>

<code>advert_int 1</code>

<code>authentication {</code>

<code>auth_type PASS</code>

<code>autp_pass 1234</code>

<code>virtual_ipaddress {</code>

<code>#&lt;IPADDR&gt;/&lt;MASK&gt; brd &lt;IPADDR&gt; dev &lt;STRING&gt; scope &lt;SCOPT&gt; label &lt;LABEL&gt;</code>

<code>192.168.200.17/24 dev eth1</code>

<code>192.168.200.18/24 dev eth2 label eth2:1</code>

<code>virtual_routes {</code>

<code># src &lt;IPADDR&gt; [to] &lt;IPADDR&gt;/&lt;MASK&gt; via|gw &lt;IPADDR&gt; dev &lt;STRING&gt; scope &lt;SCOPE&gt; tab</code>

<code>src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1</code>

<code>192.168.110.0/24 via 192.168.200.254 dev eth1</code>

<code>192.168.111.0/24 dev eth2</code>

<code>192.168.112.0/24 via 192.168.100.254</code>

<code>nopreempt</code>

<code>preemtp_delay 300</code>

<code>debug</code>

statestate指定 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 interfacelvs syncd绑定的网卡

authentication这里设置认证

auth type认证方式可以是PASS或AH两种认证方式

auth pass认证密码

nopreempt设置不抢占这里只能设置在state为backup的节点上而且这个节点的优先级必须别另外的高

preempt delay抢占延迟

debugdebug级别

notify master和sync group这里设置的含义一样可以单独设置例如不同的实例通知不同的管理人员http实例发给网站管理员mysql的就发邮件给DBA

3VRRP脚本

<code>vrrp_script check_running {</code>

<code>   </code><code>script </code><code>"/usr/local/bin/check_running"</code>

<code>   </code><code>interval </code><code>10</code>

<code>   </code><code>weight </code><code>10</code>

<code>   </code><code>state BACKUP</code>

<code>   </code><code>smtp_alert</code>

<code>   </code><code>interface</code> <code>eth0</code>

<code>   </code><code>virtual_router_id </code><code>101</code>

<code>   </code><code>priority </code><code>90</code>

<code>   </code><code>advert_int </code><code>3</code>

<code>   </code><code>authentication {</code>

<code>   </code><code>auth_type PASS</code>

<code>   </code><code>auth_pass whatever</code>

<code>   </code><code>}</code>

<code>   </code><code>virtual_ipaddress {</code>

<code>   </code><code>1.1</code><code>.</code><code>1.1</code>

<code>   </code><code>track_script {</code>

<code>   </code><code>check_running weight </code><code>20</code>

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

<code>vrrp_script check_running {  </code>

<code>   </code><code>interval </code><code>10</code>     <code>#脚本执行间隔</code>

<code>   </code><code>weight </code><code>10</code>      <code>#脚本结果导致的优先级变更</code><code>10</code><code>表示优先级+</code><code>10</code><code>-</code><code>10</code><code>则表示优先级-</code><code>10</code>

然后在 实例( vrrp_instance)里面引用有点类似脚本里面的函数引用一样先定义后引用函数名 

<code>track_script {</code>

<code>   </code><code>check_running</code>

<code>   </code><code>weight </code><code>20</code>

注意VRRP脚本(vrrp_script)和VRRP实例( vrrp_instance)属于同一个级别 

如果你没有配置LVS+keepalived那么无需配置这段区域里如果你用的是nginx来代替LVS这无限配置这款这里的LVS配置是专门为keepalived+LVS集成准备的。

注意了这里LVS配置并不是指真的安装LVS然后用ipvsadm来配置他而是用keepalived的配置文件来代替ipvsadm来配置LVS这样会方便很多一个配置文件搞定这些维护方便配置方便是也

这里LVS配置也有两个配置

一个是虚拟主机组配置

一个是虚拟主机配置

1虚拟主机组配置文件详解

这个配置是可选的根据需求来配置吧这里配置主要是为了让一台realserver上的某个服务可以属于多个Virtual Server并且只做一次健康检查

virtual_server_group &lt;STRING&gt; {

# VIP port

&lt;IPADDR&gt; &lt;PORT&gt;

fwmark &lt;INT&gt;

}

2虚拟主机配置

virtual server可以以下面三种的任意一种来配置

1. virtual server IP port

2. virtual server fwmark int

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 &lt;NETMASK&gt;              #LVS会话保持粒度ipvsadm中的-M参数默认是0xffffffff即每个客户端都做会话保持

protocol TCP                                                  #健康检查用的是TCP还是UDP

ha_suspend                                                   #suspendhealthchecker’s activity

virtualhost &lt;string&gt;                                       #HTTP_GET做健康检查时检查的web服务器的虚拟主机即host头

sorry_server &lt;IPADDR&gt; &lt;PORT&gt;                 #备用机就是当所有后端realserver节点都不可用时就用这里设置的也就是临时把所有的请求都发送到这里啦

real_server &lt;IPADDR&gt; &lt;PORT&gt;                    #后端真实节点主机的权重等设置主要后端有几台这里就要设置几个

{

weight 1                                                         #给每台的权重0表示失效(不知给他转发请求知道他恢复正常)默认是1

inhibit_on_failure                                            #表示在节点失败后把他权重设置成0而不是冲IPVS中删除

notify_up &lt;STRING&gt; | &lt;QUOTED-STRING&gt;  #检查服务器正常(UP)后要执行的脚本

notify_down &lt;STRING&gt; | &lt;QUOTED-STRING&gt; #检查服务器失败(down)后要执行的脚本

HTTP_GET                                                     #健康检查方式

url {                                                                #要坚持的URL可以有多个

path /                                                             #具体路径

digest &lt;STRING&gt;                                            

status_code 200                                            #返回状态码

connect_port 80                                            #监控检查的端口

bindto &lt;IPADD&gt;                                             #健康检查的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 &lt;IP ADDRESS&gt;

connect_port &lt;PORT&gt;                                     #默认检查25端口

14 KEEPALIVED

bindto &lt;IP ADDRESS&gt;

connect_timeout &lt;INTEGER&gt;

retry &lt;INTEGER&gt;

delay_before_retry &lt;INTEGER&gt;

# "smtp HELO"|·-ê§à"

helo_name &lt;STRING&gt;|&lt;QUOTED-STRING&gt;

} #SMTP_CHECK

#MISC方式这个可以用来检查很多服务器只需要自己会些脚本即可

MISC_CHECK

misc_path &lt;STRING&gt;|&lt;QUOTED-STRING&gt; #外部程序或脚本

misc_timeout &lt;INT&gt;                                    #脚本或程序执行超时时间

misc_dynamic                                               #这个就很好用了可以非常精确的来调整权重是后端每天服务器的压力都能均衡调配这个主要是通过执行的程序或脚本返回的状态代码来动态调整 weight值使权重根据真实的后端压力来适当调整不过这需要有过硬的脚本功夫才行哦

#返回0健康检查没问题不修改权重

#返回1健康检查失败权重设置为0

#返回2-255健康检查没问题但是权重却要根据返回代码修改为返回码-2例如如果程序或脚本执行后返回的代码为200#那么权重这回被修改为 200-2

} # Realserver

} # Virtual Server

配置文件到此就讲完了下面是一份未加备注的完整配置文件

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

<code>static_ipaddress</code>

<code>192.168</code><code>.</code><code>1.1</code><code>/</code><code>24</code> <code>brd + dev eth0 scope global</code>

<code>192.168</code><code>.</code><code>1.2</code><code>/</code><code>24</code> <code>brd + dev eth1 scope global</code>

<code>static_routes</code>

<code>src $SRC_IP to $DST_IP dev $SRC_DEVICE</code>

<code>src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE</code>

<code>interface</code> <code>eth0</code>

<code>garp_master_delay </code><code>10</code>

<code>virtual_router_id </code><code>51</code>

<code>priority </code><code>100</code>

<code>advert_int </code><code>1</code>

<code>autp_pass </code><code>1234</code>

<code>192.168</code><code>.</code><code>200.17</code><code>/</code><code>24</code> <code>dev eth1</code>

<code>192.168</code><code>.</code><code>200.18</code><code>/</code><code>24</code> <code>dev eth2 label eth2:</code><code>1</code>

<code>src </code><code>192.168</code><code>.</code><code>100.1</code> <code>to </code><code>192.168</code><code>.</code><code>109.0</code><code>/</code><code>24</code> <code>via </code><code>192.168</code><code>.</code><code>200.254</code> <code>dev eth1</code>

<code>192.168</code><code>.</code><code>110.0</code><code>/</code><code>24</code> <code>via </code><code>192.168</code><code>.</code><code>200.254</code> <code>dev eth1</code>

<code>192.168</code><code>.</code><code>111.0</code><code>/</code><code>24</code> <code>dev eth2</code>

<code>192.168</code><code>.</code><code>112.0</code><code>/</code><code>24</code> <code>via </code><code>192.168</code><code>.</code><code>100.254</code>

<code>check_running weight </code><code>20</code>

<code>preemtp_delay </code><code>300</code>

<code>virtual_server_group &lt;STRING&gt; {</code>

<code># VIP port</code>

<code>&lt;IPADDR&gt; &lt;PORT&gt;</code>

<code>fwmark &lt;INT&gt;</code>

<code>virtual_server </code><code>192.168</code><code>.</code><code>1.2</code> <code>80</code> <code>{</code>

<code>delay_loop </code><code>3</code>

<code>lb_algo rr|wrr|lc|wlc|lblc|sh|dh</code>

<code>lb_kind NAT|DR|TUN</code>

<code>persistence_timeout </code><code>120</code>

<code>persistence_granularity &lt;NETMASK&gt;</code>

<code>protocol TCP</code>

<code>ha_suspend</code>

<code>virtualhost &lt;string&gt;</code>

<code>sorry_server &lt;IPADDR&gt; &lt;PORT&gt;</code>

<code>real_server &lt;IPADDR&gt; &lt;PORT&gt;</code>

<code>weight </code><code>1</code>

<code>inhibit_on_failure </code>

<code>notify_up &lt;STRING&gt; | &lt;QUOTED-STRING&gt;</code>

<code>notify_down &lt;STRING&gt; | &lt;QUOTED-STRING&gt;</code>

<code>#HTTP_GET方式</code>

<code>HTTP_GET | SSL_GET</code>

<code>url { </code>

<code>path / </code>

<code>digest &lt;STRING&gt;                                            </code>

<code>status_code </code><code>200</code>

<code>connect_port </code><code>80</code> 

<code>bindto &lt;IPADD&gt;</code>

<code>connect_timeout   </code><code>3</code>

<code>nb_get_retry </code><code>3</code>

<code>delay_before_retry </code><code>2</code>

<code>} </code>

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

本文转自 小强测试帮 51CTO博客,原文链接:http://blog.51cto.com/xqtesting/1655613,如需转载请自行联系原作者