consul是一個服務發現和配置共享的服務軟件,結合nginx的主動健康檢查模塊nginx_upstream_check_module和服務發現模塊nginx-upsync-module,實現一套服務動態發現機制。nginx的upstream再也不經過手動配置,而是定時向consul發送請求,獲取consul數據中心的配置文件,動態更新upstream地址池。node
consul:是一個支持多數據中心分佈式高可用的服務發現和配置共享的服務軟件mysql
nginx_upstream_check_module:nginx主動健康檢查模塊linux
nginx-upsync-module:nginx服務發現模塊nginx
nginx須要編譯兩個模塊:git
nginx_upstream_check_module:nginx主動健康檢查模塊github
https://github.com/xiaokai-wang/nginx_upstream_check_moduleweb
nginx-upsync-module:nginx服務發現模塊sql
https://github.com/weibocom/nginx-upsync-modulebootstrap
官網 https://www.consul.io後端
下載consul,linux 64位
下載解壓便可,產生一個consul可執行文件。
./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,出現以下頁面,則啓動成功
關閉
./consul leave
查當作員
./consul members
以上介紹的都是以單機模式啓動,實戰中consul多以集羣模式存在,建議server節點數爲3~5個。如下以3臺爲例,分別爲ip一、ip二、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 加入一個集羣
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
健康檢查模塊提供了一個接口check_status,用於檢查consul數據中心配置的全部server的健康檢查狀態。須要在nginx稍做配置:
在80端口下,配置nstatus的接口:
location /nstatus {
check_status;
access_log off;
}
訪問consul節點的ip/nstatus
輸入【http://ip:8500/ui】進入consulweb控制檯
進入consu首頁,點擊進入【KEY/VALUE】,此處即爲配置upstream的位置。
Key以「/」結尾,則建立了一個文件夾,不然建立了一個key。
此處的文件夾路徑即爲upsync指令請求的路徑。
value默認值爲{"weight":1, "max_fails":2, "fail_timeout":10},因此不配置value也是能夠的
寫入本地文件是這樣的: