Nginx 動態負載均衡

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章