Nginx(四) nginx+consul+upasync 在ubnutu18帶桌面系統 實現動態負載均衡

 

1.1 什麼是動態負載均衡

傳統的負載均衡,若是Upstream參數發生變化,每次都須要從新加載nginx.conf文件,所以擴展性不是很高,因此咱們能夠採用動態負載均衡,實現Upstream可配置化、動態化,無需人工從新加載nginx.conf。
這相似分佈式的配置中心

1.2 動態負載均衡實現方案

1.Consul+Consul-template 每次發現配置更改須要raload nginx,重啓Nginx。(不推薦)
2.Consul+OpenResty 實現無需raload動態負載均衡。(推薦)
3.Consul+upsync+Nginx  實現無需raload動態負載均衡 (推薦) 

1.3 經常使用服務器註冊與發現框架

 常見服務發現框架 Consul、Eureka、 ZooKeeper以及Etcd  ZooKeeper是這種類型的項目中歷史最悠久的之一,它起源於Hadoop。它很是成熟、可靠,被許多大公司(YouTube、eBay、雅虎等)使用。
etcd是一個採用HTTP協議的健
/值對存儲系統,它是一個分佈式和功能層次配置系統,可用於構建服務發現系統。其很容易部署、安裝和使用,提供了可靠的數據持久化特性。它是安全的而且文檔也十分齊全。

2 Consul快速入門

Consul是一款開源的分佈式服務註冊與發現系統,經過HTTP API可使得服務註冊、發現實現起來很是簡單,它支持以下特性。

服務註冊:服務實現者能夠經過HTTP API或DNS方式,將服務註冊到Consul。
服務發現:服務消費者能夠經過HTTP API或DNS方式,從Consul獲取服務的IP和PORT。
故障檢測:支持如TCP、HTTP等方式的健康檢查機制,從而當服務有故障時自動摘除。
K/V存儲:使用K/V存儲實現動態配置中心,其使用HTTP長輪詢實現變動觸發和配置更改。
多數據中心:支持多數據中心,能夠按照數據中心註冊和發現服務,即支持只消費本地機房服務,使用多數據中心集羣還能夠避免單數據中心的單點故障。
Raft算法:Consul使用Raft算法實現集羣數據一致性。

經過Consul能夠管理服務註冊與發現,接下來須要有一個與Nginx部署在同一臺機器的Agent來實現Nginx配置更改和Nginx重啓功能。咱們有Confd或者Consul-template兩個選擇,
而Consul-template是Consul官方提供的,咱們就選擇它了。其使用HTTP長輪詢實現變動觸發和配置更改(使用Consul的watch命令實現)。
也就是說,咱們使用Consul-template實現配置模板,而後拉取Consul配置渲染模板來生成Nginx實際配置。

2.1 Consul環境搭建

1.下載consul_1.5.0_linux_amd64.ziphtml

wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip

2.解壓consul_1.5.0_linux_amd64.zip java

unzip consul_1.5.0_linux_amd64.zip

 

3. 執行如下 ./consul 出現如下信息就說明安裝成功node

root@brian-System-Product-Name:/usr/local# ./consul
usage: consul [--version] [--help] <command> [<args>]
Available commands are:
    agent          Runs a Consul agent
    configtest     Validate config file
    event          Fire a new event
    exec           Executes a command on Consul nodes
    force-leave    Forces a member of the cluster to enter the "left" state
    info           Provides debugging information for operators
    join           Tell Consul agent to join cluster
    keygen         Generates a new encryption key
    keyring        Manages gossip layer encryption keys
    kv             Interact with the key-value store
    leave          Gracefully leaves the Consul cluster and shuts down
    lock           Execute a command holding a lock
    maint          Controls node or service maintenance mode
    members        Lists the members of a Consul cluster
    monitor        Stream logs from a Consul agent
    operator       Provides cluster-level tools for Consul operators
    reload         Triggers the agent to reload configuration files
    rtt            Estimates network round trip time between nodes
    snapshot       Saves, restores and inspects snapshots of Consul server state
    version        Prints the Consul version
    watch          Watch for changes in Consul

4.啓動consul linux

個人linux Ip地址192.168.0.102nginx

./consul agent -dev -ui -node=consul-dev -client=192.168.0.102

5.瀏覽器訪問192.168.0.102:8500 (注意檢查關閉防火牆)git

 

6.使用postman發送PUT請求 註冊Http服務github

我這裏就註冊兩個服務
http://192.168.0.102:8500/v1/catalog/register

參數說明:Datacenter指定數據中心,
     Address指定服務IP,
        Service.Id指定服務惟一標識,
        Service.Service指定服務分組,
        Service.tags指定服務標籤(如測試環境、預發環境等),
        Service.Port指定服務端口。

參數 requestbody 1--------
{
"Datacenter":"dc1",
"Node":"tomcat",
"Address":"192.168.0.102",
"Service":{
"Id":"192.168.0.102:8080",
"Service":"xuduocloud",
"tags":[
"dev"
],
"Port":8088}
}

參數 requestbody 2--------
{
"Datacenter":"dc1",
"Node":"tomcat",
"Address":"192.168.0.102",
"Service":{
"Id":"192.168.0.102:8082",
"Service":"xuduocloud",
"tags":[
"dev"
],
"Port":8088}
}

 

