Consul集群配置consul原理
上圖是官網(wǎng)提供的一個(gè)事例系統(tǒng)圖肤无,圖中的Server是consul服務(wù)端高可用集群,Client是consul客戶端。consul客戶端不保存數(shù)據(jù),客戶端將接收到的請求轉(zhuǎn)發(fā)給響應(yīng)的Server端未斑。Server之間通過局域網(wǎng)或廣域網(wǎng)通信實(shí)現(xiàn)數(shù)據(jù)一致性。每個(gè)Server或Client都是一個(gè)consul agent币绩。
Consul集群間使用了GOSSIP協(xié)議通信和raft一致性算法蜡秽。上面這張圖涉及到了很多術(shù)語:3A網(wǎng)絡(luò)科技致力于提供最穩(wěn)定最快速的云服務(wù)器建設(shè)府阀,通過高速的cn2線路顯著提升網(wǎng)絡(luò)速度,搭配企業(yè)級硬件設(shè)備竭誠為客戶提供高效且可靠的服務(wù)器應(yīng)用方案载城,加上十幾年專業(yè)團(tuán)隊(duì)的協(xié)作來保障服務(wù)器的高質(zhì)量以及超高安全性肌似。更多請?jiān)L問http://iis3.com/server/
Agent——agent是一直運(yùn)行在Consul集群中每個(gè)成員上的守護(hù)進(jìn)程。通過運(yùn)行consul agent來啟動诉瓦。agent可以運(yùn)行在client或者server模式川队。指定節(jié)點(diǎn)作為client或者server是非常簡單的,除非有其他agent實(shí)例睬澡。所有的agent都能運(yùn)行DNS或者HTTP接口固额,并負(fù)責(zé)運(yùn)行時(shí)檢查和保持服務(wù)同步。
Client——一個(gè)Client是一個(gè)轉(zhuǎn)發(fā)所有RPC到server的代理煞聪。這個(gè)client是相對無狀態(tài)的斗躏。client唯一執(zhí)行的后臺活動是加入LAN gossip池。這有一個(gè)最低的資源開銷并且僅消耗少量的網(wǎng)絡(luò)帶寬昔脯。
Server——一個(gè)server是一個(gè)有一組擴(kuò)展功能的代理啄糙,這些功能包括參與Raft選舉,維護(hù)集群狀態(tài)云稚,響應(yīng)RPC查詢隧饼,與其他數(shù)據(jù)中心交互WAN gossip和轉(zhuǎn)發(fā)查詢給leader或者遠(yuǎn)程數(shù)據(jù)中心。
DataCenter——雖然數(shù)據(jù)中心的定義是顯而易見的静陈,但是有一些細(xì)微的細(xì)節(jié)必須考慮燕雁。例如,在EC2中鲸拥,多個(gè)可用區(qū)域被認(rèn)為組成一個(gè)數(shù)據(jù)中心拐格。我們定義數(shù)據(jù)中心為一個(gè)私有的,低延遲和高帶寬的一個(gè)網(wǎng)絡(luò)環(huán)境刑赶。這不包括訪問公共網(wǎng)絡(luò)捏浊,但是對于我們而言,同一個(gè)EC2中的多個(gè)可用區(qū)域可以被認(rèn)為是一個(gè)數(shù)據(jù)中心的一部分撞叨。
Consensus——一致性金踪,使用Consensus來表明就leader選舉和事務(wù)的順序達(dá)成一致。為了以容錯(cuò)方式達(dá)成一致谒所,一般有超過半數(shù)一致則可以認(rèn)為整體一致。Consul使用Raft實(shí)現(xiàn)一致性沛申,進(jìn)行l(wèi)eader選舉劣领,在consul中的使用bootstrap時(shí),可以進(jìn)行自選铁材,其他server加入進(jìn)來后bootstrap就可以取消尖淘。
Gossip——Consul建立在Serf的基礎(chǔ)之上奕锌,它提供了一個(gè)用于多播目的的完整的gossip協(xié)議。Serf提供成員關(guān)系村生,故障檢測和事件廣播惊暴。Serf是去中心化的服務(wù)發(fā)現(xiàn)和編制的解決方案,節(jié)點(diǎn)失敗偵測與發(fā)現(xiàn)趁桃,具有容錯(cuò)辽话、輕量、高可用的特點(diǎn)卫病。
LAN Gossip——它包含所有位于同一個(gè)局域網(wǎng)或者數(shù)據(jù)中心的所有節(jié)點(diǎn)油啤。
WAN Gossip——它只包含Server。這些server主要分布在不同的數(shù)據(jù)中心并且通常通過因特網(wǎng)或者廣域網(wǎng)通信蟀苛。
RPC——遠(yuǎn)程過程調(diào)用益咬。這是一個(gè)允許client請求server的請求/響應(yīng)機(jī)制。
在每個(gè)數(shù)據(jù)中心帜平,client和server是混合的幽告。一般建議有3-5臺server。這是基于有故障情況下的可用性和性能之間的權(quán)衡結(jié)果裆甩,因?yàn)樵蕉嗟臋C(jī)器加入達(dá)成共識越慢冗锁。然而,并不限制client的數(shù)量淑掌,它們可以很容易的擴(kuò)展到數(shù)千或者數(shù)萬臺蒿讥。
同一個(gè)數(shù)據(jù)中心的所有節(jié)點(diǎn)都必須加入gossip協(xié)議。這意味著gossip協(xié)議包含一個(gè)給定數(shù)據(jù)中心的所有節(jié)點(diǎn)抛腕。這服務(wù)于幾個(gè)目的:第一芋绸,不需要在client上配置server地址。發(fā)現(xiàn)都是自動完成的担敌。第二摔敛,檢測節(jié)點(diǎn)故障的工作不是放在server上,而是分布式的全封。這是的故障檢測相比心跳機(jī)制有更高的可擴(kuò)展性马昙。第三:它用來作為一個(gè)消息層來通知事件,比如leader選舉發(fā)生時(shí)刹悴。
每個(gè)數(shù)據(jù)中心的server都是Raft節(jié)點(diǎn)集合的一部分行楞。這意味著它們一起工作并選出一個(gè)leader,一個(gè)有額外工作的server土匀。leader負(fù)責(zé)處理所有的查詢和事務(wù)子房。作為一致性協(xié)議的一部分,事務(wù)也必須被復(fù)制到所有其他的節(jié)點(diǎn)。因?yàn)檫@一要求证杭,當(dāng)一個(gè)非leader得server收到一個(gè)RPC請求時(shí)田度,它將請求轉(zhuǎn)發(fā)給集群leader。
server節(jié)點(diǎn)也作為WAN gossip Pool的一部分解愤。這個(gè)Pool不同于LAN Pool镇饺,因?yàn)樗菫榱藘?yōu)化互聯(lián)網(wǎng)更高的延遲,并且它只包含其他Consul server節(jié)點(diǎn)送讲。這個(gè)Pool的目的是為了允許數(shù)據(jù)中心能夠以low-touch的方式發(fā)現(xiàn)彼此奸笤。這使得一個(gè)新的數(shù)據(jù)中心可以很容易的加入現(xiàn)存的WAN gossip。因?yàn)閟erver都運(yùn)行在這個(gè)pool中李茫,它也支持跨數(shù)據(jù)中心請求揭保。當(dāng)一個(gè)server收到來自另一個(gè)數(shù)據(jù)中心的請求時(shí),它隨即轉(zhuǎn)發(fā)給正確數(shù)據(jù)中想一個(gè)server魄宏。該server再轉(zhuǎn)發(fā)給本地leader秸侣。
這使得數(shù)據(jù)中心之間只有一個(gè)很低的耦合,但是由于故障檢測宠互,連接緩存和復(fù)用味榛,跨數(shù)據(jù)中心的請求都是相對快速和可靠的。3A網(wǎng)絡(luò)科技致力于提供最穩(wěn)定最快速的云服務(wù)器建設(shè)予跌,通過高速的cn2線路顯著提升網(wǎng)絡(luò)速度搏色,搭配企業(yè)級硬件設(shè)備竭誠為客戶提供高效且可靠的服務(wù)器應(yīng)用方案,加上十幾年專業(yè)團(tuán)隊(duì)的協(xié)作來保障服務(wù)器的高質(zhì)量以及超高安全性券册。更多請?jiān)L問http://iis3.com/server/
consul環(huán)境準(zhǔn)備
IP節(jié)點(diǎn)名稱Consul角色
consul下載和目錄創(chuàng)建
https://releases.hashicorp.com/consul/1.4.3/consul_1.4.3_linux_amd64.zip
unzip consul_1.4.3_linux_amd64.zip
mv consul /usr/local/bin/
mkdir -p /data/consul/{data,config} #創(chuàng)建數(shù)據(jù)目錄和配置目錄
consul acl
對數(shù)據(jù)中心的每個(gè)server频轿,添加/data/consul/config/acl_config.json配置:
參考:《consul ACL配置使用》
consul agent參數(shù)
consul agent --help
-advertise:通知展現(xiàn)地址用來改變我們給集群中的其他節(jié)點(diǎn)展現(xiàn)的地址,一般情況下-bind地址就是展現(xiàn)地址
-bootstrap:用來控制一個(gè)server是否在bootstrap模式烁焙,在一個(gè)datacenter中只能有一個(gè)server處于bootstrap模式航邢,當(dāng)一個(gè)server處于bootstrap模式時(shí),可以自己選舉為raft leader骄蝇。
-bootstrap-expect:在一個(gè)datacenter中期望提供的server節(jié)點(diǎn)數(shù)目膳殷,當(dāng)該值提供的時(shí)候,consul一直等到達(dá)到指定sever數(shù)目的時(shí)候才會引導(dǎo)整個(gè)集群九火,該標(biāo)記不能和bootstrap公用赚窃。
-bind:該地址用來在集群內(nèi)部的通訊,集群內(nèi)的所有節(jié)點(diǎn)到地址都必須是可達(dá)的岔激,默認(rèn)是0.0.0.0勒极。
-client:consul綁定在哪個(gè)client地址上,這個(gè)地址提供HTTP虑鼎、DNS辱匿、RPC等服務(wù),默認(rèn)是127.0.0.1。
-config-file:明確的指定要加載哪個(gè)配置文件掀鹅。
-config-dir:配置文件目錄,里面所有以.json結(jié)尾的文件都會被加載
-data-dir:提供一個(gè)目錄用來存放agent的狀態(tài)媒楼,所有的agent都需要該目錄乐尊,該目錄必須是穩(wěn)定的,系統(tǒng)重啟后都繼續(xù)存在划址。
-dc:該標(biāo)記控制agent的datacenter的名稱扔嵌,默認(rèn)是dc1。
-encrypt:指定secret key夺颤,使consul在通訊時(shí)進(jìn)行加密痢缎,key可以通過consul keygen生成,同一個(gè)集群中的節(jié)點(diǎn)必須使用相同的key世澜。
-join:加入一個(gè)已經(jīng)啟動的agent的ip地址独旷,可以多次指定多個(gè)agent的地址词爬。如果consul不能加入任何指定的地址中泡嘴,則agent會啟動失敗盒延。默認(rèn)agent啟動時(shí)不會加入任何節(jié)點(diǎn)禽捆。
-retry-join:和join類似恕洲,但是允許你在第一次失敗后進(jìn)行嘗試西采。
-retry-interval:兩次join之間的時(shí)間間隔举塔,默認(rèn)是30s罩锐。
-retry-max:嘗試重復(fù)join的次數(shù)诺舔,默認(rèn)是0鳖昌,也就是無限次嘗試。
-log-level:consul agent啟動后顯示的日志信息級別低飒。默認(rèn)是info许昨,可選:trace、debug逸嘀、info车要、warn、err崭倘。
-node:節(jié)點(diǎn)在集群中的名稱翼岁,在一個(gè)集群中必須是唯一的,默認(rèn)是該節(jié)點(diǎn)的主機(jī)名司光。
-protocol:consul使用的協(xié)議版本琅坡。
-rejoin:使consul忽略先前的離開,在agent再次啟動后仍舊嘗試加入集群中残家。也就是說如果不加入這個(gè)參數(shù)榆俺,當(dāng)前節(jié)點(diǎn)一旦退出,下次重啟后是不會自動加入到集群中去的,除非是手動觸發(fā) consul join xxxx 茴晋,所以為了降低重啟后對本身服務(wù)的影響陪捷,這里統(tǒng)一使用 -rejoin參數(shù)。
-server:定義agent運(yùn)行在server模式诺擅,每個(gè)集群至少有一個(gè)server市袖,建議每個(gè)集群的server不要超過5個(gè)。
-syslog:開啟系統(tǒng)日志功能烁涌,只在linux/osx上生效苍碟。
-ui:啟用內(nèi)置Web UI服務(wù)
-ui-dir:提供存放web ui資源的路徑,該目錄必須是可讀的撮执。
-pid-file:提供一個(gè)路徑來存放pid文件微峰,可以使用該文件進(jìn)行SIGINT/SIGHUP(關(guān)閉/更新)agent。
consul配置文件
本文不適用acl規(guī)則
10.200.119.171:/etc/sysconfig/consul
CMD_OPTS="agent -server -data-dir=/data/consul/data -node=s1 -config-dir=/data/consul/config -bind=10.200.119.171 -rejoin -client=0.0.0.0 -bootstrap"
10.200.119.172:/etc/sysconfig/consul
CMD_OPTS="agent -server -data-dir=/data/consul/data -node=s2 -config-dir=/data/consul/config -bind=10.200.119.172 -rejoin -client=0.0.0.0"
10.200.119.173:/etc/sysconfig/consul
CMD_OPTS="agent -server -data-dir=/data/consul/data -node=s3 -config-dir=/data/consul/config -bind=10.200.119.173 -rejoin -client=0.0.0.0"
10.200.119.60:/etc/sysconfig/consul
CMD_OPTS="agent -ui -data-dir=/data/consul/data -node=c1 -config-dir=/data/consul/config -bind=10.200.119.60 -rejoin -client=0.0.0.0"
consul systemd自啟動
cat?>?/lib/systemd/system/consul.service?<<EOF
[Unit]
Description=Consul is a tool for service discovery and configuration. Consul is distributed, highly available, and extremely scalable.
Documentation=http://www.consul.io
After=network-online.target
Wants=network-online.target
[Service]
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=100000
EnvironmentFile=-/etc/sysconfig/consul
ExecStart=/usr/local/bin/consul \$CMD_OPTS
ExecReload=/bin/kill -HUP \$MAINPID
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target
EOF
systemctl enable consul
consul節(jié)點(diǎn)加入集群
4個(gè)節(jié)點(diǎn)分別啟動consul
systemctl start consul
在s2抒钱、s3蜓肆、c1加入s1集群,如下:
consul join 10.200.119.171
consul查看狀態(tài)
[root@10-200-119-60 ~]# consul members
Node Address Status Type Build Protocol DC Segment
s1 10.200.119.171:8301 alive server 1.4.3 2 dc1?<all>
s2 10.200.119.172:8301 alive server 1.4.3 2 dc1?<all>
s3 10.200.119.173:8301 alive server 1.4.3 2 dc1?<all>
c1 10.200.119.60:8301 alive client 1.4.3 2 dc1?<default>
consul UI