nginx集群架構


Linux集群從功能分類

  1. 高可用集群,高可用集群通常為倆台服務器,一台工作,另一台冗余,當提供服務器的服務器宕機時候,冗余服務器將接替宕機的服務器繼續提供服務。實現高可用的集群開源軟件有Heatbeat和Keepalived。
  2. 負載均衡集群,需要有一台服務器作為分發器,它負載把用戶的請求分發給后端的服務器處理,在負載均衡集群中,除分發器外,就是給用戶提供服務的服務器了,這些服務器的數量至少是倆台。實現負載均衡的開源軟件有很多,如:LVS,keepalived,Haproxy,Nginx,商業版有F5和Netscaler,商業版的優勢在於並發量高,擁有很好的穩定性。

Keepalived的VRRP協議

  Keepalived是通過VRRP協議來實現高可用的,VRRP協議會將多台功能相同的路由器組成一個組,這個組里有一個master角色和N(N>1)個backup角色,master會通過組播的組播的形式向各個backup發送VRRP協議的數據包,當backup不會受到master發來的VRRP數據包時,就會認為master宕機了,就會根據backup的優先級來決定誰是master。

  Keepalived的有三個模塊,core,check和VRRP,core模塊是keepalived的核心,負責主進程的啟動,維護,以及全局配置文件的加載和解析,check模塊負責健康檢查,VRRP模塊用來實現VRRP協議。

集群准備,哈哈,來戰

  准備倆台虛擬機,ip為192.168.31.132的主機S-32作為master,ip為192.168.31.139的主機c-39作為backup,倆台虛擬主機同時安裝keepalived和nginx。

yum install keepalived nginx -y
systemctl stop firewalld
systemctl enable firewalld

設置Keepalived主服務器

