- 高可用集羣,高可用集羣一般爲倆臺服務器,一臺工做,另外一臺冗餘,當提供服務器的服務器宕機時候,冗餘服務器將接替宕機的服務器繼續提供服務。實現高可用的集羣開源軟件有Heatbeat和Keepalived。
- 負載均衡集羣,須要有一臺服務器做爲分發器,它負載把用戶的請求分發給後端的服務器處理,在負載均衡集羣中,除分發器外,就是給用戶提供服務的服務器了,這些服務器的數量至少是倆臺。實現負載均衡的開源軟件有不少,如:LVS,keepalived,Haproxy,Nginx,商業版有F5和Netscaler,商業版的優點在於併發量高,擁有很好的穩定性。
Keepalived是經過VRRP協議來實現高可用的,VRRP協議會將多臺功能相同的路由器組成一個組,這個組裏有一個master角色和N(N>1)個backup角色,master會經過組播的組播的形式向各個backup發送VRRP協議的數據包,當backup不會受到master發來的VRRP數據包時,就會認爲master宕機了,就會根據backup的優先級來決定誰是master。html
Keepalived的有三個模塊,core,check和VRRP,core模塊是keepalived的核心,負責主進程的啓動,維護,以及全局配置文件的加載和解析,check模塊負責健康檢查,VRRP模塊用來實現VRRP協議。mysql
準備倆臺虛擬機,ip爲192.168.31.132的主機S-32做爲master,ip爲192.168.31.139的主機c-39做爲backup,倆臺虛擬主機同時安裝keepalived和nginx。nginx
yum install keepalived nginx -y systemctl stop firewalld systemctl enable firewalld
查看keepalived的配置文件vim /etc/keepalived/keepalived.confweb
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 }
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,再次查詢它時會自動啓動,說明腳本生效sql
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 查看vim
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.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,web目錄來寫個html測試,ip來訪問就能夠了,centos
負載均衡集羣有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層結構更加靈活,可以實現更多的個性化需求。bash
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)。
原文出處:https://www.cnblogs.com/liang-io/p/11987715.html