天天看點

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,如需轉載請自行聯系原作者

繼續閱讀