Nginx 負載均衡(動態實現)
1,概覽
1,傳統配置實現的負載均衡,在加減服務器的時候,會遇到下面的問題
1:配置文件是默認地址,則需要重載配置文件。nginx -s reload
加載配置文件流程:
1,主進程通知worker進程進行重啓
2,worker進程收到通知,等待現有請求處理完畢,然後進行重啓
3,重啓過程中的請求無法處理,會堆積一些無法處理的請求
4,重啓完畢,先處理堆積的請求,然後處理後續的請求
2:配置文件不是默認地址,需要關閉nginx,指定配置文件重啓,用以加載新的配置文件。
#注意:以上兩種方法,測試環境當然不會有問題。如果是生成環境,正值請求高峯的話,這麼做是絕對不允許的。
這樣,就產生了實現動態負載均衡的方法。
動態負載均衡實現原理:
1.配置方面,和靜態配置一摸一樣,用upstream模塊。將多個後端服務器的配置獨立出來,include引入。
2.利用consul服務維護多個後端服務器的地址以及配置信息,可擴展,縮減,修改後端服務器
2.利用nginx-upsync-module模塊,動態讀取consul維護的後端服務器信息,寫入1中獨立出來
的後端服務器配置中,並且加載到運行中的nginx中,整個過程不需要重新加載nginx。
2,consul
1,簡介
consul其實就是個服務發現、配置管理中心的服務軟件。
(具體安裝配置等細節可自行google,介紹使用都很詳細。這裏只介紹幾個和nginx負載均衡相關的命令)
2,啓動命令:
consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=abc - bind=8.8.8.2 -ui -client=0.0.0.0
詳解:
consul agent
-server #表示啓動的是一個服務
-bootstrap-expect n #表示有n個節點之後再啓動,沒特殊分佈式部署,n=1即可
-data-dir /tmp/consul #數據存儲目錄
-node=ali #當前服務節點的別名
-bind=0.0.0.0 #當前作爲consul服務器的ip
-ui #啓動默認ui界面
-client=0.0.0.0 #綁定client的地址,0.0.0.0表示所有客戶端都可以訪問
注意:
1,http服務默認是8500端口,開啓ui界面的話,host:8500可進行可視化管理
實例:
consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=abc -bind=8.8.8.2 -ui -client=0.0.0.0
4,常用命令:
1,增加新配置
curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$consul_port/v1/kv/$dir1/$upstream_name/$server_ip:$server_port
例如:
curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10}' http://8.8.8.2:8500/v1/kv/upstreams/syncTest/8.8.8.3:9001
2,查看所有的配置
curl http://127.0.0.1:8500/v1/kv/?recurse
3,刪除某個key
consul kv delete key(key 可以在上面查詢所有配置中拿到)
3,nginx配置
http{
……
upstream syncTest{
#先給定一個服務器
server 8.8.8.3:9001;
#upsync, 這裏的配置用了nginx-upsync-module模塊
#127.0.0.1:8500/v1/kv/upstreams/syncTest consule服務器地址
#upsync_timeout=6m 超時時間6min
#upsync_interval=500ms 配置從consul拉取上游服務器的間隔時間
#upsync_type 指定使用配置服務器的類型,當前是consul
#strong_dependency 啓動時是否強制依賴配置服務器,如果配置爲on,則拉取失敗,nginx同樣會啓用失敗
upsync 127.0.0.1:8500/v1/kv/upstreams/syncTest upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off strong_dependency=off;
#指定從consul拉取的上游服務器後持久化到的位
upsync_dump_path /data/www/learnNote/nginx/servers_test.conf;
#引入備份文件
include /data/www/learnNote/nginx/servers_test.conf;
}
……
server{
……
location / {
#負載均衡轉發
proxy_pass http://syncTest;
}
……
}
}
#歸納:
當consul擴展或者縮減服務器的時候,相應服務器配置文件會自動更新
歸根結底,和靜態配置唯一的不同就是用upsync模塊定時自動拉去consul維護的服務器信息。
再簡單點,就是upstream配置中,再加兩條upsync,upsync_dump_path兩條配置
注意:
本文主要講了動態負載均衡的原理,實現。
需要了解靜態負載均衡配置的知識,才能瞭解本文的動態的配置,靜態配置可以查看上一篇總結
地址:
知乎:https://zhuanlan.zhihu.com/p/157213928
csdn:https://blog.csdn.net/SiuKong_Ngau/article/details/107069817