1、概述
1.1 介紹
consul是一個服務發現和配置共享的服務軟件,結合nginx的主動健康檢查模塊nginx_upstream_check_module和服務發現模塊nginx-upsync-module,實現一套服務動態發現機制。nginx的upstream不再通過手動配置,而是定時向consul發送請求,獲取consul數據中心的配置文件,動態更新upstream地址池。
1.2 術語
consul:是一個支持多數據中心分布式高可用的服務發現和配置共享的服務軟件
nginx_upstream_check_module:nginx主動健康檢查模塊
nginx-upsync-module:nginx服務發現模塊
2、安裝
2.1 nginx
nginx需要編譯兩個模塊:
nginx_upstream_check_module:nginx主動健康檢查模塊
https://github.com/xiaokai-wang/nginx_upstream_check_module
nginx-upsync-module:nginx服務發現模塊
https://github.com/weibocom/nginx-upsync-module
2.2 consul
官網 https://www.consul.io
下載consul,linux 64位
下載解壓即可,產生一個consul可執行文件。
./consul 列出一些常用指令。
2.3 consul啟動
./consul agent -server –bootstrap-expect 1 –data-dir /tmp/consul –bind=10.10.49.193 –ui –client 0.0.0.0 &
i. server: 以server身份啟動。
ii. bootstrap-expect:集群要求的最少server數量,當低於這個數量,集群即失效。經測試,低於這個數量也不影響訪問
iii. data-dir:data存放的目錄,更多信息請參閱consul數據同步機制
iv. node:節點id,在同一集群不能重復。
v. bind:監聽的ip地址。
vi. client 客戶端的ip地址
vii. & :在后台運行,此為linux腳本語法
viii. ui:啟動webui,端口8500
訪問ip:8500/ui,出現如下頁面,則啟動成功
2.4 consul其它命令
關閉
./consul leave
查看成員
./consul members
2.5 啟動consul集群
以上介紹的都是以單機模式啟動,實戰中consul多以集群模式存在,建議server節點數為3~5個。以下以3台為例,分別為ip1、ip2、ip3:
./consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=consul1 -bind=ip1 -ui -client=0.0.0.0 &
./consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=consul2 -bind=ip2 -join=ip1 -ui -client=0.0.0.0 &
./consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=consul3 -bind=ip3 -join=ip1 -ui -client=0.0.0.0 &
-join 加入一個集群
3、使用
3.1 nginx&upstream配置
consul是針對nginx的upstream所做的一項改善,地址池不再需要手動配置,而是從consul的數據中心抓取。新的upstream配置如下:
1 upstream tomcat_http_server { 2 server 127.0.0.1:11111; 3 upsync 10.10.49.193:8500/v1/kv/upstreams/tomcat_http_server upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off; 4 upsync_dump_path /usr/local/nginx/conf/server/server_test.conf; 5 6 check interval=1000 rise=2 fall=2 timeout=3000 type=http default_down=false; 7 check_http_send "HEAD / HTTP/1.0\r\n\r\n"; 8 check_http_expect_alive http_2xx http_3xx; 9 }
server 127.0.0.1:11111是占位機器,這個配置必須要有不然校驗配置文件不通過。
upsync配置語法:
upsync $consul/etcd.api.com:$port/v1/kv/upstreams/$upstream_name/ [upsync_type=consul/etcd] [upsync_interval=second/minutes] [upsync_timeout=second/minutes] [strong_dependency=off/on]
默認upsync_interval=5s upsync_timeout=6m strong_dependency=off
10.10.49.193:8500/v1/kv/upstreams/tomcat_http_server為同步地址;upsync_timeout同步超時時間;upsync_interval同步間隔;upsync_type同步類型,默認為consul;strong_dependency,配置為on時,每次啟動或重啟nginx,都會強制去consul拉一次upstream servers。
upsync_dump_path將拉取到的upstreams地址池寫入一個文件;
此處想要多說兩句,即使consul中途掛掉,nginx仍然可以從upsync_dump_path配置的文件中取到數據,繼續分發流量,只是此時upstream池變為靜態了,跟之前的情形一樣,啟停重啟nginx等操作並沒有問題。所以consul單節點配置中心的可用性也是很高的。
upsync更多指令請閱讀
https://github.com/weibocom/nginx-upsync-module#upsync
check代表健康檢查;interval檢查間隔,單位為毫秒;rise成功該次數后,標記為up;fall失敗該次數后,標記為down;timeout;type包括tcp、ssl_hello、http、mysql、ajp、fastcgi;default_down設置后端server的初始狀態;
默認配置interval=30000 fall=5 rise=2 timeout=1000 default_down=true type=tcp
check_http_send 健康檢查發送的請求包;
check_http_expect_alive 這些狀態代表后端server是活着的;
check更多指令請閱讀
https://github.com/xiaokai-wang/nginx_upstream_check_module
3.2 查詢健康檢查狀態
健康檢查模塊提供了一個接口check_status,用於檢查consul數據中心配置的所有server的健康檢查狀態。需要在nginx稍作配置:
在80端口下,配置nstatus的接口:
location /nstatus {
check_status;
access_log off;
}
訪問consul節點的ip/nstatus
3.3 consul配置
輸入【http://ip:8500/ui】進入consulweb控制台
進入consu首頁,點擊進入【KEY/VALUE】,此處即為配置upstream的位置。
Key以“/”結尾,則創建了一個文件夾,否則創建了一個key。
此處的文件夾路徑即為upsync指令請求的路徑。
value默認值為{"weight":1, "max_fails":2, "fail_timeout":10},所以不配置value也是可以的
寫入本地文件是這樣的: