天天看点

keepalived的原理和基本实现

keepalived最初设计的目的是为了实现lvs前端director的高可用,非常轻量级。主要的实现的vrrp协议。

VRRP是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。

简化网络管理:在具有多播或广播能力的局域网(如以太网)中,借助VRRP 能在某台设备出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息,也无需修改主机的默认网关配置。

适应性强:VRRP 报文封装在 IP 报文中,支持各种上层协议。

网络开销小:VRRP 只定义了一种报文——VRRP 通告报文,并且只有处于Master 状态的路由器可以发送 VRRP 报文。

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_14144095277sZo.png" target="_blank"></a>

IPVS: 为lvs生成ipvs规则的组件,是内核级别的。

NETLINK:Netlink是套接字家族中的一员,主要用内核与用户空间的进程间、用户进程间的通讯。然而它并不像网络套接字可以用于主机间通讯,Netlink只能用于同一主机上进程通讯,并通过PID来标识它们。Netlink被设计为在Linux内核与用户空间进程传送各种网络信息。网络工具iproute2利用 Netlink从用户空间与内核进行通讯。Netlink由一个在用户空间的标准的Socket接口和内核模块提供的内核API组成。Netlink的设计比ioctl更加灵活,Netlink使用了AF_NETLINK Socket 家族。(摘自维基百科)

IPVS wrapper:借助于Checkers实现后端lvs主机的健康状态检测。

VRRP Stack: 实现VRRP协议,实现虚拟IP地址的转移。

在CentOS6.4以后,keepalived直接收录到内置的rpm仓库中,可以直接安装使用。

1

<code>yum </code><code>install</code> <code>keepalived -y</code>

keepalived配置文件:

<code>/etc/keepalived/keepalived</code><code>.conf</code>

2

3

4

<code>配置模式(主从模式):</code>

<code>主节点(Master):172.16.10.9</code>

<code>从节点(Backup):172.16.10.77</code>

<code>虚拟地址:172.16.10.68</code>

配置过程:

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

<code>### 172.16.10.9:/etc/keepalived/keepalived.conf,实例内容: </code>

<code>vrrp_instance VI_1 {</code>

<code>    </code><code>state MASTER</code>

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

<code>    </code><code>virtual_router_id 10</code>

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

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

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

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

<code>        </code><code>auth_pass MasBac</code>

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

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

<code>        </code><code>172.16.10.68</code>

<code>}</code>

<code>### 172.16.10.77:/etc/keepalived/keepalived.conf,实例内容: </code>

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

<code>    </code><code>priority 98</code>

配置完成后,先启动172.16.10.77的keepalived服务,查看日志信息:

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414409558Nv6v.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414409599C1dV.png" target="_blank"></a>

此时,启动Master端172.16.10.9的keepalived服务:

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414409607u8Fl.png" target="_blank"></a>

<code>配置模式(双主模式):</code>

<code>节点地址:172.16.10.9,172.16.10.77</code>

<code>虚拟地址:172.16.10.68 172.16.10.69</code>

<code>说明:这里的双主模型的实现实际上是配置了2组vrrp的示例。</code>

<code>如下关系:</code>

<code>示例1:</code>

<code>    </code><code>主节点:172.16.10.9</code>

<code>    </code><code>从节点:172.16.10.77 </code>

<code>示例2:</code>

<code>    </code><code>主节点:172.16.10.77</code>

<code>    </code><code>从节点:172.16.10.9</code>

配置信息:

31

32

33

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

<code>## 172.16.10.9的vrrp实例信息:</code>

<code>vrrp_instance VI_2 {</code>

<code>    </code><code>virtual_router_id 15</code>

<code>        </code><code>auth_pass DouMas</code>

<code>        </code><code>172.16.10.69</code>

<code>## 172.16.10.77的vrrp实例信息:</code>

重新启动keepalived服务:

此时,如果 172.16.10.77 出现故障,172.16.10.9会拥有2个虚拟ip地址,实现真正的冗余

<code>环境说明:</code>

<code>keepalived采用双主模型:节点是172.16.10.9 172.16.10.77</code>

<code>后端的realserver:172.16.10.122 172.16.10.133</code>

配置说明:

<code>## 配置后端节点:172.16.10.122 172.16.10.133</code>

<code>## ifconfig eth0 172.16.10.122/16 up </code>

<code>## ifconfig eth0 172.16.10.122/16 up  # 这个也可以写到配置文件</code>

<code>echo</code> <code>1 &gt; </code><code>/proc/sys/net/ipv4/conf/lo/arp_ignore</code>

<code>echo</code> <code>1 &gt; </code><code>/proc/sys/net/ipv4/conf/all/arp_ignore</code>

<code>echo</code> <code>2 &gt; </code><code>/proc/sys/net/ipv4/conf/lo/arp_announce</code>

<code>echo</code> <code>2 &gt; </code><code>/proc/sys/net/ipv4/conf/all/arp_announce</code>

<code>ifconfig</code> <code>lo:0 172.16.10.68 netmask 255.255.255.255 broadcast 172.16.10.68</code>

<code>route add -host 172.16.10.68  dev lo:0</code>

<code>ifconfig</code> <code>lo:1 172.16.10.69 netmask 255.255.255.255 broadcast 172.16.10.69</code>

<code>route add -host 172.16.10.69  dev lo:1</code>

配置keepalived:

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

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

<code>### 172.16.10.9:/etc/keepalived/keepalived.conf的配置:</code>

<code>global_defs {</code>

<code>   </code><code>notification_email {</code>

<code>     </code><code>[email protected]</code>

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

<code>   </code><code>notification_email_from [email protected]</code>

<code>   </code><code>smtp_server 172.16.10.9</code>

<code>   </code><code>smtp_connect_timeout 30</code>

<code>   </code><code>router_id LVS_DEVEL</code>

<code>        </code><code>172.16.10.68    </code>

<code>virtual_server 172.16.10.68 80 {</code>

<code>    </code><code>delay_loop 6</code>

<code>    </code><code>lb_algo rr</code>

<code>    </code><code>lb_kind DR</code>

<code>    </code><code>persistence_timeout 50</code>

<code>    </code><code>protocol TCP </code>

<code>    </code><code>sorry_server 172.16.10.77 80</code>

<code>    </code><code>real_server 172.16.10.122 80 {</code>

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

<code>        </code><code>HTTP_GET {</code>

<code>        </code><code>url {</code>

<code>        </code><code>path /</code>

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

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

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

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

<code>            </code><code>delay_before_retry 3</code>

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

<code>    </code><code>real_server 172.16.10.133 80 {</code>

<code>            </code><code>url {</code>

<code>                </code><code>path /</code>

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

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

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

<code>virtual_server 172.16.10.69 80 {</code>

<code>    </code><code>lb_kind DR </code>

<code>    </code><code>#persistence_timeout 50</code>

<code>    </code><code>protocol TCP</code>

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

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

<code>### 172.16.10.77:/etc/keepalived/keepalived.conf的配置:</code>

<code>! Configuration File </code><code>for</code> <code>keepalived</code>

<code>TCP_CHECK {</code>

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

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

测试:

测试前,重启keepalived服务。

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414409657oQtz.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414409660ZPto.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414409666QPLF.png" target="_blank"></a>

当后端realserver都出现故障时:

<a href="http://guoting.blog.51cto.com/attachment/201410/27/8886857_1414409671OdZi.png" target="_blank"></a>

配置完成。

本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1568581,如需转载请自行联系原作者

继续阅读