查看keepalived的配置文件vim /etc/keepalived/keepalived.conf

  1 ! Configuration File for keepalived
  2 
  3 global_defs {        #全局定義參數
  4    notification_email {    #出問題時給郵箱發郵件
  5      acassen@firewall.loc
  6      failover@firewall.loc
  7      sysadmin@firewall.loc    #郵件報警,暫時可不設置,后期zabbix統一管理
  8    }
  9    notification_email_from Alexandre.Cassen@firewall.loc
 10    smtp_server 192.168.200.1
 11    smtp_connect_timeout 30
 12    router_id LVS_DEVEL    #此處注意router_id為負載均衡標識,在局域網內應該是唯一的。
 13    vrrp_scripts chk_nginx{
 14    scripts "/scripts/check_ng.sh"   #檢測服務是否正常,腳本的路徑
 15    interval 3           #檢測間斷3秒
 16 }
 17    vrrp_skip_check_adv_addr
 18    vrrp_strict
 19    vrrp_garp_interval 0
 20    vrrp_gna_interval 0
 21 }
 22 
 23 vrrp_instance VI_1 {
 24     state MASTER        #狀態只有MASTER和BACKUP兩種,並且要大寫,MASTER為工作狀態,BACKUP是備用狀態。
 25     interface ens33        #通過ens33發送廣播,centos6是eth0。
 26     lvs_sync_daemon_inteface  ens33 #這個默認沒有,相當於心跳線接口,DR模式用的和上面的接口一樣,也可以用機器上的其他網卡eth1,用來防止腦裂。
 27     virtual_router_id 51    #虛擬路由標識,同一個vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。
 28     priority 100         #優先級,同一個vrrp_instance的MASTER優先級必須比BACKUP高。
 29     advert_int 1
 30     authentication {
 31         auth_type PASS        #驗證authentication。包含驗證類型和驗證密碼。類型主要有PASS、AH 兩種,通常使用的類型為PASS,\
 32         auth_pass 1111        #據說AH 使用時有問題。驗證密碼為明文,同一vrrp 實例MASTER 與BACKUP 使用相同的密碼才能正常通信。
 33     }
 34     virtual_ipaddress {         #虛擬ip地址,可以有多個地址,每個地址占一行,不需要子網掩碼,同時這個ip 必須與我們在lvs 客戶端設定的vip 相一致!
 35         192.168.200.100    
 36         192.168.200.17
 37         192.168.200.18
 38      track_scripts{
 39         chk_nginx        #加載腳本
 40        }
 41     }
 42 }
 43 
 44 virtual_server 192.168.200.100 443 {     #虛擬IP,來源與上面的虛擬IP地址,后面加空格加端口號
 45     delay_loop 6         #健康檢查間隔,單位為秒
 46     lb_algo rr          #負載均衡調度算法,一般用wrr、rr、wlc
 47     lb_kind NAT         #負載均衡轉發規則。一般包括DR,NAT,TUN 3種。
 48     persistence_timeout 50     #會話保持時間,會話保持,就是把用戶請求轉發給同一個服務器,不然剛在1上提交完帳號密碼,就跳轉到另一台服務器2上了。
 49     protocol TCP        #轉發協議,有TCP和UDP兩種,一般用TCP,沒用過UDP
 50 
 51     real_server 192.168.201.100 443 {    #真實服務器,包括IP和端口號
 52         weight 1        #權重,數值越大,權重越高 
 53         SSL_GET {
 54             url {
 55               path /
 56               digest ff20ad2481f97b1754ef3e12ecd3a9cc
 57             }
 58             url {
 59               path /mrtg/
 60               digest 9b3a0c85a887a256d6939da88aabd8cd
 61             }
 62             connect_timeout 3
 63             nb_get_retry 3
 64             delay_before_retry 3
 65         }
 66     }
 67 }
 68 
 69 virtual_server 10.10.10.2 1358 {
 70     delay_loop 6
 71     lb_algo rr 
 72     lb_kind NAT
 73     persistence_timeout 50
 74     protocol TCP
 75 
 76     sorry_server 192.168.200.200 1358
 77 
 78     real_server 192.168.200.2 1358 {
 79         weight 1
 80         HTTP_GET {
 81             url { 
 82               path /testurl/test.jsp
 83               digest 640205b7b0fc66c1ea91c463fac6334d
 84             }
 85             url { 
 86               path /testurl2/test.jsp
 87               digest 640205b7b0fc66c1ea91c463fac6334d
 88             }
 89             url { 
 90               path /testurl3/test.jsp
 91               digest 640205b7b0fc66c1ea91c463fac6334d
 92             }
 93             connect_timeout 3
 94             nb_get_retry 3
 95             delay_before_retry 3
 96         }
 97     }
 98 
 99     real_server 192.168.200.3 1358 {
100         weight 1
101         HTTP_GET {
102             url { 
103               path /testurl/test.jsp
104               digest 640205b7b0fc66c1ea91c463fac6334c
105             }
106             url { 
107               path /testurl2/test.jsp
108               digest 640205b7b0fc66c1ea91c463fac6334c
109             }
110             connect_timeout 3
111             nb_get_retry 3
112             delay_before_retry 3
113         }
114     }
115 }
116 
117 virtual_server 10.10.10.3 1358 {
118     delay_loop 3
119     lb_algo rr 
120     lb_kind NAT
121     persistence_timeout 50
122     protocol TCP
123 
124     real_server 192.168.200.4 1358 {
125         weight 1
126         HTTP_GET {
127             url { 
128               path /testurl/test.jsp
129               digest 640205b7b0fc66c1ea91c463fac6334d
130             }
131             url { 
132               path /testurl2/test.jsp
133               digest 640205b7b0fc66c1ea91c463fac6334d
134             }
135             url { 
136               path /testurl3/test.jsp
137               digest 640205b7b0fc66c1ea91c463fac6334d
138             }
139             connect_timeout 3
140             nb_get_retry 3
141             delay_before_retry 3
142         }
143     }
144 
145     real_server 192.168.200.5 1358 {
146         weight 1
147         HTTP_GET {
148             url { 
149               path /testurl/test.jsp
150               digest 640205b7b0fc66c1ea91c463fac6334d
151             }
152             url { 
153               path /testurl2/test.jsp
154               digest 640205b7b0fc66c1ea91c463fac6334d
155             }
156             url { 
157               path /testurl3/test.jsp
158               digest 640205b7b0fc66c1ea91c463fac6334d
159             }
160             connect_timeout 3
161             nb_get_retry 3
162             delay_before_retry 3
163         }
164     }
165 }

編輯檢測nginx 的腳本

vim /scripts/check_ng.sh腳本需要授權755的權限。

 1 #!/bin/bash
 2 #author:king
 3 #blog:https://www.cnblogs.com/liang-io/
 4 #usage:
 5 #定義時間變量,用於紀錄日志
 6 d=`date --date today +%Y%m%d_%H:%M:%S`
 7 #計算nginx的進程數量
 8 n=`ps -C nginx --no-heading|wc -l`
 9 #如果n為0,則啟動nginx,並在次檢測nginx,還是為0說明nginx無法啟動,則關閉Keepalived
10 if [ $n -eq "0" ]; then 
11     systemctl start nginx
12        n2=`ps -C nginx --no-heading|wc -l`
13   if [ $n2 -eq "0" ]; then 
14          echo "$d nginx,keepalived will stop" >> /var/log/check_ng.log
15     systemctl stop keepalived
16   fi
17 fi

啟動keepalived服務,使用ps aux命令查看keepalived進程,檢查nginx是否啟動,啟動后關閉nginx,再次查詢它時會自動啟動,說明腳本生效

 1 [root@c-32 scripts]# systemctl start keepalived
 2 [root@c-32 scripts]# ps -aux|grep keep
 3 root       7390  0.0  0.0 123008  1408 ?        Ss   11:27   0:00 /usr/sbin/keepalived -D
 4 root       7391  0.0  0.1 133980  3384 ?        S    11:27   0:00 /usr/sbin/keepalived -D
 5 root       7392  0.0  0.1 133848  2656 ?        S    11:27   0:00 /usr/sbin/keepalived -D
 6 root       7408  0.0  0.0   6824   196 pts/0    R+   11:27   0:00 grep --color=auto keep
 7 [root@c-32 scripts]# ps -aux|grep nginx
 8 root       6748  0.0  0.1 120896  2104 ?        Ss   10:03   0:00 nginx: master process nginx
 9 nginx      6749  0.0  0.1 121292  3564 ?        S    10:03   0:00 nginx: worker process
10 nginx      6750  0.0  0.1 121292  3328 ?        S    10:03   0:00 nginx: worker process
11 root       7013  0.0  0.1 120908  2280 ?        Ss   10:09   0:00 nginx: master process /usr/sbin/nginx
12 nginx      7014  0.0  0.1 121312  3344 ?        S    10:09   0:00 nginx: worker process
13 nginx      7015  0.0  0.1 121312  3588 ?        S    10:09   0:00 nginx: worker process
14 root       7410  0.0  0.0   8988   216 pts/0    R+   11:27   0:00 grep --color=auto nginx
15 [root@c-32 scripts]# systemctl stop nginx
16 [root@c-32 scripts]# ps -aux|grep nginx
17 root       6748  0.0  0.1 120896  2104 ?        Ss   10:03   0:00 nginx: master process nginx
18 nginx      6749  0.0  0.1 121292  3564 ?        S    10:03   0:00 nginx: worker process
19 nginx      6750  0.0  0.1 121292  3328 ?        S    10:03   0:00 nginx: worker process

 Keepalived服務日志在/var/log目錄下的messages文件中,設置的VIP 100 使用ifcofng命令查看不到,需要使用  ip add 查看

 1 [root@c-32 scripts]# ip add
 2 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
 3     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 4     inet 127.0.0.1/8 scope host lo
 5        valid_lft forever preferred_lft forever
 6     inet6 ::1/128 scope host 
 7        valid_lft forever preferred_lft forever
 8 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
 9     link/ether 00:0c:29:a8:f5:e5 brd ff:ff:ff:ff:ff:ff