7.發現Http服務 http://192.168.0.102:8500/v1/catalog/service/xuduocloud算法

 

3 nginx + consul + upasync 動態負載均衡

3.1 nginx-upsync-module簡介

Upsync是新浪微博開源的基於Nginx實現動態配置的三方模塊。Nginx-Upsync-Module的功能是拉取Consul的後端server的列表,並動態更新Nginx的路由信息。此模塊不依賴於任何第三方模塊。
Consul做爲Nginx的DB,利用Consul的KV服務,每一個Nginx Work進程獨立的去拉取各個upstream的配置,並更新各自的路由。

3.2 nginx-upsync-module安裝

下載Nginx
wget http://nginx.org/download/nginx-1.15.12.tar.gz
做用:實現反向代理、負載負載庫

下載consul
wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip
做用:對動態負載均衡均配置實現註冊

下載nginx-upsync-module
wget https://github.com/weibocom/nginx-upsync-module/archive/master.zip
做用:nginx動態獲取最新upstream信息

3.2.1 解壓安裝 nginx-upsync-module和consul後端

unzip master.zip
unzip consul_1.5.0_linux_amd64.zip 

3.2.2 安裝Nginx瀏覽器

解壓Nginx

tar -zxvf nginx-1.15.0.tar.gz

配置Nginx 

groupadd nginx

useradd -g nginx -s /sbin/nologin nginx

mkdir -p /var/tmp/nginx/client/

mkdir -p /usr/local/nginx

編譯Nginx

cd nginx-1.15.12


./configure   --prefix=/usr/local/nginx   --user=nginx   --group=nginx   --with-http_ssl_module   --with-http_flv_module   --with-http_stub_status_module   
--with-http_gzip_static_module --with-http_realip_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi
--with-pcre --add-module=../nginx-upsync-module-master make && make install

備註: --add-module=../nginx-upsync-module-master 對應master.zip解壓的路徑

這裏編譯可能會報錯,缺乏依賴的插件

./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

 解決辦法

sudo apt-get install libpcre3 libpcre3-dev

sudo apt-get install ruby

sudo apt-get install zlib1g-dev

Upstream 動態配置

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    
    ##動態去consul 獲取註冊的真實反向代理地址
       upstream kawa{
            server 127.0.0.1:11111;
            upsync 192.168.0.102:8500/v1/kv/upstreams/xuduocloud upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
upsync_dump_path
/usr/local/nginx/conf/servers/servers_test.conf; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://kawa; proxy_connect_timeout 2; #nginx跟後端服務器鏈接超時時間(代理鏈接超時) proxy_send_timeout 2; #後端服務器數據回傳時間(代理髮送超時) proxy_read_timeout 2; #鏈接成功後,後端服務器響應時間(代理接收超時) index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

upsync指令指定從consul哪一個路徑拉取上游服務器配置;

upsync_timeout配置從consul拉取上游服務器配置的超時時間;

upsync_interval配置從consul拉取上游服務器配置的間隔時間;

upsync_type指定使用consul配置服務器;

strong_dependency配置nginx在啓動時是否強制依賴配置服務器,若是配置爲on,則拉取配置失敗時nginx啓動一樣失敗。

upsync_dump_path指定從consul拉取的上游服務器後持久化到的位置,這樣即便consul服務器出問題了,本地還有一個備份。 

3.3 建立upsync_dump_path

mkdir /usr/local/nginx/conf/servers/

3.4 啓動consul

#ip地址對應的虛擬機IP地址
./consul agent -dev -ui -node=consul-dev -client=192.168.0.102

#這邊上面已經啓動了consul,這裏只須要重啓下,先殺死進程在啓動
kill -9 31200
./consul agent -dev -ui -node=consul-dev -client=192.168.0.102

3.5 添加nginx  Upstream服務

3.5.1 使用linux命令方式發送put請求

curl -X PUT http://192.168.0.102:8500/v1/kv/upstreams/xuduocloud/192.168.0.102:8080
curl -X PUT http://192.168.0.102:8500/v1/kv/upstreams/xuduocloud/192.168.0.102:8082
curl -X PUT http://192.168.0.102:8500/v1/kv/upstreams/xuduocloud/192.168.0.102:8083

3.5.2 使用postmen 發送put請求 負載均衡信息參數  {"weight":1, "max_fails":2, "fail_timeout":10, "down":0},我這邊演示下postman動態添加upstream服務

 4.演示動態負載均衡

4.1 啓動三個測試服務,並用瀏覽器訪問是否可用

#端口8080
java -jar responsibilitychain-0.0.1-SNAPSHOT.jar & #端口8082
java
-jar strategy-0.0.1-SNAPSHOT.jar & #端口8083
java
-jar template-0.0.1-SNAPSHOT.jar &

4.2 使用postman 添加upstream服務

4.3 使用瀏覽器查看下注冊結果

 備註:若是要加權重 添加 {"weight":2, "max_fails":2, "fail_timeout":10, "down":0} 點擊save,既能夠動態的修改upstarm負載的策略

4.4 測試負載均衡,本地瀏覽器訪問localhost,此處就截一張圖了

 

相關文章
相關標籤/搜索