天天看點

基于Keepalived實作LVS雙主高可用叢集

前言

前面說過基于heartbeat的LVS高可用方案,今天帶來另一種解決方案:基于Keepalived實作LVS雙主高可用叢集。什麼是Keepalived呢,keepalived觀其名可知,保持存活,在網絡裡面就是保持線上了, 也就是所謂的高可用或熱備,用來防止單點故障的發生。本文将詳細講述Keepalived工作原理及高可用解決方案的實作。

相關介紹

Keepalived簡介

Keepalived采用VRRP(virtual router redundancy protocol,虛拟路由備援協定)熱備份協定,以軟體的方式實作linux伺服器的多機熱備功能。VRRP是針對路由器的一種備份解決方案——由多台路由器組成一個熱備組。通過共用的虛拟IP位址對外提供服務;每個熱備組内同一時刻隻有一台主伺服器提供服務,其他伺服器處于備援狀态,若目前線上的伺服器失敗,其他伺服器會自動接替(優先級決定接替順序)虛拟IP位址,以繼續提供服務。

工作原理

Keepalived元件介紹

core:keepalived的核心,複雜主程序的啟動和維護,全局配置檔案的加載解析等

check:負責healthchecker(健康檢查),包括了各種健康檢查方式,以及對應的配置的解析包括LVS的配置解析

vrrp:VRRP子程序,VRRP子程序就是來實作VRRP協定的

libip*:LVS相關

<a href="http://s3.51cto.com/wyfs02/M01/6E/8A/wKioL1V_oFXj-IgtAACUoeU32Uk238.gif" target="_blank"></a>

由圖可知,兩個子程序都被系統WatchDog看管,兩個子程序各自負責自己的事,healthchecker子程序負責檢查各自伺服器的健康程度,例如HTTP,LVS等等,如果healthchecker子程序檢查到MASTER上服務不可用了,就會通知本機上的VRRP子程序,讓他删除通告,并且去掉虛拟IP,轉換為BACKUP狀态。

高可用解決方案

實驗拓撲

配置過程

HA叢集配置前提

時間同步、基于主機名互相通信、SSH互信

請確定兩個節點時間同步,可用ntpdate向時間伺服器同步

1

<code>[root@node1 ~]</code><code># ntpdate cn.pool.ntp.org</code>

基于主機名互相通信

2

3

4

5

6

7

8

9

10

11

12

<code>[root@node1 ~]</code><code># vim /etc/hosts</code>

<code>  </code> 

<code>172.16.10.123   node1.scholar.com node1</code>

<code>172.16.10.124   node2.scholar.com node2</code>

<code>[root@node1 ~]</code><code># vim /etc/sysconfig/network</code>

<code>HOSTNAME=node1.scholar.com</code>

<code>[root@node1 ~]</code><code># uname -n</code>

<code>node1.scholar.com</code>

<code>#兩個節點都需如上操作</code>

SSH互信

<code>[root@node1 ~]</code><code># ssh-keygen -t rsa -P ''</code>

<code>[root@node1 ~]</code><code># ssh-copy-id -i .ssh/id_rsa.pub root@node2</code>

<code>[root@node2 ~]</code><code># ssh-keygen -t rsa -P ''</code>

<code>[root@node2 ~]</code><code># ssh-copy-id -i .ssh/id_rsa.pub root@node1</code>

<code>[root@node1 ~]</code><code># date; ssh node2 'date' #測試</code>

<code>Tue Jun 16 13:31:39 CST 2015</code>

安裝所需程式

<code>[root@node1 ~]</code><code># yum install keepalived -y</code>

<code>#兩個節點都需安裝</code>

配置keepalived

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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

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

<code>[root@node1 ~]</code><code># vim /etc/keepalived/keepalived.conf </code>

<code>vrrp_instance VI_1 {        </code><code>#定義VRRP執行個體,執行個體名自定義</code>

<code>    </code><code>state MASTER            </code><code>#指定Keepalived的角色,MASTER為主伺服器,BACKUP為備用伺服器</code>

<code>    </code><code>interface eth0          </code><code>#指定HA監測的接口</code>

<code>    </code><code>virtual_router_id 51    </code><code>#虛拟路由辨別(1-255),在一個VRRP執行個體中主備伺服器ID必須一樣</code>

<code>    </code><code>priority 100            </code><code>#優先級,數字越大越優先,主伺服器優先級必須高于備伺服器</code>

<code>    </code><code>advert_int 1            </code><code>#設定主備之間同步檢查時間間隔,機關秒</code>

<code>    </code><code>authentication {        </code><code>#設定驗證類型和密碼</code>

<code>        </code><code>auth_type PASS      </code><code>#驗證類型</code>

<code>        </code><code>auth_pass ab007     </code><code>#設定驗證密碼,同一執行個體中主備密碼要保持一緻</code>

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

<code>    </code><code>virtual_ipaddress {     </code><code>#定義虛拟IP位址</code>

<code>        </code><code>192.168.12.23</code>

<code>}</code>

<code>vrrp_instance VI_2 {</code>

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

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

<code>    </code><code>virtual_router_id 61</code>

<code>    </code><code>priority 99</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 sr200</code>

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

<code>        </code><code>192.168.13.23</code>

<code>virtual_server 192.168.12.23 80 {    </code><code>#設定虛拟伺服器</code>

<code>    </code><code>delay_loop 6                     </code><code>#設定健康狀态檢查時間</code>

<code>    </code><code>lb_algo rr                       </code><code>#設定負載排程算法</code>

<code>    </code><code>lb_kind DR                       </code><code>#設定LVS實作負載均衡的機制</code>

<code>    </code><code>nat_mask 255.255.255.0           </code><code>#設定掩碼</code>

<code>    </code><code>persistence_timeout 50           </code><code>#會話保持時間</code>

<code>    </code><code>protocol TCP                     </code><code>#指定轉發協定類型</code>

<code>    </code><code>sorry_server 127.0.0.1 80        </code><code>#設定應急伺服器        </code>

<code>    </code><code>real_server 172.16.10.125 80 {   </code><code>#後端伺服器節點</code>

<code>        </code><code>weight 1                     </code><code>#設定服務節點的權重</code>

<code>        </code><code>HTTP_GET {                   </code><code>#設定檢測方式</code>

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

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

<code>              </code><code>status_code 200        </code><code>#設定傳回狀态碼為200表示Realserver存活</code>

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

<code>            </code><code>connect_timeout 2        </code><code>#設定響應逾時時間</code>

<code>            </code><code>nb_get_retry 3           </code><code>#設定逾時重試次數</code>

<code>            </code><code>delay_before_retry 1     </code><code>#設定逾時重試間隔</code>

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

<code>  </code><code>real_server 172.16.10.126 80 {</code>

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

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

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

<code>            </code><code>connect_timeout 2</code>

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

<code>            </code><code>delay_before_retry 1</code>

<code>}  </code>

<code>virtual_server 192.168.13.23 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>nat_mask 255.255.255.0</code>

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

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

<code>    </code><code>sorry_server 127.0.0.1 80       </code>

<code>    </code><code>real_server 172.16.10.125 80 {</code>

<code>    </code><code>real_server 172.16.10.126 80 {</code>

将配置檔案同步給另一個節點

<code>[root@node1 ~]</code><code># scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/</code>

<code>keepalived.conf                                           100% 2196     2.1KB</code><code>/s</code>   <code>00:00</code>

修改另一個節點配置檔案

<code>[root@node2 ~]</code><code># vim /etc/keepalived/keepalived.conf</code>

<code>vrrp_instance VI_1 {</code>

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

<code>        </code><code>auth_pass ab007</code>

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

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

<code>#其他配置不變</code>

Real Server配置

配置核心參數及VIP

<a href="http://s3.51cto.com/wyfs02/M02/6E/8E/wKioL1V_3QDD8_z2AAGja8oSVwM260.jpg" target="_blank"></a>

準備測試頁面

<a href="http://s3.51cto.com/wyfs02/M00/6E/92/wKiom1V_2_zDUQjMAABlq1BSRog135.jpg" target="_blank"></a>

<code>#兩個RS節點都執行以上操作</code>

測試頁面

<a href="http://s3.51cto.com/wyfs02/M02/6E/8E/wKioL1V_3knw7NMsAABe5ZfHagA704.jpg" target="_blank"></a>

keepalived節點準備應急頁面

<a href="http://s3.51cto.com/wyfs02/M01/6E/93/wKiom1V_3tGDY1w3AABbX2m87MA224.jpg" target="_blank"></a>

<code>#兩節點都需執行此操作</code>

測試

啟動keepalived

<a href="http://s3.51cto.com/wyfs02/M02/6E/93/wKiom1V_4hDQrbFTAABrvguRyWc873.jpg" target="_blank"></a>

檢視兩節點的ip和ipvs規則情況

<a href="http://s3.51cto.com/wyfs02/M01/6E/93/wKiom1V_4o7D8tT2AALE8Yvdzyw679.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/6E/93/wKiom1V_4uXgoHVUAALElLkr1us510.jpg" target="_blank"></a>

<code>#兩個節點各生成了兩組規則,因為VIP隻有一組,是以隻有一組生效</code>

通路測試

<a href="http://s3.51cto.com/wyfs02/M00/6E/93/wKiom1V_5W3ytb2RAACNkDzdVls362.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/6E/8F/wKioL1V_5y3iKwqoAACNjcpL5CQ079.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M02/6E/8F/wKioL1V_59aD84jqAACRGnQv-0k068.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/6E/93/wKiom1V_50DBlGrzAACTTCEdDtw075.jpg" target="_blank"></a>

模拟其中一個主節點故障

<code>[root@node1 ~]</code><code># service keepalived stop</code>

再次檢視兩節點的ip和ipvs規則情況

<a href="http://s3.51cto.com/wyfs02/M02/6E/93/wKiom1V_6OXQiHalAAIQh1tToDQ703.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/6E/8F/wKioL1V_6qjgMK-1AALkiAmXecQ956.jpg" target="_blank"></a>

由此可見,一個主節點挂掉以後所有的VIP和ipvs規則都會轉移到另一個節點,是以通路也不會受到任何影響,這裡就不再測試。如果故障節點重新上線,資源還會再次回到工作節點。

下面我們模拟兩個RS節點全部故障,看一下sorry_server是否可以工作

<code>[root@scholar ~]</code><code># service httpd stop</code>

<code>#兩個RS全部停止服務</code>

檢視ipvs規則

<a href="http://s3.51cto.com/wyfs02/M02/6E/94/wKiom1V_6ozyHRXlAADpS-wYOX4829.jpg" target="_blank"></a>

real server已全部下線,應急伺服器上線

<a href="http://s3.51cto.com/wyfs02/M00/6E/94/wKiom1V_68iiDdUnAACLex9DzBI745.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/6E/90/wKioL1V_7YagFSFqAACKPYnN4vw313.jpg" target="_blank"></a>

sorry_server響應成功,至此,基于Keepalived實作LVS雙主高可用叢集實驗完成

The end

基于Keepalived實作LVS雙主高可用解決方案就說到這裡了,通過實驗可以看出使用keepalived建構LVS群集更加簡便易用,如果實驗過程中遇到問題可留言交流。以上僅為個人學習整理,如有錯漏,大神勿噴~

本文轉自 北城書生  51CTO部落格,原文連結:http://blog.51cto.com/scholar/1662430

繼續閱讀