天天看點

API 動态更新 Upstream

API 動态更新 Upstream

今天和大家聊聊 API 動态更新 Upstream 功能,它可以動态的添加、修改、或移除上遊伺服器組中的節點,且無需重新加載伺服器或 NGINX 配置,下面就詳細來看一下吧。

解決了什麼問題

通常情況下,我們要更新 Upstream 的 Server 成員及屬性資訊,我們需要如下步驟:

1、更新 Upstream 的配置,需要編輯 NGINX 的配置檔案,如下圖:

http {
    # 建立upstream group(包含server成員)
upstream appservers {   
    zone appservers 64k;       
        server appserv1.example.com weight=5;
        server appserv2.example.com:8080 fail_timeout=5s;
        server reserve1.example.com:8080 backup;
        server reserve2.example.com:8080 down;
    }       
}      

2、配置更新後,重載配置,以保證配置生效,如上操作無法實作動态更新,即時性較差。

而通過 API 動态更新 Upstream,就可以解決如上的問題。

哪些場景會用到該功能呢?

  • 自動擴容:當需要往 Upstream group 中添加更多的 server 時;​
  • 伺服器成員維護:當你需要移除一個 server,或指定一個 server 為備份伺服器時,或暫時關閉一個 server 停止提供服務時;
  • 快速設定伺服器屬性:諸如當你需要改變伺服器權重、活動連接配接、緩慢啟動、故障逾時等屬性需求時。
  • 伺服器狀态監控:當需要用一個指令來獲得伺服器或伺服器組的狀态時。

如何啟用動态 Upstream API

通過以下代碼配置 Upstream 清單以及反向代理,并且開啟 API 動态:

API 動态更新 Upstream

用 API 指令開啟 / 關閉 NGINX API, write=on 表示以讀寫模式打開。write 預設不寫,代表 off,僅支援查詢操作。

動态 API 更新 Upstream 應用例子

1、動态添加 Server

可以以 IP 位址形式動态添加 server,執行如下指令:

curl -v -X POST -s http://192.168.40.111:8181/zxlapi/7/http/upstreams/cluster1/servers -d '{"server": "192.168.40.135:8080"}'|jq .      

傳回結果如下圖:

API 動态更新 Upstream

也可以以域名方式動态添加:

curl -v -X POST -s http://192.168.40.111:8181/zxlapi/7/http/upstreams/cluster1/servers -d '{"server": "serv110.tmzy.com:8080"}'|jq .      

以域名方式添加的 server 不同之處在于,域名方式添加的 server 會作為父 server 存在,它也會占用一個 server id, 其下可能關聯一個或更多個子 server。

2、動态修改 server

修改指令參考如下:

curl -v -X PATCH -s http://192.168.40.111:8181/zxlapi/7/http/upstreams/cluster1/servers/6 -d '{"backup": false, "weight": 10 }' |jq .      
  • 修改後随即會傳回修改的 server 的基本資訊,不包括健康狀況,請求響應等資訊。​
  • 注意,以域名形式添加的 server,父 server 和子 server 都支援修改,互不影響。

3、動态删除 server

删除指令參考如下:

curl -X DELETE -s http://192.168.40.111:8181/zxlapi/7/http/upstreams/cluster1/servers/1 |jq .      
  • 以 IP 形式添加的 server,執行删除指令後,随即傳回結果就可以看見成功删除了一條。​
  • 以域名形式添加的 server,執行删除父 server 指令後,父 server 和其下所有子 server 會一并删除。
  • 以域名形式添加的 server,執行删除子 server 指令後,要進行提示校驗,不允許删除子 server。

4、查詢 server​

指令參考如下:

curl -v http://192.168.40.111:8181/zxlapi/7/http/upstreams/cluster1/servers/ server_id | jq .      

以域名方式添加的子 server 的查詢傳回結果如下:會比 IP 形式添加的 server 多出 parent 和 host 兩個字段。

API 動态更新 Upstream
http {
    # ...
    upstream appservers {
        zone appservers 64k;
        state /var/lib/nginx/state/appservers.conf;
        
        # All servers are defined in the state file
        # server appserv1.example.com      weight=5;
        # server appserv2.example.com:8080 fail_timeout=5s;
       
    }
}      

繼續閱讀