keepalived
高可用集群
高可用集群(HA)是對核心服務器做冗余的方式減少服務的平均修復時間(MTTR),以提高服務的平均可用時間(MTTR)的占比。所謂冗余的方式提高系統可用性,通常是在單點(SPof)所在的位置采用雙機熱備,一旦工作狀態的主機發生故障,備份主機將接管其工作。如此一來MTTR所占據的時間就是短暫切換間隔,系統的可用性大大提高。對于可用性要求高的大型站點一般能達到99.9%的可用時間,但是花費與可用性并不完全成正比,通過一定的橫向擴展,系統可用性能夠快速提升,但再想獲得10倍的提升,達到四個9或者五個9的水平就比較難了。
目前采用較多的高可用方案就是對核心服務的單點做冗余,以避免服務器、數據中心等的單點失效,也能避免由于ISP專線故障引起的單點失效。但網絡擁塞時易導致多節點的集群內部個主備節點之間引起網絡分區(Network Partition)問題,造成資源爭用,導致整個系統無法協調統一。
VRRP協議
VRRP協議:
Virtual Router Redundancy Protocol(虛擬路由冗余協議),是一種容錯協議,通過把幾臺路由設備虛擬成一臺對外服務的網關路由,內部的路由器組之間就是采用VRRP協議進行通信,MASTER節點固定頻率地通過BROADCAST向BACKUP節點advert(通告)自己的HEARTBEAT和PRIORITY等信息。一旦主節點故障,備節點就會從BACKUP狀態轉為MASTER狀態,顯然,如果主節點降低優先級,備節點通過搶占(preempt)即可轉為MASTER狀態,也就是VIP的轉移。因此,新MASTER需發起ARP廣播以告知自己和其他主機VMAC(00-00-5e-00-01-VRID)地址發生了變化。 以此,兩臺冗余的路由器提供了高可用的服務。
VRRP協議安全性:
對于安全程度不同的網絡環境,可以在報頭上設定不同的認證方式和認證字。VRRP提供了簡單字符(Simple)認證方式和MD5認證方式。對于簡單認證字方式,可以設置長度為1~8的認證字;對于MD5認證方式,明文長度范圍是1~8,密文長度為24。
虛擬路由目的:
隨著Internet的發展,人們對網絡的可靠性的要求越來越高。對于局域網用戶來說,能夠時刻與外部網絡保持聯系非常重要。通常情況下,內部網絡中的所有主機都設置一條相同的缺省路由,指向出口網關,實現主機與外部網絡的通信。當出口網關發生故障時,主機與外部網絡的通信就會中斷。配置多個出口網關是提高系統可靠性的常見方法,但局域網內的主機設備通常不支持動態路由協議,如何在多個出口網關之間進行選路是一個需要解決的問題。
VRRP的工作過程為(H3C技術文檔):
(1) 虛擬路由器中的路由器根據優先級選舉出Master。Master路由器通過發送免費ARP報文,將自己的虛擬MAC地址通知給與它連接的設備或者主機,從而承擔報文轉發任務;
(2) Master路由器周期性發送VRRP報文,以公布其配置信息(優先級等)和工作狀況;
(3) 如果Master路由器出現故障,虛擬路由器中的Backup路由器將根據優先級重新選舉新的Master;
(4) 虛擬路由器狀態切換時,Master路由器由一臺設備切換為另外一臺設備,新的Master路由器只是簡單地發送一個攜帶虛擬路由器的MAC地址和虛擬IP地址信息的免費ARP報文,這樣就可以更新與它連接的主機或設備中的ARP相關信息。網絡中的主機感知不到Master路由器已經切換為另外一臺設備。
(5) Backup路由器的優先級高于Master路由器時,由Backup路由器的工作方式(搶占方式和非搶占方式)決定是否重新選舉Master。 由此可見,為了保證Master路由器和Backup路由器能夠協調工作,VRRP需要實現以下功能:
-
Master路由器的選舉;
-
Master路由器狀態的通告;
-
同時,為了提高安全性,VRRP還提供了認證功能;
keepalived
VRRP協議在Linux中的軟件實現,根本目的是為了高可用ipvs服務。其原理是基于VRRP協議完成MASTER到BACKUP的IP地址流動以實現主備節點的切換,并生成ipvs規則對Real Server進行管理,同時能夠對ipvs集群的各RS做健康狀態檢測,也可以基于腳本調用接口通過執行腳本完成腳本定義的功能??偟膩碚fKeepalived就是為了高可用LVS集群的用戶空間程序,借助keepalived可以達到高可用LVS和檢測RS健康狀態的目的。
HA Cluster的配置前提:
-
各節點時間必須同步,可使用ntp server或chrony服務等
-
確保iptables及selinux不會阻礙
-
各節點之間通過主機名相互通信,
-
各節點的root用戶可基于密鑰認證的ssh服務互相通信
-
網卡的MULTICAST功能應打開:
ip link set DEVICE multicast on
Keepalive切換主備節點狀態的過程:
-
初始:
讀取配置文件
默認進入MASTER或BACKUP狀態
設置VIPs
免費的ARPs廣播 -
切換:
收到更高優先級的alerts
進入BACKUP或MASTER狀態
VIPs移除
新MASTER設置VIPs
免費的ARPs廣播
【問題一】:系統啟動時,如何選舉MASTER?
給每個節點定義一個初始state,即一個MASTER、多個BACKUP,之后則完全根據優先級切換主備節點的狀態。
【問題二】:面向Real Server的內網ip是否也配置為高可用?
通常面向外網提供服務的vip需配置為高可用,但是面向內部網絡的Real Server一側有時也需要配置為高可用。但是兩側的MASTER應該同時由一臺主機擔任才有意義,即要實現同進退的狀態。因此要把兩側的vrrp綁定為VRRP synchronization group(s)
.
安裝keepalived
CentOS 6.4以后的版本以及收錄到base repository中,直接yum安裝即可。
1.yum -y install keepalived
主要文件
配置文件:/etc/keepalived/keepalived.conf
Unit File:/usr/lib/systemd/system/keepalived.service
主程序:/usr/sbin/keepalived
配置示例:/usr/share/doc/keepalived-1.2.13/samples/
配置文件說明
keepalived的主配置文件分為3段,分別為全局的配置段、VRRP實例段、VS實例段:
(1)全局配置段:設置象征性的通知郵箱、路由標識、vrrp多播地址(D類);
(2)VRRP實例段:初始狀態、物理接口、唯一編號、優先級、vrrp認證、VIP、檢測的網卡、搶占模式、通知腳本等;
(3)VS示例段:VIP及端口、檢測間隔、調度算法、集群類型、持久連接時長、SorryServer、RealServer{權重、通知腳本、健康檢測{HTTP/SSL/TCP/SMTP}、超時、重試、延時}等;
1./etc/keepalived/keepalived.conf
2.TOP HIERACHY
3.GLOBAL CONFIGURATION
4. Global definitions #
5. Static routes/addresses #靜態路由
6.VRRPD CONFIGURATION
7. VRRP synchronization group(s) #vrrp同步組
8. VRRP instance(s)
9.LVS CONFIGURATION
10. Virtual server group(s)
11. Virtual server(s)
(1)GLOBAL CONFIGURATION
1.global_defs {
2. notification_email {
3. root@localhost
4. }
5. notification_email_from keepaliced@localhost
6. smtp_server 127.0.0.1
7. smtp_connect_timeout 30
8. router_id LVS_node1
9.
10. vrrp_mcast_group4 224.0.22.22 # optional, default 224.0.0.18 ~ 239
11.}
(2)VRRPD CONFIGURATION
1.vrrp_instance <STRING> {
2. state MASTER # MASTER|BACKUP,當前節點在此虛擬路由器上的初始狀態,只能有一個MASTER,多個BACKUP
3. interface eth0 # 綁定當前虛擬路由器的物理接口
4. virtual_router_id 12 # 當前虛擬路由器的唯一標識,0 ~ 255
5. priority 100 # 當前主機在此虛擬路由器的優先級,1 ~ 254
6. advert_int 1 # vrrp通告的時間間隔
7. authentication {
8. auth_type PASS # PASS||AH,Simple Passwd (suggested)
9. auth_pass 1234 # Only the first eight (8) characters
10. }
11. virtual_ipaddress {
12. #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
13. 192.168.200.17/24 dev eth0 # 不用別名也可有多個ip地址
14. #192.168.200.18/24 dev eth2 label eth2:1 # 以網卡別名形式配置多個ip地址
15. }
16. track_interface {
17. eth0
18. eth1 # 監聽的接口,一旦網卡故障則轉為fault狀態,通常用于監控內網接口的網卡
19. ...
20. }
21. #nopreempt # 非搶占模式,默認為preempt
22. preempt_delay 300 # 搶占模式下,節點上線后觸發新選舉的延遲時間
23. notify_master <STRING>|<QUOTED-STRING> # 節點成為主節點觸發的腳本
24. notify_backup <STRING>|<QUOTED-STRING> # 節點轉為備節點時觸發的腳本
25. notify_fault <STRING>|<QUOTED-STRING> # 當前節點轉為失敗狀態時觸發的腳本
26. #notify <STRING>|<QUOTED-STRING> # 以上三種狀態的通用腳步
27.}
(3)LVS CONFIGURATION
1.virtual_server IP port |
2.virtual_server fwmark int {
3. delay_loop <INT> # 對RS健康檢測的間隔
4. lb_algo rr|wrr|lc|wlc|lblc|sh|dh # LB調度算法
5. lb_kind NAT|DR|TUN # LVS類型
6. persistence_timeout <INT> # 持久時間
7. protocol TCP #
8. sorry_server <IPADDR> <PORT> # 本機作為RS不可用的sorry主機
9. real_server <IPADDR> <PORT>{
10. weight <INT>
11. notify_up <STRING>|<QUOTED-STRING>
12. notify_down <STRING>|<QUOTED-STRING>
13. HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK {
14. url {
15. path <URL_PATH> # 要監控的URL
16. status_code <INT> # 健康狀態的響應碼
17. digest <STRING> # 健康狀態響應內容的摘要
18. }
19. nb_get_retry <INT> # 重試次數
20. delay_before_retry <INT> # 向當前RS的哪個IP地址發起監控狀態請求
21. connect_port <PORT> # 向RS的哪個port發起健康監測
22. bindto <IP ADDRESS> # 發出健康狀態檢測請求的原IP
23. connect_timeout <INTEGER> # 連接請求的超時時長
24. }
25. }
26.}
【一】測試keepalived基本功能
單主模型示例
node1的初始狀態為MASTER,node2的初始狀態為BACKUP;且BACKUP節點的優先級應小于MASTER節點;
1.vi /etc/keepalived/keepalived.conf
2. global_defs {
3. notification_email {
4. root@localhost
5. }
6. notification_email_from keepalived@jasonmc.com
7. smtp_server localhost
8. smtp_connect_timeout 30
9. router_id node1
10. vrrp_mcast_group4 224.22.29.1
11. }
12.
13. vrrp_instance VI_1 {
14. state MASTER
15. interface eth0
16. virtual_router_id 10
17. priority 100
18. advert_int 10
19. authentication {
20. auth_type PASS
21. auth_pass d351ac09
22. }
23. virtual_ipaddress {
24. 10.1.253.11 dev eth0
25. }
26. }
雙主模型示例
兩臺主機都需要安裝keepalived,在VI_1中node1為MASTER,node2為BACKUP;在VI_2中node1為BACKUP,node2為MASTER。兩臺主機應保持:時間同步、不受iptables和selinux阻礙、使用主機名通信、交換ssh認證密鑰、相同的操作系統、使用相同名稱的網卡。
tips:
多個實例的virtual_router_id、auth_pass、virtual_ipaddress等不同;
同一實例的主備state、priority等不同;
1.vi /etc/keepalived/keepalived.conf
2.global_defs {
3. notification_email {
4. root@localhost
5. }
6. notification_email_from keepalived@jasonmc.com
7. smtp_server localhost
8. smtp_connect_timeout 30
9. router_id node1
10. vrrp_mcast_group4 224.22.29.1 #224 ~ 239
11.}
12.
13.vrrp_instance VI_1 {
14. state MASTER|BACKUP
15. interface eth0
16. virtual_router_id 1
17. priority 100
18. advert_int 1
19. authentication {
20. auth_type PASS
21. auth_pass cc5042a6 #openssl rand -hex 4
22. }
23. virtual_ipaddress {
24. 10.1.253.11 dev eth0
25. }
26. notify_master '/etc/keepalived/notify.sh maste'
27. notify_backup "/etc/keepalived/notify.sh backup"
28. notify_fault "/etc/keepalived/notify.sh fault"
29.}
30.
31.vrrp_instance VI_2 {
32. state BACKUP|MASTER
33. interface eth0
34. virtual_router_id 2
35. priority 98
36. advert_int 1
37. authentication {
38. auth_type PASS
39. auth_pass ac5342a5
40. }
41. virtual_ipaddress {
42. 10.1.253.12 dev eth0
43. }
44. notify_master '/etc/keepalived/notify.sh maste'
45. notify_backup "/etc/keepalived/notify.sh backup"
46. notify_fault "/etc/keepalived/notify.sh fault"
47.}
通知腳本示例
When the host happen state transition,VRRP Stack will trigger notify script
to alert state transition,usually through sends mail to administrator.
there are four type notify script:
-
notify_master /path/to_master.sh
-
notify_backup /path/to_backup.sh
-
notify_fault “/path/fault.sh VG_1”
-
notify /path/notify.sh
1.vi /etc/keepalived/notify.sh
2.#!/bin/bash
3.#
4.receiver='root@localhost'
5.notify() {
6. mailsubject="$(hostname) to $1,vip floating."
7. content="$(date + '%F %T') vrrp state transion, $(hostname) changed to be $1"
8. echo "$content" | mail -s "$mailsubject" $receiver
9.}
10.case $1 in
11.master)
12. notify master
13. ;;
14.backup)
15. notify backup
16. ;;
17.fault)
18. notify fault
19. ;;
20.*)
21. echo "Usage $(basename $0) {master|backup|fault}"
22. exit 1
23. ;;
24.esac
【二】單主模型高可用DR類型LVS集群
DR模型的要點是Director與Real Server共享VIP,且由Real Server直接響應客戶端請求;Real Server應設置arp_ignore與arp_announce限制內核的ARP廣播;Real Server為了隱藏VIP,需把VIP綁定到非物理設備的lo網卡上,且為32位掩碼,廣播地址就是VIP自身;同時為了能夠發送響應報文,需增加lo網卡的VIP路由到真實物理網卡的路由規則;
-
node1為MSTER,node2為BACKUP;node1向node2發送心跳信息和優先級,這里需要注意的是- – node1與node2本身應該具有同一網段的ip地址才能接收多播信息;
-
node1與node2自動添加相同的ipvs規則,一旦RS不可用,將自動修改ipvs規則,實現RS的高可用;
-
node1故障時node2成為MASTER,當node1重新上線時,vrrp將重新選舉node1為MSTER,當即node2轉為BACKUP狀態;
配置keepalived主機
node1的初始狀態為MASTER,node2的初始狀態為BACKUP;且BACKUP節點的優先級應小于MASTER節點;
定義了一個virtual_server,其IP地址分別為VIP,且virtual_server內的有兩臺real_server;
1.vi /etc/keepalived/keepalived.conf
2. global_defs {
3. notification_email {
4. root@localhost
5. }
6. notification_email_from keepalived@jasonmc.com
7. smtp_server localhost
8. smtp_connect_timeout 30
9. router_id node1
10. vrrp_mcast_group4 224.22.29.1
11. }
12.
13. vrrp_instance VI_1 {
14. state MASTER
15. interface eth0
16. virtual_router_id 10
17. priority 100
18. advert_int 10
19. authentication {
20. auth_type PASS
21. auth_pass d351ac09
22. }
23. virtual_ipaddress {
24. 10.1.253.11 dev eth0
25. }
26. }
27. virtual_server 10.1.253.11 80 {
28. delay_loop 3
29. lb_algo rr
30. lb_kind DR
31. protocol TCP
32. sorry_server 127.0.0.1 80
33. real_server 10.1.22.100 80 {
34. weight 1
35. HTTP_GET {
36. url {
37. path /
38. status_code 200
39. }
40. connect_timeout 1
41. nb_get_retry 3
42. delay_before_retry 1
43. }
44. }
45. real_server 10.1.22.101 80 {
46. weight 1
47. HTTP_GET {
48. url {
49. path /
50. status_code 200
51. }
52. connect_timeout 1
53. nb_get_retry 3
54. delay_before_retry 1
55. }
56. }
57. }
Real Server配置
限制內核的ARP響應模型,增加VIP到lo:0網卡,增加VIP出口路由規則;
1.echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
2.echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
3.echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
4.echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
5.ifconfig lo:0 $vip netmask $mask broadcast $vip up
6.route add -host $vip dev lo:0
測試結果
-
(1)初始狀態時node1為MASTER,node2為BACKUP,VIP屬于node1;
-
(2)客戶端訪問VIP能夠輪詢Real Server;
-
(3)node1停用keepalived時node2新選舉為MASTER,VIP屬于node2;
-
(4)node1再次啟用keepalived時,node1新選舉為MASTER,node2進入BACKUP,VIP屬于node1;
-
(5)RS1停用,客戶端訪問VIP依然可用,ipvs只剩下一條指向RS2的規則,且node1與node2同步;
-
(6)RS1再次啟用,ipvs自動添加了指向RS1的規則,且node1與node2同步;
-
(7)同時停用RS1與RS2,ipvs沒有規則指向RS,客戶端訪問VIP,顯示為sorry_server的內容;
【三】雙主模型高可用DR類型LVS集群
在實現“單主模型高可用DR類型LVS集群”的基礎上,在RealServer的lo網卡添加兩個VIP,即lo:0為10.1.253.11,lo:1為10.1.253.12;再添加lo網卡上兩個VIP的出口路由規則,即ip地址10.1.253.11和10.1.253.12到0.0.0.0設備為lo的路由規則。
此時的模型為:
-
VI_1的MASTER為node1,BACKUP為node2;VI_2的MASTER為node2,BACKUP為node1;
-
即VIP 10.1.253.11為node1所占有,VIP 10.1.253.12為node2所占有;
-
客戶端訪問10.1.253.11與10.1.253.12都能輪詢RealSever,實現雙高可用LVS集群,借助DNS解析可實現對LVS調度器的負載均衡;
-
node1與node2通過多播HEATBEAT和PRIORITY互相檢測,一旦MASTER不可用,將重新選舉新的MASTER,實現LVS調度器的高可用;這里需要注意的是node1與node2本身應該具有同一網段的ip地址才能接收多播信息;
-
node1與node2自動添加相同的ipvs規則,一旦RS不可用,將自動修改ipvs規則,實現RS的高可用;
配置keepalived主機
兩臺主機分別為VI_1與VI_2的MASTER節點,且BACKUP節點的優先級應小于MASTER節點;
定義了兩個virtual_server,其IP地址分別為VIP1與VIP2,但virtual_server內的real_server是相同的才能實現雙主模型的LVS集群;
1.vi /etc/keepalived/keepalived.conf
2. global_defs {
3. notification_email {
4. root@localhost
5. }
6. notification_email_from keepalived@jasonmc.com
7. smtp_server localhost
8. smtp_connect_timeout 30
9. router_id node1
10. vrrp_mcast_group4 224.22.29.1
11. }
12.
13. vrrp_instance VI_1 {
14. state MASTER
15. interface eth0
16. virtual_router_id 10
17. priority 100
18. advert_int 10
19. authentication {
20. auth_type PASS
21. auth_pass d35109b2
22. }
23. virtual_ipaddress {
24. 10.1.253.11
25. }
26. }
27. vrrp_instance VI_2 {
28. state BACKUP
29. interface eth0
30. virtual_router_id 11
31. priority 98
32. advert_int 11
33. authentication {
34. auth_type PASS
35. auth_pass d35109b2
36. }
37. virtual_ipaddress {
38. 10.1.253.12
39. }
40. }
41.
42. virtual_server 10.1.253.11 80 {
43. delay_loop 3
44. lb_algo rr
45. lb_kind DR
46. protocol TCP
47. sorry_server 127.0.0.1 80
48. real_server 10.1.22.100 80 {
49. weight 1
50. HTTP_GET {
51. url {
52. path /
53. status_code 200
54. }
55. connect_timeout 1
56. nb_get_retry 3
57. delay_before_retry 1
58. }
59. }
60. real_server 10.1.22.101 80 {
61. weight 1
62. HTTP_GET {
63. url {
64. path /
65. status_code 200
66. }
67. connect_timeout 1
68. nb_get_retry 3
69. delay_before_retry 1
70. }
71. }
72. }
73.
74. virtual_server 10.1.253.12 80 {
75. delay_loop 3
76. lb_algo rr
77. lb_kind DR
78. protocol TCP
79. sorry_server 127.0.0.1 80
80. real_server 10.1.22.100 80 {
81. weight 1
82. HTTP_GET {
83. url {
84. path /
85. status_code 200
86. }
87. connect_timeout 1
88. nb_get_retry 3
89. delay_before_retry 1
90. }
91. }
92. real_server 10.1.22.101 80 {
93. weight 1
94. HTTP_GET {
95. url {
96. path /
97. status_code 200
98. }
99. connect_timeout 1
100. nb_get_retry 3
101. delay_before_retry 1
102. }
103. }
104. }
Real Server配置
限制內核的ARP響應模型,增加VIP1和VIP2到lo網卡,增加lo地址的出口路由規則;
1.echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
2.echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
3.echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
4.echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
5.ifconfig lo:0 $vip netmask $mask broadcast $vip1 up
6.ifconfig lo:1 $vip netmask $mask broadcast $vip2 up
7.route add -host $vip dev lo:0
8.route add -host $vip dev lo:1
測試結果
-
(1)初始狀態時node1為VI_1的MASTER,node2為VI_2的MASTER;VIP1屬于node1,VIP2屬于node2;
-
(2)客戶端訪問VIP1和VIP2都能夠輪詢Real Server;
-
(3)node1停用keepalived時node2新選舉VI_1與VI_2的MASTER;VIP1與VIP2同屬于node2;
-
(4)node1再次啟用keepalived時,node1新選舉為VI_1的MASTER,node2進入VI_1的BACKUP;VIP1屬于node1,VIP2屬于node2;
-
(5)RS1停用,客戶端訪問VIP1或VIP2依然可用,ipvs只剩下一條指向RS2的規則,且node1與node2同步;
-
(6)RS1再次啟用,ipvs自動添加了指向RS1的規則,且node1與node2同步;
-
(7)同時停用RS1與RS2,ipvs沒有規則指向RS,客戶端訪問VIP1或VIP2,顯示為sorry_server的內容;
【四】高可用Nginx代理服務器
keepalived調用外部腳本進行資源監控,并根據腳本的返回的結果能實現動態優先級的調整;如在腳本中判斷某進程是否存在,并exit返回true或false值,在vrrp實例中track_script調用定義的vrrp_script腳本,即對該進程的存活狀態進行監控。一旦腳本返回false值,keepalived將根據腳本中的weight值減小優先級,進而轉為BACKUP狀態;
使用檢測腳本的過程:
-
定義一個腳本
vrrp_script < NAME>{
script “string or /path”
interval INT
weight -INT
} -
在vrrp實例中調用vrrp_script
track_script {
vrrp_script_NAME1
vrrp_script_NAME2
}
測試trace_script功能
1.……
2.vrrp_script chkdown {
3. script "[ -f /etc/keepalived/down ]&& exit 1 || exit 0"
4. interval 1
5. weight -5
6.}
7.vrrp_instance VI_1 {
8. ……
9. track_script {
10. chk_down
11. }
12. ……
13.}
檢測失敗,下線過程:
-
VRRP_Script(chk_down) failed
-
forcing a new MASTER election
-
Transition to MASTER STATE
-
setting protocol VIPs.
-
Sending gratuitous ARPs on eth0 for 10.1.253.11
移除down文件,再次上線過程:
-
VRRP_Script(chk_down) succeeded
-
forcing a new MASTER election
-
Transition to MASTER STATE
-
setting protocol VIPs.
-
Sending gratuitous ARPs on eth0 for 10.1.253.11
雙Nginx代理服務器高可用
node1與node2為兩臺nginx代理服務器,rs1與rs2安裝httpd服務;
-
配置nginx使用upstream模塊代理所有請求報文到RS1與RS2,并做好相關測試
1.vi /etc/nginx/nginx.conf
2. http {
3. ……
4. upstream websrv {
5. server 10.1.22.100;
6. server 10.1.22.101;
7. }
8. }
9.
10.vi /etc/nginx/conf.d/default.conf
11. location / {
12. ……
13. proxy_pass http://websrv;
14. }
15.
16.#測試結果為:RS1與RS2輪詢響應;
-
配置雙主模型的keepalived,調用檢測nginx存活狀態的vrrp_script
1.vi /etc/keepalived/keepalived.conf
2. global_defs {
3. notification_email {
4. root@localhost
5. }
6. notification_email_from keepalived@jasonmc.com
7. smtp_server localhost
8. smtp_connect_timeout 30
9. router_id node1
10. vrrp_mcast_group4 224.22.29.1
11. }
12. vrrp_script chk_down {
13. script "[[ -f /etc/keepalived/down ]]&& exit 1 || exit 0"
14. interval 1
15. weight -5
16. }
17. vrrp_script chk_nginx {
18. script "killall -0 nginx && exit 0 || exit 1"
19. interval 1
20. weight -5
21. }
22. vrrp_instance VI_1 {
23. state BACKUP
24. interface eth0
25. virtual_router_id 10
26. priority 96
27. advert_int 10
28. authentication {
29. auth_type PASS
30. auth_pass d35109b2
31. }
32. virtual_ipaddress {
33. 10.1.253.11 dev eth0
34. }
35. track_script {
36. chk_down
37. chk_nginx
38. }
39. }
40.
41. vrrp_instance VI_2 {
42. state MASTER
43. interface eth0
44. virtual_router_id 11
45. priority 100
46. advert_int 11
47. authentication {
48. auth_type PASS
49. auth_pass d35109b2
50. }
51. virtual_ipaddress {
52. 10.1.253.12 dev eth0
53. }
54. track_script {
55. chk_down
56. chk_nginx
57. }
58. }
-
測試結果
-
客戶端訪問VIP1與VIP2均能輪詢兩臺RealServer;
-
初始狀態node1節點為VI_1的MASTER,node2為VI_2的MASTER
-
node2關閉nginx服務:
[node2]
VRRP_Script(chk_nginx) failed
VRRP_Instance(VI_2) Received higher prio advert
VRRP_Instance(VI_2) Entering BACKUP STATE
VRRP_Instance(VI_2) removing protocol VIPs.
[node1]
VRRP_Instance(VI_2) forcing a newMASTER election
VRRP_Instance(VI_2) Transition to MASTER STATE
VRRP_Instance(VI_2) Entering MASTER STATE
VRRP_Instance(VI_2) setting protocol VIPs.
VRRP_Instance(VI_2) Sending gratuitous ARPs on eth0 for 10.1.253.12 -
node2再次啟動nginx
[node2]
VRRP_Script(chk_nginx) succeeded
VRRP_Instance(VI_2) forcing a new MASTER election
VRRP_Instance(VI_2) Transition to MASTER STATE
setting protocol VIPs.
Sending gratuitous ARPs on eth0 for 10.1.253.12
[node1]
VRRP_Instance(VI_2) Received higher prio advert
VRRP_Instance(VI_2) Entering BACKUP STATE
VRRP_Instance(VI_2) removing protocol VIPs.
總結
keepalived能夠高可用LVS集群,并代替ipvsadm工具自動生成ipvs規則以動態管理RealServer,其增加或刪除RealServer的依據是能夠借助應用層的HTTP、SSL、SMTP等協議以及傳輸層的TCP協議探測RealServer的狀態。一旦RealServer故障或上線都會觸發ipvs wrapper模塊修改ipvs規則,如此一來便實現了高可用的LVS集群。
keepalived主機之間使用VRRP協議發送自己的心跳信息與優先級,主備節點之間任何時候都遵循誰的優先級就是MASTER的規則。選舉成為MASTER的節點將接管VIP并發布免費的ARP廣播,告知路由器此VIP的VMAC地址發生了變化。如此一來便實現了虛擬路由器的高可用,總之這里所言指的是通過冗余的辦法讓VIP保持可用狀態。
keepalived通過調用外部腳本進行資源監控,并根據腳本的返回的結果實現動態優先級的調整;也就是說keepalived的工作機制完全實現高可用Nginx的目的,在vrrp_instance中調用檢測Nginx健康狀態的腳本,當Nginx不可用時,通過降低主節點的優先級讓VIP流動到備節點或觸發修復腳本就能夠高可用Nginx代理服務器。當然,不限于此,完全取決于服務類型和腳本的可操作性。
keepalived采用雙主模型的高可用LVS集群及雙主模型高可用Nginx代理服務器集群實現了高可用集群的同時,也實現了二層的負載均衡。即借助DNS服務器對多條指向LVS或Nginx調度器的A記錄進行輪詢,使得兩臺keepalived主機使用VIP1與VIP2同時對外提供服務,實現了調度器層面的負載均衡。
原創文章,作者:helloc,如若轉載,請注明出處:http://www.www58058.com/56741