天天看點

常用叢集架構實戰練習篇

    一、簡介

    企業中常用的web架構主要的目的是實作高可用及其容災備份,說白了就是讓使用者有更好的用提體驗,一個架構的可用性隻有在經曆過上線後接受使用者的使用才能展現出其穩定性及其不足之處。利用周末的時間出于無聊,是以想總結以前所學的知識,本文主要介紹lvs,keepalived,nginx-proxy,等常用服務的搭建及其原理。

    二、lvs概述及NAT、DR原理

    專題一:

    lvs-nat(Linux virtual system)是根據請求封包的目标ip和目标端口進行排程轉發至後端某主機。在實際生産中常用的模型有NAT(Network Address Translation)和DR(Direct Routing),下面我們從這兩開始展開叙述。

    NAT模型拓撲圖:

<a href="http://s5.51cto.com/wyfs02/M01/89/D7/wKiom1gfHYDioZKxAAHmvS2vKsI619.png" target="_blank"></a>

    原理:客服端發起請求,請求到達lvs前端排程器,通過将請求封包中的目标IP位址和目标端口修改為後端真實伺服器的IP位址和端口實作轉發,後端真實主機處理請求後又将響應封包以相同的原理經過排程器響應給使用者。如圖所示,開始時源位址為CIP目标位址為VIP,經過LVS發生目标位址轉換,将VIP轉換為RIP,則源位址為CIP目标位址為RIP,real server發現目标位址為自己位址時開始拆封包并給出響應。

    實戰部署:

   VIP1:10.1.10.65

   DIP1:192.168.184.128

   RIP1:192.168.184.129

   RIP2:192.168.184.130

    要求:兩台real server網關要指向DIP.VIP和DIP需在同一個網段,且為内網位址   

1

2

3

4

5

6

7

8

9

<code>Real server1:</code>

<code>    </code><code>route add default gw 192.168.184.128 </code>

<code>Real server2:</code>

<code>Virutal server:</code>

<code>ipvsadm -A -t 10.1.10.65:80 -s rr </code>

<code>ipvsadm -a -t 10.1.10.65:80 -r 192.168.184.129 -m -w 1 </code>

<code>ipvsadm -a -t 10.1.10.65:80 -r 192.168.184.130 -m -w 2 </code>

<code>echo</code> <code>1&gt;</code><code>/proc/sys/net/ipv4/ip_forward</code> <code>#開啟ip_forward轉發功能</code>

示例圖:

    兩台real server網關必須指向directory routing.

<a href="http://s5.51cto.com/wyfs02/M02/89/D8/wKiom1gfLPmjw7qMAAA8BoNd2T8614.png-wh_500x0-wm_3-wmp_4-s_2253454510.png" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M02/89/D5/wKioL1gfLR6yra7yAAA8BoNd2T8421.png" target="_blank"></a>

    添加ipvsadm規則,使用預設權重為1,進行測試,實驗結果為輪詢。

<a href="http://s3.51cto.com/wyfs02/M00/89/D8/wKiom1gfLR7RcxjOAABHT6s6aRY588.png" target="_blank"></a>

    修改預設權重為1:2,及其靜态排程算法為權重輪詢,測試結果為1:2權重輪詢。

<a href="http://s3.51cto.com/wyfs02/M00/89/D5/wKioL1gfLR7gDp2YAABfKVg-Asc695.png" target="_blank"></a>

    總結:lvs-nat重要的注意點為路由需指向直連路由,需開啟轉發功能,常用的靜态和動态輪詢算法有:rr,wrr,SH,DH,LC,WLC.SED,NQ,LBLC,LBLCR等

    專題二:    

     lvs-dr(lvs director routing)是通過将請求封包重新封裝其MAC位址進行轉發,源MAC位址為DIP所在接口的IP位址,而目标MAC位址為從後端挑選出來的real server的MAC位址IP首部不發生變換 。  

    DR模型拓撲圖:    

<a href="http://s4.51cto.com/wyfs02/M02/89/D5/wKioL1gfMe6xxtpJAAINScCOfME443.png" target="_blank"></a>

    原理:lvs-dr模型中,請求封包的目标位址和源位址為發生改變,而在dr上重新封裝了MAC位址,最大的改變是後端的real server和dr都配備了VIP位址,而real server響應使用者請求時不經由dr進行轉發,直接将封包發送給客服端主機。在每個real server和dr上配有VIP位址,是以為了達到real sever不直接響應dr,需修改核心參數,将VIP綁定在lo回環接口的别名上,兩參數分别為:arp_ignore,arp_announce。  

    VIP1:10.1.10.88

    DIP1:10.1.10.65

    RIP1:10.1.10.66

    RIP2:10.1.10.67

    要求:需調整核心參數,為每一個需要VIP位址的主機添加VIP位址    