10     inet 192.168.31.132/24 brd 192.168.31.255 scope global noprefixroute dynamic ens33
11        valid_lft 1563sec preferred_lft 1563sec
12     inet 192.168.200.100/32 scope global ens33
13        valid_lft forever preferred_lft forever
14     inet 192.168.200.17/32 scope global ens33
15        valid_lft forever preferred_lft forever
16     inet 192.168.200.18/32 scope global ens33
17        valid_lft forever preferred_lft forever
18     inet6 fe80::f19:5632:205a:cb78/64 scope link noprefixroute 
19        valid_lft forever preferred_lft forever

 設置Keepalived從服務器

配置文件keepalived.conf,是上面的配置文件,就是改了一個vip,權重從服務器都比主服務器低,nginx健康的腳本也是上面的。

1 [root@c-139 keepalived]# vim keepalived.conf     #把priority 100  改為90,sed -i "s/priority 100/priority 90/g" /etc/keepalived/keepalived.conf
2 [root@c-139 keepalived]# egrep  "priority" /etc/keepalived/keepalived.conf 
3     priority 90
4 [root@c-139 keepalived]# 

區分主從nginx服務

主服務器和從服務器都安裝了nginx,根據安裝的nginx,web目錄來寫個html測試,ip來訪問就可以了,

LVS負載均衡,算法

負載均衡集群有LVS,Keepalived,Haporxy,Nginx等開源軟件實現,LVS基於4層,(OSI網絡7層模型),nginx基於7層,Haporxy既可以做4層也可以做7層,Keepalived的負載均衡功能就是LVS,LVS(4層)負載均衡可以分發TCP協議,web服務器是80端口,除分發80端口外,它還可以分發其他端口通信,比如:mysql負載均衡也可以用LVS去實現,而nginx不支持這個功能,僅支持http,https,mail,相比較而言,LVS這種4層的結構更穩定,能承載的並發量更高,而nginx這種7層結構更加靈活,能夠實現更多的個性化需求。

lvs有三種工作模式,分別是NAT模式,DR模式,IP Tunnel模式,lvs架構中有一個核心的角色叫作分發器,用來分發用戶的請求,還有諸多處理用戶請求的服務器(Real Server簡稱RS)。

lvs的NAT模式是借助於iptables的nat來表示實現的,用戶的請求到分發器后,通過預設的iptables規則,把請求的數據包轉發的后端的RS上,RS設定的網關為分發器的內網ip,用戶請求的數據包全部經過分發器,所以分發器成為瓶頸,在NAT模式中,分發器有公網ip即可,所以比較節省公網ip資源

lvs ip Tunnel模式需要有一個公網ip配置在分發器和所有的RS上,我們稱之為VIP,客戶端請求的目標ip為VIP,分發器接受到請求數據包會對數據做加工處理,把目標ip改為RS的ip,這樣數據包就到了RS上,RS接受數據包后,會還原原始的數據包,這樣目標的ip就為VIp,因為所有的RS配置了這個VIP,所以他的任務就是他自己

lvs DR模式需要一個公網的ip配置在分發器和所有的RS上,也就是VIP,和ipTunnel不同的是,他會把數據包的mac地址修改為RS的mac地址,rs接受數據包后,會還原原始數據包,這樣目標ip就為VIP,因為所有的RS上配置的了這個VIP,所以他會認為是他自己。

LVS 支持的算法包括 8 種:輪詢(Round-Robin,簡稱 rr)、加權輪詢(Weight Round-Robin,簡稱wrr)、最小連接(Least-Connection,簡稱lc)、加權最小連接(Weight Least-Connection,簡稱 wlc)、基於局部性的最小連接(Locality-Based Least Connections,簡稱 lblc)、帶復制的基於局部性最小連接(Locality-Based Least Connections with Replication,簡稱lblcr)、目標地址散列調度(Destination Hashing,簡稱dh)和源地址散列調度(Source Hashing,簡稱sh)。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM