目錄
實現負載均衡
實現高可用
實現負載均衡
Nginx的幾種負載均衡算法:
-
1.輪詢(默認) 每個請求按照時間順序逐一分配到下游的服務節點,如果其中某一節點故障,nginx 會自動剔除故障系統使用戶使用不受影響。
-
2.權重(weight) 在配置文件中對下游的服務節點指定權重值 weight, weight 值越大則被分配的評率越高,一般這種負載均衡,用于節點的配置情況不一樣,有的可能配置高,有的配置低。
-
3.ip_hash 對每個請求,針對 ip 進行 hash, 然后分配到后臺節點,這樣一來,同一 ip 會被固定分配到下游固定服務上。它能夠暫時的解決集群環境中容器之間 session 共享的問題(因為session每次只能和一個人,一對一的記錄,但是如果現在需要負載均衡就出現了一種一對多的情況,可以使用ip_hash實現一對一),但是不是解決的根本之道,只是權宜之策,我們試想,如果訪問的好好的,家里的路由器被重啟了,或者運營商分配給你的 ip 地址改變了,那么你再次訪問的時候,新的 ip 就可能被分配到新的服務上,之前的 session 也就失效了。
-
4.least_conn (最少連接調度算法) 最少連接調度算法,對下游服務中連接情況,優先選擇連接數最少的服務分配。
-
5.least_time (最小響應時間) 最小響應時間, 計算節點平均響應時間,然后取響應最快的那個,分配更高權重。
(1)首先我們一共需要三個主機
后端的兩個主機用于apache服務:
window10:192.168.159.165kail:192.168.159.151
負載均衡設備nginx:
centos1:192.168.159.200
(2)配置window10
開啟apache服務
新建一個網頁并且編輯內容:
新建的網頁:www/index.html
內容:
Hello My Ip add 192.168.159.165
訪問結果
(2)配置kail
開啟apache服務
新建一個網頁并且編輯內容:
網頁地址:/var/html/index.html
網頁內容:
Hello My Ip add 192.168.159.165
訪問結果
(3)nginx設備配置
進入 /etc/nginx/nginx.conf
vim /etc/nginx/nginx.conf
配置負載均衡:
upstream nginx_boot{
# 30s內檢查心跳發送兩次包,未回復就代表該機器宕機,請求分發權重比為1:2
server 192.168.159.151 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.159.165 weight=100 max_fails=2 fail_timeout=30s;
# 這里的IP請配置成你WEB服務所在的機器IP
}
server {location / {root html; # 配置一下index的地址,最后加上index.ftl。 index index.html index.htm index.jsp index.ftl;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 請求交給名為nginx_boot的upstream上 proxy_pass http://nginx_boot;}location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css){root /usr/local/nginx/html/static;expires 7d;}
}
現在可以嘗試訪問:
第一次:
第二次:
不斷地嘗試可以發現:始終是訪問一次165然后再一次151,成功的實現了負載均衡!!!,并且權重和我們設置的也是一樣的,當然也可以手動的修改權重
也可以將負載均衡的方式修改為輪詢或者上面介紹的其他方式。
實現高可用
線上如果采用單個節點的方式部署Nginx,難免會出現天災人禍,比如系統異常、程序宕機、服務器斷電、機房爆炸、地球毀滅….哈哈哈,夸張了。但實際生產環境中確實存在隱患問題,由于Nginx作為整個系統的網關層接入外部流量,所以一旦Nginx宕機,最終就會導致整個系統不可用,這無疑對于用戶的體驗感是極差的,因此也得保障Nginx高可用的特性。
接下來則會通過keepalived的VIP機制,實現Nginx的高可用。 VIP并不是只會員的意思,而是指Virtual IP,即虛擬IP。
keepalived在之前單體架構開發時,是一個用的較為頻繁的高可用技術,比如MySQL、Redis、MQ、Proxy、Tomcat等各處都會通過keepalived提供的VIP機制,實現單節點應用的高可用。
上面那個實驗完成了,但是現在實現了負載均衡但是并沒有實現高可用問題
需要實現高可用,那就需要增加一臺nginx服務器
這里使用192.168.159.201當做另外一臺nginx服務器
實現原理:(類似于VRRP)
-
需要在200和201這兩臺設備上都安裝keepalive+nginx的環境
-
keepLive虛擬出一個VIP
-
瀏覽器通過訪問這個VIP來實現高可用
這里以192.168.159.200這臺設備為了,下面是具體的過程:
(1)首先配置keepalive
//獲取軟件包
wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
//解壓
tar -zxvf keepalived-2.2.4.tar.gz
//進入該目錄中后進行預編譯
./configure
//編譯
make/make install
(2)添加配置文件
vi keepalived.conf
bal_defs { ?# 自帶的郵件提醒服務,建議用獨立的監控或第三方SMTP,也可選擇配置郵件發送。notification_email { ?root@localhost ?} ?notification_email_from root@localhost ?smtp_server localhost ?smtp_connect_timeout 30 ?# 高可用集群主機身份標識(集群中主機身份標識名稱不能重復,建議配置成本機IP) ?router_id 192.168.159.200
} ?# 定時運行的腳本文件配置 ?
vrrp_script check_nginx_pid_restart { ?# 之前編寫的nginx重啟腳本的所在位置 ?script "/soft/scripts/keepalived/check_nginx_pid_restart.sh" ? # 每間隔3秒執行一次 ?interval 3 ?# 如果腳本中的條件成立,重啟一次則權重-20 ?weight -20 ?
} ?# 定義虛擬路由,VI_1為虛擬路由的標示符(可自定義名稱) ?
vrrp_instance VI_1 { ?# 當前節點的身份標識:用來決定主從(MASTER為主機,BACKUP為從機) ?state MASTER ?# 綁定虛擬IP的網絡接口,根據自己的機器的網卡配置 ?interface ens33 ? # 虛擬路由的ID號,主從兩個節點設置必須一樣 ?virtual_router_id 250 # 填寫本機IP ?mcast_src_ip 192.168.159.200 ?# 節點權重優先級,主節點要比從節點優先級高 ?priority 100 ?# 優先級高的設置nopreempt,解決異常恢復后再次搶占造成的腦裂問題 ?nopreempt ?# 組播信息發送間隔,兩個節點設置必須一樣,默認1s(類似于心跳檢測) ?advert_int 1 ?authentication { ?auth_type PASS ?auth_pass 1111 ?} ?# 將track_script塊加入instance配置塊 ?track_script { ?# 執行Nginx監控的腳本 ?check_nginx_pid_restart ?} ?virtual_ipaddress { ?# 虛擬IP(VIP),也可擴展,可配置多個。192.168.159.250 ?} ?
}
(7)編寫腳本
vim check_nginx_pid_restart.sh
//腳本內容:
#!/bin/sh ?
# 通過ps指令查詢后臺的nginx進程數,并將其保存在變量nginx_number中 ?
nginx_number=`ps -C nginx --no-header | wc -l` ?
# 判斷后臺是否還有Nginx進程在運行 ?
if [ $nginx_number -eq 0 ];then ?# 如果后臺查詢不到`Nginx`進程存在,則執行重啟指令 ?/soft/nginx/sbin/nginx -c /soft/nginx/conf/nginx.conf ?# 重啟后等待1s后,再次查詢后臺進程數 ?sleep 1 ?# 如果重啟后依舊無法查詢到nginx進程 ?if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then ?# 將keepalived主機下線,將虛擬IP漂移給從機,從機上線接管Nginx服務 ?systemctl stop keepalived.service ?fi ?
fi
(8)為該腳本授權
chmod +x check_nginx_pid_restart.sh
(9)將一些文件拷貝到/etc下
mkdir /etc/keepalived
cp keepalived.conf /etc/keepalived/
cd /root/keepalived/keepalived/etc/init.d
cp keepalived /etc/init.d/
cd ../sysconfig
cp keepalived /etc/sysconfig/
(10)修改配置文件
vim /etc/keepalived/keeplive.conf
//修改后:
bal_defs { ?# 自帶的郵件提醒服務,建議用獨立的監控或第三方SMTP,也可選擇配置郵件發送。notification_email { ?root@localhost ?} ?notification_email_from root@localhost ?smtp_server localhost ?smtp_connect_timeout 30 ?# 高可用集群主機身份標識(集群中主機身份標識名稱不能重復,建議配置成本機IP) ?router_id 192.168.159.200
} ?# 定時運行的腳本文件配置 ?
vrrp_script check_nginx_pid_restart { ?# 之前編寫的nginx重啟腳本的所在位置 ?script "/root//keepalived/keepalived/etc/keepalived/check_nginx_pid_restart.sh" ? # 每間隔3秒執行一次 ?interval 3 ?# 如果腳本中的條件成立,重啟一次則權重-20 ?weight -20 ?
} ?# 定義虛擬路由,VI_1為虛擬路由的標示符(可自定義名稱) ?
vrrp_instance VI_1 { ?# 當前節點的身份標識:用來決定主從(MASTER為主機,BACKUP為從機) ?state MASTER ?# 綁定虛擬IP的網絡接口,根據自己的機器的網卡配置 ?interface ens33 ? # 虛擬路由的ID號,主從兩個節點設置必須一樣 ?virtual_router_id 250 # 填寫本機IP ?mcast_src_ip 192.168.159.200 ?# 節點權重優先級,主節點要比從節點優先級高 ?priority 100 ?# 優先級高的設置nopreempt,解決異常恢復后再次搶占造成的腦裂問題 ?nopreempt ?# 組播信息發送間隔,兩個節點設置必須一樣,默認1s(類似于心跳檢測) ?advert_int 1 ?authentication { ?auth_type PASS ?auth_pass 1111 ?} ?# 將track_script塊加入instance配置塊 ?track_script { ?# 執行Nginx監控的腳本 ?check_nginx_pid_restart ?} ?virtual_ipaddress { ?# 虛擬IP(VIP),也可擴展,可配置多個。192.168.159.250 ?} ?
}
(11)設置開機自啟
[root@centos111 keepalived]# chkconfig keepalived on
[root@centos111 keepalived]# systemctl daemon-reload
[root@centos111 keepalived]# systemctl start keepalived.service
[root@centos111 keepalived]# systemctl enable keepalived.service
(12)備服務器配置(201)--大致流程與200相同
這里就不詳細演示了
注:從上圖中可以明顯看見虛擬IP已經成功掛載,但另外一臺機器192.168.12.250并不會掛載這個虛擬IP,只有當主機下線后,作為從機的192.168.12.130才會上線,接替VIP。
(13)測試
使用kail (192.168.159.151) ping 虛擬ip(192.168.159.250)、
可以看到成功的ping通了
現在嘗試關閉192.168.159.200服務器
nmcli con down ens33
然后再打開該服務器
nmcli con up ens33
查看192.168.159.201服務器
可以發現192.168.159.250這個虛擬ip已經轉到備服務器(192.168.159.201)這里了!
到此Nginx的負載均衡和高可用實驗都全部完成!!