10

11

12

13

14

15

16

17

18

19

<code>real server01:</code>

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

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

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

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

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

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

<code>real server02</code>

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

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

<code>virtual server</code>

<code>ifconfig</code> <code>eno16777736:0 10.1.10.66 netmask 255.255.255.255 broadcast 10.1.10.65</code>

<code>ipvsadm -A -t 10.1.10.88:80 -s rr </code>

<code>ipvsadm -a -t 10.1.10.88:80 -r 10.1.10.66 -g -w 1 </code>

<code>ipvsadm -a -t 10.1.10.88:80 -r 10.1.10.67 -g -w 2</code>

    上訴均可使用腳本實作如下:

20

21

22

23

24

25

26

27

<code>#!/bin/bash</code>

<code>#</code>

<code>vip=</code><code>'10.1.10.99'</code>

<code>iface=</code><code>'eno16777736:0'</code>

<code>mask=</code><code>'255.255.255.255'</code>

<code>port=</code><code>'80'</code>

<code>rs1=</code><code>'10.1.10.66'</code>

<code>rs2=</code><code>'10.1.10.67'</code>

<code>scheduler=</code><code>'wrr'</code>

<code>type</code><code>=</code><code>'-g'</code>

<code>case</code> <code>$1 </code><code>in</code>

<code>start)</code>

<code>  </code><code>ifconfig</code> <code>$iface $vip netmask $mask broadcast $vip up</code>

<code>  </code><code>iptables -F</code>

<code>  </code><code>ipvsadm -A -t ${vip}:${port} -s $scheduler</code>

<code>  </code><code>ipvsadm -a -t ${vip}:${port} -r ${rs1} $</code><code>type</code> <code>-w 1</code>

<code>  </code><code>ipvsadm -a -t ${vip}:${port} -r ${rs2} $</code><code>type</code> <code>-w 2</code>

<code>  </code><code>;;</code>

<code>stop)</code>

<code>  </code><code>ipvsadm -C</code>

<code>  </code><code>ifconfig</code> <code>$iface down</code>

<code>*)</code>

<code>  </code><code>echo</code> <code>"Usage $(basename $0) start|stop"</code>

<code>  </code><code>exit</code> <code>1</code>

<code>esac</code>

     示例圖:

    設定為權重輪詢權重比為1:2,及其添加ipvs規則

    實驗結果如下圖,實作1:2說明實驗成功 ,可修改其排程算法再次驗證其結果的真實性。

<a href="http://s3.51cto.com/wyfs02/M01/89/D6/wKioL1gfPeKhoazAAAAfeRAtUno360.png" target="_blank"></a>

    總結:lvs-dr重點在于給dr及其real server配置VIP位址,并且向real server設定核心參數,是的real server中的lo:0上的VIP位址不直接響應dr,而是由real server直接響應客服端請求。上訴實驗中有個缺點,當real server主機服務提供服務時,使用者請求頁面很不友好,需給出相應的應急頁面。

    三、實戰keepalived高可用叢集解決方案

    專題三:

    keepalived是vrrp協定的實作,原生設計目的是為了高可用ipvs服務,keepalived能夠配置檔案中的定義生成ipvs規則,并能夠對各RS的健康狀态進行檢測;通過共用的虛拟IP位址對外提供服務;在主備模式下,每個熱備組内同一時刻隻有一台主伺服器提供服務,其他伺服器處于備援狀态,若目前線上的伺服器當機,其虛拟IP位址将會被其他伺服器接替(優先級決定接替順序),實作高可用為後端主機提供服務。主/備,備/主雙主模式下,兩台排程器均處于提供服務的狀态,當其中一台伺服器當機或出現故障時,VIP将會“漂移”至另一台伺服器。

    keepalived拓撲圖:

<a href="http://s5.51cto.com/wyfs02/M01/89/D6/wKioL1gfRFXBcPUrAAI5zcL6kXg609.png" target="_blank"></a>

    原理:keepalived的實作主要是由vrrp協定,自定義vrrp_instance,vrrp_server和一些檢測腳本一起共同合作,實作自動配置設定VIP,和ipvs規則,少去了手動配置ipvs的麻煩,同時還能夠配置應急伺服器、用簡單腳本能在恢複模式下進行系統修複等,比起lvs優越性更高。

    DIP1:10.1.10.65

    VIP2:10.1.10.99

    DIP2:10.1.10.68

    要求:配置過程中,主的優先級要高于備,同時将主備的state狀态互調。 

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

100

101

102

103

104

105

106

107

108

<code>編輯</code><code>/etc/keepalived/keepalived</code><code>.conf,将此配置檔案拷貝至另一台keepalived主機修改相應部分即可。</code>

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

<code>global_defs {</code>

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

<code>root@localhost</code>

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

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

<code>   </code><code>smtp_server 127.0.0.1</code>

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

<code>   </code><code>router_id centos7s</code>

<code>   </code><code>vrrp_mcast_group4 224.0.4.18</code>

<code>}</code>

<code>vrrp_instance VI_1 {</code>

<code>    </code><code>state MASTER </code><code>#執行個體狀态資訊</code>

<code>    </code><code>interface eno16777736</code>

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

<code>    </code><code>priority 100 </code><code>#優先級</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 frSAmesXYSSFmw</code>

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

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

<code>        </code><code>10.1.10.88 dev eno16777736 labeleno16777736:0</code>

<code>    </code><code>notify_master </code><code>"/etc/keepalived/notify.sh master"</code> <code>#此處調用腳本實作發郵件給管理者</code>

<code>    </code><code>notify_backup </code><code>"/etc/keepalived/notify.sh backup"</code>

<code>    </code><code>notify_fault </code><code>"/etc/keepalived/notify.sh fault"</code>

<code>vrrp_instance VI_2 {</code>

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

<code>    </code><code>virtual_router_id 52</code>

<code>    </code><code>priority 99</code>

<code>        </code><code>auth_pass frSAresXYSSFmw</code>

<code>        </code><code>10.1.10.99 dev eno16777736 labeleno16777736:1</code>

<code>    </code><code>notify_master </code><code>"/etc/keepalived/notify.sh master"</code>

<code>virtual_server 10.1.10.88 80 {</code>

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

<code>    </code><code>lb_algo rr </code><code>#排程算法</code>

<code>    </code><code>lb_kind DR </code><code>#負載均衡模型</code>

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

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

<code>    </code><code>real_server 10.1.10.66 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>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 10.1.10.67 80 {</code>

<code>        </code><code>weight 2</code>

<code>virtual_server 10.1.10.99 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>sorry_server 127.0.0.1 80</code>

    示例圖:

    配置完成後啟動keepalived會自動生成ipvs規則

<a href="http://s3.51cto.com/wyfs02/M00/89/DB/wKiom1gf5rjTqcPGAABekt5FTBU366.png" target="_blank"></a>

    測試結果為設定的輪詢算法,同時模拟後端某伺服器故障,檢視相應的伺服器是否能符合正常需求    

<a href="http://s2.51cto.com/wyfs02/M00/89/D8/wKioL1gf5rmgVJvtAABH9I8mKXQ896.png" target="_blank"></a>

    測試結果為設定的輪詢算法,同時模拟後端伺服器故障,檢視相應的ipvs規則是否自動生成     

<a href="http://s3.51cto.com/wyfs02/M01/89/D8/wKioL1gf5rqDiIGwAABQPxTSCtc032.png" target="_blank"></a>

    測試結果為設定的輪詢算法,同時模拟後端某伺服器故障,檢視相應的應急頁面是否能符合正常需求

<a href="http://s2.51cto.com/wyfs02/M01/89/DB/wKiom1gf5rnAzhu2AAArTAGdv1s669.png" target="_blank"></a>

    總結:在keepalived中需注意的事項為,配置vrrp_instance執行個體時需注意主備的狀态及其優先級,比起lvs來說keepalived總體配置簡單,且ipvs規則自動生成省去了“人工智能”。

    四、nginx前端排程高可用實戰

    專題四:   

    對于一個大型網站來說,負載均衡是永恒的話題。随着硬體技術的迅猛發展,越來越多的負載均衡硬體裝置湧現出來,如F5 BIG-IP、Citrix NetScaler、Radware等等,雖然可以解決問題,但其高昂的價格卻往往令人望而卻步,是以負載均衡軟體仍然是大部分公司的不二之選。nginx作為webserver的後起之秀,其優秀的反向代理功能和靈活的負載均衡政策受到了業界廣泛的關注。  

    nginx高可用拓撲圖:

<a href="http://s1.51cto.com/wyfs02/M00/89/D8/wKioL1gf7RiAYSMIAAEKNSCZfoY169.png" target="_blank"></a>

    原理:nginx是高度子產品化的應用程式,其中nginx_proxy子產品即可實作負載均衡,将前端的使用者請求通過排程算法分攤在後端的真實主機,達到均衡的效果。nginx_proxy也依賴于vrrp協定來實作VIP的自動配置設定和漂移,和keepalived不同的是nginx将不會生成ipvs規則,而是使用upstream子產品将前端請求轉發至後端。 

    VIP1:10.1.10.88

    VIP2:10.1.10.99 

    RIP1:10.1.10.66 

    RIP2:10.1.10.67         

    要求:在配置過程中開啟nginx的upstream子產品,并代理到後端主機

<code>notification_email {</code>

<code>notification_email_from keepalived@localhost</code>

<code>smtp_server 127.0.0.1</code>

<code>smtp_connect_timeout 30</code>

<code>router_id centos7s</code>

<code>vrrp_mcast_group4 224.0.120.18</code>

<code>vrrp_script chk_down { </code><code>#在恢複模式下實作将機器更新,或更換伺服器</code>

<code>script </code><code>"[[ -f /etc/keepalived/down ]] &amp;&amp; exit 1 || exit 0"</code>

<code>interval 1</code>

<code>weight -5</code>

<code>vrrp_script chk_nginx { </code><code>#健康狀态檢測,檢測nginx是否存活</code>

<code>script </code><code>"killall -0 nginx &amp;&amp; exit 0 || exit 1"</code>

<code>state MASTER</code>

<code>interface eno16777736</code>

<code>virtual_router_id 53</code>

<code>priority 100</code>

<code>advert_int 1</code>

<code>authentication {</code>

<code>auth_type PASS</code>

<code>auth_pass 9818sss1</code>

<code>virtual_ipaddress {</code>

<code>10.1.10.88</code><code>/16</code> <code>dev eno16777736</code>

<code>track_script {</code>

<code>chk_down</code>

<code>chk_nginx</code>

<code>notify_master </code><code>"/etc/keepalived/notify.sh master"</code>

<code>notify_backup </code><code>"/etc/keepalived/notify.sh backup"</code>

<code>notify_fault </code><code>"/etc/keepalived/notify.sh fault"</code>

<code>state BACKUP</code>

<code>virtual_router_id 54</code>

<code>priority 98</code>

<code>auth_pass 9818rss1</code>

<code>10.1.10.99</code><code>/16</code> <code>dev eno16777736</code>

<code>http {</code>

<code>upstream websrvs {</code>

<code>    </code><code>server 10.1.10.66:80 weight=1;</code><code>#設定其權重為1,預設為1</code>

<code>    </code><code>server 10.1.10.67:80 weight=1;</code><code>#設定其權重為1,預設為1</code>

<code>    </code><code>server 127.0.0.1:8080 backup;</code><code>#設定其應急響應伺服器</code>

<code>...</code>

<code>server{</code>

<code>location / {</code>

<code>        </code><code>#root   /usr/share/nginx/html;</code>

<code>        </code><code>index   index.php index.html index.htm;</code>

<code>        </code><code>proxy_pass http:</code><code>//websrvs</code><code>;    </code><code>#代理至後端主機</code>

示例圖示:

    配置vrrp執行個體後将遵循自動生成VIP位址及其自動實作位址漂移

<a href="http://s3.51cto.com/wyfs02/M02/89/DF/wKiom1ggHauQuvcDAACKs8r-r4Q818.png" target="_blank"></a>

    模拟将後端一台伺服器故障和全體故障的測試結果

<a href="http://s3.51cto.com/wyfs02/M01/89/DF/wKiom1ggHamyFU8jAABEiXLKclc787.png" target="_blank"></a>

    執行個體中内嵌檢測nginx健康狀态檢測腳本當nginx當機時,則會自動将權重減去5,VIP位址漂移至優先級高的主機  

<a href="http://s3.51cto.com/wyfs02/M01/89/DC/wKioL1ggHaqgf1PiAACKLadXapA774.png" target="_blank"></a>

    總結:在所有的負載均衡排程中nginx配置最為簡單而且高效,同時很靈活,是以可根據自己業務需求将選擇合适自己企業的解決方案。

本文轉自chengong1013 51CTO部落格,原文連結:http://blog.51cto.com/purify/1870216,如需轉載請自行聯系原作者

繼續閱讀