Consul運維和監(jiān)控

簡介

這個章節(jié)中的內(nèi)容包含一系列運維高級指南胀蛮,包括高級網(wǎng)絡(luò)配置裕便、安全設(shè)置佑稠、中斷恢復荔泳、監(jiān)控和故障排除秒梳。

Consul集群監(jiān)控和指標

用戶在設(shè)置完數(shù)據(jù)中心之后拷泽,需要確保部署正常并建立基準指標渤闷。本指南將從兩大部分介紹幾種類型的指標:Consul健康指標和服務(wù)器健康指標蝙叛。
Consul健康指標:

  • 事務(wù)時間(Transaction Timing)
  • 領(lǐng)導者變更(Leadership Changes)
  • 自動駕駛(Autopilot)
  • 垃圾回收(Garbage Collection)

服務(wù)器健康指標:

  • 文件描述符(File Descriptors)
  • CPU使用率(CPU Usage)
  • 網(wǎng)絡(luò)活動(Network Activity)
  • 磁盤活動(Disk Activity)
  • 內(nèi)存使用情況(Memory Usage)

對于每個指標襟诸,我們會闡述其重要性所在享潜,也會確定指標數(shù)值困鸥,判定健康及不健康狀態(tài)。
首先剑按,我們需要了解三種收集指標的方法:SIGUSR1疾就、HTTP APItelemetry艺蝴。在開始閱讀本指南前猬腰,建議用戶已經(jīng)配置了ACL

如何收集指標

總共有三種收集指標的方案猜敢。第一個姑荷,也是最簡單的方法是使用SIGUSR1一次性轉(zhuǎn)儲當前測量值;第二種方法是使用HTTP API獲得類似的一次性轉(zhuǎn)儲缩擂;第三種方法(也是最常用于長期監(jiān)視的一種方法)是在Consul配置文件中啟用telemetry鼠冕。

本地使用

為了獲得當前指標的一次性轉(zhuǎn)儲,我們可以將SIGUSR1信號發(fā)送到Consul進程胯盯。

kill -USR1 <process_id>

輸出內(nèi)容將發(fā)送到系統(tǒng)日志懈费,例如/var/log/messagesjournald。如果用戶正在通過Consul監(jiān)聽器監(jiān)控終端中的Consul流程博脑,會在輸出中看到指標信息憎乙。
盡管這是快速了解單個Consul代理運行狀況的最簡單方法薄坏,但隨時間變化查看指標情況更有意義。

API GET請求

接下來寨闹,我們使用HTTP API快速收集指標:

curl http://127.0.0.1:8500/v1/agent/metrics

在生產(chǎn)中,用戶會使用ACL令牌設(shè)置憑據(jù)并啟用TLS以進行安全通信君账。一旦配置了ACL繁堡,就需要在請求中傳遞令牌。

curl --header "X-Consul-Token: <YOUR_ACL_TOKEN>" \
    https://127.0.0.1:8500/v1/agent/metrics

這是一種快速收集指標的好方法乡数,除此之外還可以將其添加到腳本中椭蹄,或者與支持HTTP抓取數(shù)據(jù)的監(jiān)控代理(例如Prometheus)一起使用,做到數(shù)據(jù)可視化净赴。

啟用telemetry

最后绳矩,我們可以配置Consul將遙測數(shù)據(jù)發(fā)送到遠程監(jiān)控系統(tǒng)。這樣玖翅,用戶就可以在時間維度上監(jiān)控代理的運行狀態(tài)翼馆,發(fā)現(xiàn)指標趨勢,并為將來的需求提前進行計劃金度。為此应媚,用戶需要監(jiān)控代理程序和一個控制臺。
Consul支持以下遙測(telemetry)代理:

  • Circonus
  • DataDog(通過 dogstatsd
  • StatsD(通過 statsd猜极、statsite中姜、telegraf等)

如果用戶使用的是StatsD,則還需要兼容的數(shù)據(jù)庫和服務(wù)器跟伏,例如Grafana丢胚、ChronografPrometheus
用戶可以在配置文件(例如server.hcl)中配置遙測(telemetry)受扳,客戶端或服務(wù)端都支持遙測携龟。通常,用戶至少要在所有服務(wù)端上啟用它(無論有表決權(quán)無表決權(quán))辞色,這樣可以監(jiān)控整個數(shù)據(jù)中心的運行狀況骨宠。
將遙測發(fā)送到DataDogserver.hcl示例片段如下:

telemetry {
  dogstatsd_addr = "localhost:8125"
  disable_hostname = true
}

在現(xiàn)有數(shù)據(jù)中心上啟用遙測時,需要重新加載Consul進程相满。這可以通過consul reloadkill -HUP <process_id>來完成层亿,建議從非領(lǐng)導者開始,一次重裝一臺機器立美。

Consul健康指標

Consul健康指標顯示有關(guān)Consul數(shù)據(jù)中心的信息匿又。它們包括鍵值存儲(key value store)事務(wù)(transaction)建蹄,raft協(xié)議碌更,領(lǐng)導者變更(leadership changes)裕偿,自動駕駛調(diào)整(autopilot tuning)垃圾收集(garbage collection)的性能指標。

事務(wù)時間(Transaction Timing)

以下指標表示完成各個部分寫入操作所花費的時間(包括Consul KV和Consul服務(wù)器Raft)痛单。通常嘿棘,這些值應(yīng)保持大致一致,且每個值均不超過幾毫秒旭绒。

指標名 描述
consul.kvs.apply 完成KV Store更新所需的時間
consul.txn.apply 完成事務(wù)操作所需的時間
consul.raft.apply 周期時間內(nèi)發(fā)生的Raft事務(wù)數(shù)
consul.raft.commitTime 提交一條Raft日志到領(lǐng)導者上所需的時間

Consul服務(wù)器的負載異衬衩睿或服務(wù)器本身出現(xiàn)問題會造成時間值發(fā)生突變。 具體來說挥吵,如果這些指標中的任何一個指標重父,偏離上一個小時內(nèi)的基線超過50%,則表明存在問題忽匈,以下是事務(wù)健康指標的示例:

'consul.raft.apply': Count: 1 Sum: 1.000 LastUpdated: 2018-11-16 10:55:03.673805766 -0600 CST m=+97598.238246167
'consul.raft.commitTime': Count: 1 Sum: 0.017 LastUpdated: 2018-11-16 10:55:03.673840104 -0600 CST m=+97598.238280505
領(lǐng)導者變更(Leadership Changes)

在健康的環(huán)境中房午,Consul數(shù)據(jù)中心應(yīng)具有穩(wěn)定的領(lǐng)導者。 除非用戶手動更改領(lǐng)導者(比如將服務(wù)器從群集中移出)丹允,否則不應(yīng)進行任何領(lǐng)導者更改郭厌。 如果發(fā)生意外選舉或領(lǐng)導者變更,則應(yīng)調(diào)查Consul服務(wù)器之間是否存在網(wǎng)絡(luò)問題雕蔽,另一個可能的原因是Consul服務(wù)器無法跟上事務(wù)負載沪曙。
注意:下列度量標準來自跟隨者節(jié)點(follower nodes),而非領(lǐng)導者(leader)

指標名 描述
consul.raft.leader.lastContact 測量領(lǐng)導者最后一次連接到追隨者確認領(lǐng)導者租期(leader lease)的時間
consul.raft.state.candidate 當Consul服務(wù)器發(fā)起一次選舉時累加
consul.raft.state.leader 當Consul服務(wù)器變成領(lǐng)導者時累加

如果candidateleader指標大于0或者lastContact指標大于200ms萎羔,則應(yīng)排除上述可能的原因之一液走,這是領(lǐng)導者健康指標的示例:

'consul.raft.leader.lastContact': Count: 4 Min: 10.000 Mean: 31.000 Max: 50.000 Stddev: 17.088 Sum: 124.000 LastUpdated: 2018-12-17 22:06:08.872973122 +0000 UTC m=+3553.639379498
'consul.raft.state.leader': Count: 1 Sum: 1.000 LastUpdated: 2018-12-17 22:05:49.104580236 +0000 UTC m=+3533.870986584
'consul.raft.state.candidate': Count: 1 Sum: 1.000 LastUpdated: 2018-12-17 22:05:49.097186444 +0000 UTC m=+3533.863592815
自動駕駛(Autopilot)

有兩個自動駕駛指標也可以告知Consul數(shù)據(jù)中心的運行狀況。

指標名 描述
consul.autopilot.healthy 跟蹤本地服務(wù)器群集的整體運行狀況
consul.autopilot.failure_tolerance 跟蹤本地服務(wù)器群集可能丟失的表決服務(wù)器數(shù)量

consul.autopilot.healthy指標為布爾值贾陷,1表示健康缘眶,0表示不健康。返回值為0時應(yīng)該發(fā)出警報髓废,下面是運行狀況良好的數(shù)據(jù)中心的示例:

[2018-12-17 13:03:40 -0500 EST][G] 'consul.autopilot.healthy': 1.000

consul.autopilot.failure_tolerance指標表示數(shù)據(jù)中心在進入不健康狀態(tài)前可能會丟失多少個Consul服務(wù)器巷懈,返回值為0時應(yīng)該發(fā)出警報,以便采取積極措施來保證數(shù)據(jù)中心正常運行慌洪。

垃圾回收(Garbage Collection)

垃圾回收暫停是一個STW事件顶燕,所有運行時線程都將被阻塞,直到GC完成冈爹。在健康的環(huán)境中涌攻,這些暫停僅應(yīng)持續(xù)幾納秒。如果內(nèi)存使用率很高频伤,則Go運行時可能會頻繁啟動GC進程恳谎,以至于減慢Consul的速度。用戶可能會觀察到領(lǐng)導人選舉變得更頻繁,寫入時間也會變長因痛。

指標名 描述
consul.runtime.total_gc_pause_ns 自Consul啟動以來婚苹,垃圾收集STW暫停消耗的時間

如果返回值大于2s/min,則需要調(diào)查具體原因鸵膏,如果每分鐘超過5秒膊升,則應(yīng)任務(wù)數(shù)據(jù)中心處于緊急狀態(tài),下面是健康的GC暫停時間示例:

'consul.runtime.total_gc_pause_ns': 136603664.000

注意谭企,total_gc_pause_ns是一個累積計數(shù)器用僧,因此,為了計算速率(例如每分鐘的GC時間)赞咙,需要使用諸如non_negative_difference之類的函數(shù)。

服務(wù)器健康指標

服務(wù)器指標提供有關(guān)數(shù)據(jù)中心運行狀況的信息糟港,包括文件描述符攀操、CPU使用率網(wǎng)絡(luò)活動秸抚、磁盤活動內(nèi)存使用情況速和。

文件描述符(File Descriptors)

大多數(shù)Consul操作都需要文件描述符句柄,包括接收來自另一臺主機的連接剥汤,在服務(wù)器之間發(fā)送數(shù)據(jù)以及將快照寫入磁盤颠放。如果Consul用完了句柄,它將停止接受連接吭敢。

指標名 描述
linux_sysctl_fs.file-nr 在主機上所有進程中使用的文件句柄數(shù)
linux_sysctl_fs.file-max 可用文件句柄的總數(shù)

默認情況下碰凶,進程和內(nèi)核的限制是保守的,用戶可能希望將限制增加到默認值以外鹿驼。如果linux_sysctl_fs.file-nr值超過linux_sysctl_fs.file-max的80%欲低,則應(yīng)增加文件句柄,以下是文件句柄指標的示例:

linux_sysctl_fs, host=statsbox, file-nr=768i, file-max=96763i
CPU使用率(CPU Usage)

Consul無論是服務(wù)端或客戶端都不是CPU密集型服務(wù)畜晰,CPU使用率過高表示一次性執(zhí)行了太多操作砾莱。

指標名 描述
cpu.user_cpu 用戶進程(例如Vault或Consul)使用CPU的百分比
cpu.iowait_cpu 等待I/O任務(wù)花費的CPU時間百分比

如果cpu.iowait_cpu大于10%,對Consul來說是比較嚴重的問題凄鼻,表明Consul正在等待將數(shù)據(jù)寫入磁盤腊瑟,有可能是Raft將快照寫入磁盤的頻率過于頻繁,以下是運行狀況良好的CPU指標的示例:

cpu, cpu=cpu-total, usage_idle=99.298, usage_user=0.400, usage_system=0.300, usage_iowait=0, usage_steal=0
網(wǎng)絡(luò)活動(Network Activity)

網(wǎng)絡(luò)活動應(yīng)大體保持一致块蚌,Consul網(wǎng)絡(luò)流量突然激增可能是由于客戶端(例如Vault)配置錯誤而導致請求過多闰非,大多數(shù)代理會針對每個網(wǎng)絡(luò)接口報告單獨的指標,因此用戶需要確保正在監(jiān)視正確的指標峭范。

指標名 描述
net.bytes_recv 每個網(wǎng)絡(luò)接口上收到的字節(jié)
net.bytes_sent 每個網(wǎng)絡(luò)接口上傳輸?shù)淖止?jié)

網(wǎng)絡(luò)指標突然增加河胎,與基線之間的偏差大于50%,表示有太多請求未得到處理虎敦,以下是網(wǎng)絡(luò)活動指標的示例:

net, interface=enp0s5, bytes_sent=6183357i, bytes_recv=262313256i

注意:網(wǎng)絡(luò)指標是累積計數(shù)器游岳,因此如果計算速率(例如字節(jié)/秒)政敢,用戶需要應(yīng)用諸如non_negative_difference之類的函數(shù)。

磁盤活動(Disk Activity)

通常情況下胚迫,因為Consul將所有內(nèi)容保留在內(nèi)存中喷户,磁盤活動較少。如果Consul主機正在將大量數(shù)據(jù)寫入磁盤访锻,則意味著Consul可能有較重的寫入負載褪尝,因此經(jīng)常將Raft快照頻繁寫入磁盤。也有可能在生產(chǎn)中意外啟用了調(diào)試/跟蹤(debug/trace)日志記錄期犬,這可能會影響性能河哑。

指標名 描述
diskio.read_bytes 從塊設(shè)備讀取的字節(jié)
diskio.write_bytes 寫入塊設(shè)備的字節(jié)
diskio.read_time 讀取磁盤花費的時間,單位是毫秒
diskio.write_time 寫入磁盤花費的時間龟虎,單位為毫秒

磁盤度量指標突然發(fā)生較大變化璃谨,與基準偏差大于50%或與基準的偏差大于3個標準偏差,表示Consul的磁盤I/O過多鲤妥。磁盤I/O過多會導致系統(tǒng)其余部分變慢或不可用佳吞,因為內(nèi)核會花費所有時間等待I/O完成。以下是磁盤活動指標的示例:

diskio, name=sda5, read_bytes=522298368i,  write_bytes=1726865408i, read_time=7248i, write_time=133364i
內(nèi)存使用情況(Memory Usage)

如前所述棉安,Consul將其所有數(shù)據(jù)(KV存儲底扳,目錄(catalog)等)均保留在內(nèi)存中。如果Consul消耗了所有可用內(nèi)存贡耽,系統(tǒng)將崩潰衷模。用戶應(yīng)該監(jiān)控可用內(nèi)存,確保某些內(nèi)存可用于其他系統(tǒng)進程蒲赂,并且交換使用率(swap usage)應(yīng)保持在0%算芯,以獲得最佳性能。

指標名 描述
consul.runtime.alloc_bytes Consul進程分配的內(nèi)存字節(jié)數(shù)
consul.runtime.sys_bytes 從操作系統(tǒng)獲取的內(nèi)存字節(jié)數(shù)
mem.total 服務(wù)器上可用的內(nèi)存總量
mem.used_percent 正在使用的內(nèi)存百分比
swap.used_percent 正在使用的交換空間百分比

如果sys_bytes超過total_bytes的90%凳宙,mem.used_percent超過90%或swap.used_percent大于0熙揍,則表明Consul服務(wù)器的內(nèi)存不足。如果滿足以下三個條件任一氏涩,則應(yīng)增加Consul可用的內(nèi)存届囚,以下是內(nèi)存使用情況指標的示例:

'consul.runtime.alloc_bytes': 11199928.000
'consul.runtime.sys_bytes': 24627448.000
mem,  used_percent=31.492,  total=1036312576i
swap, used_percent=1.343

使用Telegraf監(jiān)控Consul

Consul提供了一系列各式各樣的指標,運維人員可以通過它們衡量集群的運行狀況和穩(wěn)定性是尖,診斷或者預測潛在的問題∫庀担現(xiàn)實場景中,有許多監(jiān)控工具可供參考饺汹,在這篇指南中蛔添,我們將結(jié)合使用Telegraf_plugin和Consul支持的StatsD協(xié)議。
用戶可以閱讀telemetry文檔,了解Consul可用指標的完整列表迎瞧。
在本指南中夸溶,用戶可以看到:

  • 配置Telegraf收集StatsD主機級別指標;
  • 配置Consul將指標發(fā)送到Telegraf凶硅;
  • 可視化指標示例缝裁;
  • 了解重要指標進行匯總并發(fā)出警報。

安裝Telegraf

Telegraf的安裝依賴用戶的操作系統(tǒng)足绅,我們建議用戶遵循官方的Telegraf安裝文檔捷绑。

配置Telegraf

Telegraf充當StatsD代理,可以收集Consul所在運行機器的其他指標氢妈。Telegraf本身附帶了各種各樣的輸入(input)插件粹污,可以收集很多數(shù)據(jù)源。
我們將啟用一些最常用的輸入插件來監(jiān)控CPU首量,內(nèi)存壮吩,磁盤I/O網(wǎng)絡(luò)進程狀態(tài)蕾总,它們對于調(diào)試Consul群集問題很有幫助。
telegraf.conf文件以全局選項(global options)開頭:

[agent]
  interval = "10s"
  flush_interval = "10s"
  omit_hostname = false

我們默認將收集間隔時間設(shè)置為10秒琅捏,并要求Telegraf在每個指標中包含一個主機(host)標簽生百。
如上所述,Telegraf還允許用戶在度量標準上設(shè)置其他標簽柄延。這里蚀浆,我們將為服務(wù)器角色數(shù)據(jù)中心名稱添加了標簽,之后我們可以在Grafana中使用這些標簽來過濾查詢(例如搜吧,創(chuàng)建僅顯示具有consul-server角色的服務(wù)器或us-east-1數(shù)據(jù)中心中的服務(wù)器的儀表板)市俊。

[global_tags]
  role = "consul-server"
  datacenter = "us-east-1"

接下來,我們在8125端口上使用UDP設(shè)置StatsD監(jiān)聽器滤奈,傳輸?shù)男畔馕?code>DogStatsD-compatible標簽:

[[inputs.statsd]]
  protocol = "udp"
  service_address = ":8125"
  delete_gauges = true
  delete_counters = true
  delete_sets = true
  delete_timings = true
  percentiles = [90]
  metric_separator = "_"
  parse_data_dog_tags = true
  allowed_pending_messages = 10000
  percentile_limit = 1000

現(xiàn)在摆昧,我們可以為CPU內(nèi)存蜒程,網(wǎng)絡(luò)I/O磁盤I/O等配置輸入绅你,它們中的大多數(shù)不需要任何配置,這里需要確保inputs.net中的interfaces名稱與在ifconfig中看到的interfaces名稱匹配:

[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false

[[inputs.disk]]
  # mount_points = ["/"]
  # ignore_fs = ["tmpfs", "devtmpfs"]

[[inputs.diskio]]
  # devices = ["sda", "sdb"]
  # skip_serial_number = false

[[inputs.kernel]]
  # no configuration

[[inputs.linux_sysctl_fs]]
  # no configuration

[[inputs.mem]]
  # no configuration

[[inputs.net]]
  interfaces = ["enp0s*"]

[[inputs.netstat]]
  # no configuration

[[inputs.processes]]
  # no configuration

[[inputs.swap]]
  # no configuration

[[inputs.system]]
  # no configuration

另一個實用的插件是procstat插件昭躺,它可以報告用戶選擇的進程的指標:

[[inputs.procstat]]
  pattern = "(consul)"

Telegraf還有一個插件忌锯,該插件使用Consul API查詢數(shù)據(jù),監(jiān)控Consul代理的運行狀況:

[[inputs.consul]]
  address = "localhost:8500"
  scheme = "http"

Consul的Telegraf配置

Consul將遙測數(shù)據(jù)發(fā)送到Telegraf领炫,就像在代理配置中添加遙測部分一樣簡單:

{
  "telemetry": {
    "dogstatsd_addr": "localhost:8125",
    "disable_hostname": true
  }
}

如上所述偶垮,我們只需要指定兩個選項。dogstatsd_addr指定StatsD守護程序的主機名和端口號。
這里注意似舵,我們指定了DogStatsD格式脚猾,而不是默認的StatsD,這樣Consul在發(fā)送指標時會攜帶標簽啄枕。Grafana可以使用標簽來過濾儀表板上的數(shù)據(jù)(例如婚陪,僅顯示role=consul-server的數(shù)據(jù)。)Telegraf與DogStatsD格式兼容频祝,并且允許我們添加自己的標簽泌参。
第二個選項告訴Consul不要在發(fā)送到StatsD的指標中插入主機名,因為主機名將作為標簽發(fā)送常空。如果沒有此選項沽一,單個度量指標consul.raft.apply將成為多個度量指標:

consul.server1.raft.apply
consul.server2.raft.apply
consul.server3.raft.apply

如果用戶使用其他代理(例如CirconusStatsitePlain StatsD)漓糙,則可能需要更改此配置铣缠。

Consul Telegraf指標可視化

用戶可以使用GrafanaChronograf之類的工具對Telegraf中的數(shù)據(jù)進行可視化,這是Grafana儀表盤示例:

consul-grafana-screenshot.png

多數(shù)據(jù)中心間的ACL復制

用戶可以配置令牌昆禽、策略角色跨多個數(shù)據(jù)中心工作蝗蛙。ACL復制有以下幾個好處:

  1. 它支持在多個數(shù)據(jù)中心之間對節(jié)點服務(wù)進行身份驗證;
  2. 從數(shù)據(jù)中心可以為在主數(shù)據(jù)中心中創(chuàng)建的所有ACL組件提供故障轉(zhuǎn)移醉鳖;
  3. 共享策略減少運維人員的冗余操作捡硅。

先決條件

在開始本章節(jié)之前,每個數(shù)據(jù)中心都需要啟用ACL盗棵,使用ACL增強Consul安全性章節(jié)中已經(jīng)詳細講述了配置過程壮韭,本章節(jié)會覆蓋其未涵蓋的Consul代理的ACL復制配置。此外纹因,WAN Gossip通信是必須的喷屋。

簡介

在本指南中,用戶將配置ACL復制瞭恰,其中包含以下過程:

  • 在主數(shù)據(jù)中心中的所有Consul代理上設(shè)置primary_datacenter參數(shù)屯曹;
  • 創(chuàng)建復制令牌;
  • 在從數(shù)據(jù)中心中的所有Consul代理上配置primary_datacenter參數(shù)惊畏;
  • 在從數(shù)據(jù)中心中的服務(wù)器上啟用令牌復制是牢;
  • 將復制令牌應(yīng)用于從數(shù)據(jù)中心中的所有服務(wù)器。

配置主數(shù)據(jù)中心

注意陕截,如果主數(shù)據(jù)中心使用默認數(shù)據(jù)中心名稱dc1驳棱,則必須在從數(shù)據(jù)中心上設(shè)置一個不同的數(shù)據(jù)中心名稱。否則农曲,兩個數(shù)據(jù)中心都將被命名為dc1社搅,發(fā)生沖突驻债。

Consul服務(wù)端和客戶端

即使默認情況下主數(shù)據(jù)中心已經(jīng)啟用了,用戶需要在所有服務(wù)端和客戶端都顯式設(shè)置primary_datacenter參數(shù)形葬,代理配置如下所示:

{
  "datacenter": "primary_dc",
  "primary_datacenter": "primary_dc",
  "acl": {
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "enable_token_persistence": true
  }
}

primary_datacenter參數(shù)設(shè)置主數(shù)據(jù)中心具有所有ACL信息權(quán)限合呐。客戶端也同樣需要配置淌实,以便它們將API請求轉(zhuǎn)發(fā)到服務(wù)端,最后猖腕,啟動代理:

$ consul agent -config-file=server.json

需要在所有代理上都重復配置拆祈,如果用戶是首次配置ACL,還需要完成引導(bootstrap)過程倘感。

創(chuàng)建ACL管理的復制令牌

接下來放坏,需要創(chuàng)建擁有如下權(quán)限的復制令牌,用于管理ACL:

  • acl=“write”:允許用戶復制令牌老玛;
  • operator =“ write”:用于復制代理默認(proxy-default)配置淤年,并在從數(shù)據(jù)中心啟用CA證書簽名;
  • service_prefix, policy = "read" and intentions = "read":用于復制服務(wù)默認(service-default)配置蜡豹、CA和intention麸粮。
acl = "write"

operator = "write"

service_prefix "" {
  policy = "read"
  intentions = "read"
}

現(xiàn)在,已經(jīng)定義好了ACL規(guī)則镜廉,使用這些規(guī)則創(chuàng)建一個策略:

$ consul acl policy create -name replication -rules @replication-policy.hcl
ID: 240f1d01-6517-78d3-ec32-1d237f92ab58
Name: replication
Description: Datacenters:
Rules: acl = "write"

operator = "write"

service_prefix "" { policy = "read"  intentions = "read" }

最后弄诲,使用新創(chuàng)建的策略來創(chuàng)建復制令牌:

$ consul acl token create -description "replication token" -policy-name replication
AccessorID: 67d55dc1-b667-1835-42ab-64658d64a2ff
SecretID: fc48e84d-3f4d-3646-4b6a-2bff7c4aaffb
Description: replication token
Local: false
Create Time: 2019-05-09 18:34:23.288392523 +0000 UTC
Policies:
  240f1d01-6517-78d3-ec32-1d237f92ab58 - replication

在從數(shù)據(jù)中心啟用ACL復制

一旦配置了主數(shù)據(jù)中心并創(chuàng)建了復制令牌,用戶就可以設(shè)置從數(shù)據(jù)中心了桨吊。

配置服務(wù)端

用戶需要將所有服務(wù)器上的primary_datacenter參數(shù)設(shè)置為主數(shù)據(jù)中心的名稱威根,并將enable_token_replication設(shè)置為true

{
  "datacenter": "dc_secondary",
  "primary_datacenter": "primary_dc",
  "acl": {
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "enable_token_persistence": true,
    "enable_token_replication": true
  }
}

啟動代理:

$ consul agent -config-file=server.json

對所有服務(wù)端機器重復執(zhí)行上述過程凤巨。

將復制令牌應(yīng)用于服務(wù)端

使用命令行指令视乐,將復制令牌應(yīng)用于所有服務(wù)器:

$ consul acl set-agent-token replication <token> 
ACL token "replication" set successfully

在所有服務(wù)端機器上重復此過程,如果首次配置ACL敢茁,還需要設(shè)置代理令牌佑淀。

配置客戶端

用戶需要將所有服務(wù)器上的primary_datacenter參數(shù)設(shè)置為主數(shù)據(jù)中心的名稱,并將enable_token_replication設(shè)置為true

{
  "datacenter": "dc_secondary",
  "primary_datacenter": "primary_dc",
  "acl": {
    "enabled": true,
    "default_policy": "deny",
    "down_policy": "extend-cache",
    "enable_token_persistence": true,
    "enable_token_replication": true
  }
}

啟動代理:

$ consul agent -config-file=server.json

對所有客戶端機器重復執(zhí)行上述過程彰檬。

檢查復制

如果用戶已經(jīng)設(shè)置了ACL復制伸刃,可以使用HTTP API來檢查數(shù)據(jù)中心的配置:

$ curl http://localhost:8500/v1/acl/replication?pretty
{
  "Enabled":true,
  "Running":true,
  "SourceDatacenter":"primary_dc",
  "ReplicationType":"tokens",
  "ReplicatedIndex":19,
  "ReplicatedTokenIndex":22,
  "LastSuccess":"2019-05-09T18:54:09Z",
  "LastError":"0001-01-01T00:00:00Z"
}

注意:ReplicationType應(yīng)為令牌,這意味著令牌逢倍、策略角色正在復制捧颅。

添加&刪除服務(wù)器

Consul的設(shè)計原則是要求運維人員盡少去操作,但是對Consul集群的任何更改都必須謹慎處理较雕。為了更好地理解原因,閱讀consensus協(xié)議將很有用哮伟。 簡而言之摘投,Consul服務(wù)器執(zhí)行領(lǐng)導者選舉和復制,在處理更改時妆毕,服務(wù)器數(shù)量必須大于(N/2)+ 1。這意味著如果有3個服務(wù)器節(jié)點贮尖,則至少必須有2個可用笛粘。
通常,如果要同時添加和刪除節(jié)點湿硝,最好先添加新節(jié)點薪前,然后再刪除舊節(jié)點。
在本章節(jié)中图柏,我們將介紹添加和刪除服務(wù)器的不同方法序六。

手動添加一臺新服務(wù)器

手動添加新服務(wù)器通常很簡單,請使用-server標志啟動新代理蚤吹。此時例诀,服務(wù)器不屬于任何一個集群,并且會發(fā)出類似以下內(nèi)容的信息:

$ consul agent -server 
[WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election.

這意味著它與其他節(jié)點互不通信裁着,也沒有配置為自行選舉繁涂。這是符合預期的,現(xiàn)在我們可以使用join命令將節(jié)點添加到現(xiàn)有集群中二驰。對于一臺新服務(wù)器扔罪,我們可以將它加入任何現(xiàn)有集群:

$ consul join <Existing Node Address> 
Successfully joined cluster by contacting 1 nodes.

需要注意的是,可以指定任何節(jié)點(包括非服務(wù)端機器)加入集群桶雀,通常矿酵,此方法適用于測試,但不建議用于生產(chǎn)部署矗积。對于生產(chǎn)集群全肮,用戶可能需要使用代理配置項來添加其他服務(wù)器。

添加具有代理配置的服務(wù)器

在生產(chǎn)環(huán)境中棘捣,應(yīng)使用代理配置選項retry_join參數(shù)辜腺。retry_join可用作命令行標志,或配置在代理配置文件中乍恐,使用Consul命令行指令如下:

$ consul agent -retry-join=52.10.110.11 -retry-join=52.10.110.12 -retry-join=52.10.100.13

配置文件內(nèi)容如下:

{
  "bootstrap": false,
  "bootstrap_expect": 3,
  "server": true,
  "retry_join": ["52.10.110.11", "52.10.110.12", "52.10.100.13"]
}

retry_join將確保如果服務(wù)器由于任何原因(包括重新啟動節(jié)點)而失去與群集的連接评疗,則它可以在返回時重新加入。除了使用靜態(tài)IP外茵烈,它對于其他發(fā)現(xiàn)機制(例如基于云元數(shù)據(jù)的自加入)也很有用百匆。 服務(wù)端和客戶端都可以使用此方法。

服務(wù)器調(diào)度

為確保Consul服務(wù)器能正確加入群集呜投,應(yīng)監(jiān)控服務(wù)器調(diào)度加匈。Gossip協(xié)議用于正確發(fā)現(xiàn)集群中的所有節(jié)點寄症,加入節(jié)點后,集群領(lǐng)導者會記錄以下內(nèi)容:

[INFO] raft: Added peer 127.0.0.2:8300, starting replication

這意味著Raft(底層共識協(xié)議)已經(jīng)添加了節(jié)點并開始復制狀態(tài)矩动,由于現(xiàn)有群集狀態(tài)可能已經(jīng)遙遙領(lǐng)先有巧,因此新節(jié)點需要一些時間才能同步完信息。 要了解詳細信息悲没,可以在領(lǐng)導者服務(wù)器上運行info指令:

$ consul info
...
raft:
    applied_index = 47244
    commit_index = 47244
    fsm_pending = 0
    last_log_index = 47244
    last_log_term = 21
    last_snapshot_index = 40966
    last_snapshot_term = 20
    num_peers = 4
    state = Leader
    term = 21
...

這會提供有關(guān)Raft的各種信息篮迎,特別是last_log_index參數(shù)顯示磁盤上的最后一個日志∈咀耍可以在新服務(wù)器上運行info命令甜橱,查看數(shù)據(jù)同步的進度。最終栈戳,新的服務(wù)器同步進度會被趕上岂傲。
最好一次添加一臺服務(wù)器,使數(shù)據(jù)可以來得及同步子檀。這樣可以避免現(xiàn)有服務(wù)器出現(xiàn)故障時镊掖,新增的服務(wù)器同步時發(fā)生數(shù)據(jù)丟失。

手動刪除一臺服務(wù)器

刪除服務(wù)器必須需要小心褂痰,以免造成服務(wù)不可用亩进。對于有N個服務(wù)器的群集,至少需要(N/2)+ 1個可用缩歪,群集才能正常運行归薛。參考下表,如果用戶有3臺服務(wù)器匪蝙,其中1臺出現(xiàn)故障主籍,則再刪除任何一臺服務(wù)器將導致集群不可用。

服務(wù)器 仲裁個數(shù) 容錯能力
1 1 0
2 2 0
3 2 1
4 3 1
5 3 2
6 4 2
7 4 3

為避免這種情況逛球,有必要先將新服務(wù)器添加到群集中千元,以增加群集的故障容忍度,然后再刪除舊服務(wù)器需忿。 即使所有3個節(jié)點都在工作诅炉,刪除1個節(jié)點也會使群集處于崩潰狀態(tài)蜡歹。
當用戶驗證好現(xiàn)有的服務(wù)器運行狀況良好屋厘,就可以刪除服務(wù)器節(jié)點了,操作過程很簡單月而,僅需向服務(wù)器發(fā)送leave指令即可汗洒。

$ consul leave

服務(wù)器下線日志如下:

...
[INFO] consul: server starting leave
...
[INFO] raft: Removed ourself, transitioning to follower
...

領(lǐng)導者還會輸出各類日志,包括:

...
[INFO] consul: member 'node-10-0-1-8' left, deregistering
[INFO] raft: Removed peer 10.0.1.8:8300, stopping replication
...

此時父款,節(jié)點已經(jīng)從集群中正常刪除溢谤,并會關(guān)閉瞻凤。
在服務(wù)端上啟用consul leave會減少仲裁機器個數(shù)。即使集群最初使用bootstrap_expect設(shè)置仲裁機器個數(shù)世杀,后續(xù)也可以執(zhí)行consul leave命令減少仲裁機器個數(shù)阀参,最后仲裁個數(shù)可以只剩一個,這時可以繼續(xù)提交寫入請求瞻坝,但是比起之前仲裁機器個數(shù)多的時候蛛壳,可能會丟失一些寫入請求。
在刪除錯加入集群的服務(wù)后所刀,需要清除客戶端和服務(wù)器節(jié)點上數(shù)據(jù)目錄上(-data-dir)的內(nèi)容衙荐,這些刪除服務(wù)器的方法假定服務(wù)器本身是正常的,如果群集由于仲裁丟失或數(shù)據(jù)損壞而沒有領(lǐng)導者浮创,則應(yīng)計劃執(zhí)行中斷恢復(outage recovery)忧吟。

手動強制刪除服務(wù)器

在某些情況下,可能無法正常刪除服務(wù)器斩披。例如溜族,如果服務(wù)器發(fā)生故障,無法發(fā)出下線請求垦沉。 相反斩祭,群集將檢測到故障,并且還將連續(xù)重試復制乡话。
如果服務(wù)器可以恢復摧玫,則最好先使其恢復聯(lián)機,然后優(yōu)雅地下線绑青。但是诬像,如果不能正常下線,則可以使用force-leave命令強制刪除服務(wù)器闸婴。

$ consul force-leave <node>

自動駕駛系統(tǒng)(Autopilot)

自動駕駛(Autopilot)系統(tǒng)可以對Consul服務(wù)器進行自動坏挠、操作友好的管理,其中包括清理死服務(wù)器邪乍,監(jiān)控Raft群集狀態(tài)以及穩(wěn)定地引入服務(wù)器降狠,這個功能在Consul 0.8.0中引入。
使用自動駕駛系統(tǒng)時(清理死服務(wù)器功能除外)庇楞,必須將所有服務(wù)器上Consul代理配置中的raft_protocol參數(shù)配置為3或更高榜配。在Consul 0.8版本中,此配置項默認為2吕晌;在Consul 1.0中蛋褥,默認值為3。其它更多信息可以參考Consul 1.0中有關(guān)Raft協(xié)議版本升級部分睛驳。
在本章節(jié)烙心,用戶將看到Consul如何跟蹤服務(wù)器的穩(wěn)定性膜廊,如何調(diào)整參數(shù),還將了解一下自動駕駛系統(tǒng)的其他細節(jié):

  • 服務(wù)器保持穩(wěn)定狀態(tài)
  • 清理死服務(wù)器
  • 區(qū)域冗余(僅適用于Consul企業(yè)版)
  • 自動升級(僅適用于Consul企業(yè)版)

注意淫茵,我們使用的示例是基于Consul1.7版本的爪瓜,默認情況下,我們是啟用自動駕駛功能的匙瘪,Consul企業(yè)版的功能我們此處也不做詳細介紹钥勋。

默認配置

最初引導數(shù)據(jù)中心時,領(lǐng)導者會加載代理機器的自動駕駛系統(tǒng)配置辆苔。由于自動駕駛功能默認是開啟的算灸,我們僅需在有必要的時候修改配置禁用它們。
所有Consul服務(wù)器都應(yīng)打開自動駕駛功能驻啤,以確保發(fā)生故障時菲驴,服務(wù)器之間狀態(tài)保持一致性。 此外骑冗,必須啟用自動駕駛才能使用其下的任何子功能赊瞬,子功能本身可以獨立配置。
用戶可以使用Consul命令行指令或/v1/operator/autopilot端點檢查默認值:

  • 命令行指令
$ consul operator autopilot get-config
CleanupDeadServers = true
LastContactThreshold = 200ms
MaxTrailingLogs = 250
MinQuorum = 0
ServerStabilizationTime = 10s
RedundancyZoneTag = ""
DisableUpgradeMigration = false
UpgradeVersionTag = ""
  • 使用API調(diào)用
$ curl http://127.0.0.1:8500/v1/operator/autopilot/configuration
{
  "CleanupDeadServers": true,
  "LastContactThreshold": "200ms",
  "MaxTrailingLogs": 250,
  "MinQuorum": 0,
  "ServerStabilizationTime": "10s",
  "RedundancyZoneTag": "",
  "DisableUpgradeMigration": false,
  "UpgradeVersionTag": "",
  "CreateIndex": 5,
  "ModifyIndex": 5
}

服務(wù)器健康檢查

在領(lǐng)導者內(nèi)部運行健康狀態(tài)檢查來跟蹤服務(wù)器的穩(wěn)定性贼涩,如果滿足以下所有條件巧涧,則表示服務(wù)器運行狀況良好:

  • 健康狀態(tài)為Alive
  • 自上次與當前領(lǐng)導者聯(lián)系的時間低于LastContactThreshold(默認200ms)遥倦;
  • 最新的Raft任期(term)與領(lǐng)導人的任期匹配谤绳;
  • 領(lǐng)導者落后的Raft日志數(shù)目不超過MaxTrailingLogs(默認250);

可以通過/v1/operator/autopilot/health端點查看這些健康檢查的狀態(tài)袒哥,其中頂層的Healthy字段表示數(shù)據(jù)中心的整體狀態(tài):

$ curl localhost:8500/v1/operator/autopilot/health | jq .
{
  "Healthy": true,
  "FailureTolerance": 1,
  "Servers": [
    {
      # ...
      "Name": "server-dc1-1",
      "Address": "10.20.10.11:8300",
      "SerfStatus": "alive",
      "Version": "1.7.2",
      "Leader": false,
            # ...
      "Healthy": true,
      "Voter": true,
      # ...
    },
    {
      # ...
      "Name": "server-2",
      "Address": "10.20.10.12:8300",
      "SerfStatus": "alive",
      "Version": "1.7.2",
      "Leader": false,
      # ...
      "Healthy": true,
      "Voter": true,
      # ...
    },
    {
      # ...
      "Name": "server-3",
      "Address": "10.20.10.13:8300",
      "SerfStatus": "alive",
      "Version": "1.7.2",
      "Leader": false,
      # ...
      "Healthy": true,
      "Voter": false,
      # ...
    }
  ]
}

服務(wù)器穩(wěn)定時間

將新服務(wù)器添加到數(shù)據(jù)中心后缩筛,會先經(jīng)歷一段時間的等待期,在這段時間內(nèi)它必須處于健康狀態(tài)并保持穩(wěn)定堡称,然后才能晉升為有表決權(quán)的成員瞎抛,這個由ServerStabilizationTime參數(shù)定義,默認情況為10秒却紧。
如果用戶需要配置不同的時間來使節(jié)點準備就緒桐臊,例如,在啟動時進行了一些額外的VM檢查晓殊,這可能會影響節(jié)點資源的可用性断凶,此時可以調(diào)整參數(shù)并為其分配不同的準備時長。

$ consul operator autopilot set-config -server-stabilization-time=15s 
Configuration updated!

使用get-config命令檢查配置項:

$ consul operator autopilot get-config
CleanupDeadServers = true
LastContactThreshold = 200ms
MaxTrailingLogs = 250
MinQuorum = 0
ServerStabilizationTime = 15s
RedundancyZoneTag = ""
DisableUpgradeMigration = false
UpgradeVersionTag = ""

清理死服務(wù)器

如果禁用了自動駕駛挺物,系統(tǒng)需要72個小時才能自動恢復死服務(wù)器懒浮,或者需要運維人員編寫腳本來強制刪除機器飘弧。此時如果另一臺服務(wù)器發(fā)生故障识藤,即使故障的Consul服務(wù)器已被自動更換砚著,也可能會危及仲裁。當替換的Consul服務(wù)器上線后痴昧,自動駕駛系統(tǒng)可以通過快速刪除發(fā)生故障的服務(wù)器來幫助防止此類中斷稽穆。服務(wù)器在清理過程中被刪除后會進入left狀態(tài)。
啟用自動駕駛的死服務(wù)器清理功能后赶撰,系統(tǒng)將定期清理死服務(wù)器并將其從Raft設(shè)備集中刪除舌镶,以防止它們干擾法定人數(shù)和領(lǐng)導者選舉。每當將新服務(wù)器成功添加到數(shù)據(jù)中心時豪娜,清理過程也會自動觸發(fā)餐胀。
我們建議用戶啟用該功能,以避免在Consul管理中引入手動操作瘤载,以確保有故障的節(jié)點不會在Raft池中保留太長時間而無需手動刪除否灾。將故障節(jié)點移除工作委派給外部工具,或者在環(huán)境中鸣奔,可以使用consul operator命令禁用死服務(wù)器清理功能:

$ consul operator autopilot set-config -cleanup-dead-servers=false 
Configuration updated!

使用get-config命令檢查配置項:

$ consul operator autopilot get-config
CleanupDeadServers = false
LastContactThreshold = 200ms
MaxTrailingLogs = 250
MinQuorum = 0
ServerStabilizationTime = 10s
RedundancyZoneTag = ""
DisableUpgradeMigration = false
UpgradeVersionTag = ""

中斷恢復

在發(fā)生服務(wù)中斷時墨技,不要過于驚慌,這是很關(guān)鍵的一步挎狸。
根據(jù)用戶的部署配置扣汪,有可能僅一臺機器發(fā)生故障就使整個集群不可用。這時需要運維人員操作干預锨匆,但是過程很簡單崭别。
本章節(jié)概述了,由于群集中大多數(shù)服務(wù)器節(jié)點丟失后恐锣,Consul從中斷中恢復的過程紊遵。 中斷類型有幾種,具體取決于服務(wù)器節(jié)點的數(shù)量和發(fā)生故障的服務(wù)器節(jié)點的數(shù)量侥蒙。我們將概述如何從以下場景恢復服務(wù):

  • 單服務(wù)器群集發(fā)生故障:此時僅有一臺Consul服務(wù)器暗膜,并發(fā)生故障;
  • 多服務(wù)器群集單臺服務(wù)器發(fā)生故障:Consul群集中有三臺或更多服務(wù)器鞭衩,僅有一臺服務(wù)器發(fā)生故障学搜;
  • 多服務(wù)器群集多臺服務(wù)器發(fā)生故障:Consul群集中有三臺或更多服務(wù)器,有多臺服務(wù)器發(fā)生故障论衍,這種情況可能是最嚴重的瑞佩,因為它可能導致數(shù)據(jù)丟失。

單服務(wù)器群集發(fā)生故障

如果只有一臺服務(wù)器坯台,但該服務(wù)器發(fā)生了故障炬丸,只需重新啟動它即可,單個服務(wù)器配置需要-bootstrap-bootstrap-expect = 1標志:

$ consul agent -bootstrap-expect=1

如果無法恢復服務(wù)器,則需要新啟動一臺服務(wù)器稠炬。單服務(wù)器群集容易出現(xiàn)不可恢復的服務(wù)器故障焕阿,且沒有數(shù)據(jù)備份,由于沒有將數(shù)據(jù)復制到任何其他服務(wù)器首启,因此數(shù)據(jù)丟失難以避免暮屡,所以我們不建議部署單服務(wù)器集群。

升級Raft協(xié)議

將服務(wù)器的-raft-protocol參數(shù)版本從2升級到3后毅桃,服務(wù)器將不再允許添加運行較舊版本的服務(wù)器褒纲。
在單服務(wù)器群集方案中,重新啟動服務(wù)器可能會導致服務(wù)器無法選舉自己作為領(lǐng)導者钥飞,從而群集無法使用莺掠。要想服務(wù)從故障恢復,可以打開Consul服務(wù)器的-data-dir目錄读宙,其下有一個raft/子目錄汁蝶,在raft/目錄中創(chuàng)建一個raft/peers.json文件。
對于Raft協(xié)議版本為3或更高版本论悴,應(yīng)將其格式化為JSON數(shù)組掖棉,其中包含Consul服務(wù)器的節(jié)點ID地址:端口選舉權(quán)信息膀估,如下所示:

[{ "id": "<node-id>", "address": "<node-ip>:8300", "non_voter": false }]

請確保node-idnode-ip配置正確幔亥,最后,重新啟動Consul服務(wù)器察纯。

多服務(wù)器群集單臺服務(wù)器發(fā)生故障

如果發(fā)生故障的服務(wù)器是可恢復的帕棉,最好的選擇是使用相同IP地址加入集群,使其恢復聯(lián)機狀態(tài)饼记。同樣香伴,如果用戶需要重建新的Consul服務(wù)器以替換發(fā)生故障的節(jié)點,則可能希望立即執(zhí)行此操作具则。注意即纲,重建的服務(wù)器必須與故障服務(wù)器具有相同的IP地址。同樣博肋,一旦該服務(wù)器聯(lián)機并重新加入低斋,群集將重新返回到完全正常的狀態(tài)。

$ consul agent -bootstrap-expect=3 -bind=192.172.2.4 -auto-rejoin=192.172.2.3

這兩種策略都可能需要很長時間才能重建故障服務(wù)器匪凡。如果這不切實際膊畴,或者無法選擇使用相同IP構(gòu)建新服務(wù)器時,需要刪除發(fā)生故障的服務(wù)器病游。通常唇跨,如果故障服務(wù)器仍然是集群的成員,則可以使用consul force-leave命令刪除該服務(wù)器。

$ consul force-leave <node.name.consul>

如果consul force-leave無法刪除服務(wù)器买猖,則有另外兩種方法可以刪除它改橘,具體取決于Consul的版本:

  • 對于Consul 0.7或更高版本,如果集群中有領(lǐng)導者政勃,則可以使用consul operator命令立即刪除過時的節(jié)點服務(wù)器唧龄,而不會造成停機兼砖;
  • 對于0.7之前的Consul版本奸远,用戶可以使用其他服務(wù)器上的raft/peers.json恢復文件手動刪除過時的節(jié)點服務(wù)器。 執(zhí)行此過程Consul需要停機讽挟。

在Consul 0.7或更高版本中懒叛,可以使用consul operator命令檢查Raft配置:

$ consul operator raft list-peers
Node ID Address State Voter RaftProtocol
alice 10.0.1.8:8300 10.0.1.8:8300 follower true 3
bob 10.0.1.6:8300 10.0.1.6:8300 leader true 3
carol 10.0.1.7:8300 10.0.1.7:8300 follower true 3

多服務(wù)器群集多臺服務(wù)器發(fā)生故障

如果有多臺服務(wù)器發(fā)生故障,導致仲裁丟失或者完全中斷耽梅,則可以使用群集中其余服務(wù)器上的數(shù)據(jù)進行部分恢復(partial recovery)薛窥。在這種情況下,可能會因為多個服務(wù)器丟失而導致數(shù)據(jù)丟失眼姐,因此有關(guān)所提交內(nèi)容的信息可能不完整诅迷。 恢復過程中隱式(implicitly)提交了所有Raft日志條目,因此也可能提交在故障之前未提交的數(shù)據(jù)众旗。
有關(guān)恢復過程的詳細信息罢杉,請參考以下有關(guān)使用peers.json恢復文件手動恢復的部分。用戶只需在raft/peers.json恢復文件中添加幸存的服務(wù)器即可贡歧,一旦所有服務(wù)器都使用相同的raft/peers.json配置重新啟動滩租,集群就可以選舉領(lǐng)導者。
之后用戶引入任何新服務(wù)器都可以使用完全干凈的數(shù)據(jù)目錄來更新數(shù)據(jù)利朵,并使用Consul的join指令加入集群律想。

$ consul agent -join=192.172.2.3

在某些極端情況下,可以通過唯一存活的服務(wù)器绍弟,使用它的raft/peers.json文件恢復集群技即。
Consul 0.7之前的版本,使用raft/peers.json并不能從所有類型的中斷中恢復樟遣。在Consul 0.7及其更高的版本中姥份,raft/peers.json恢復文件是最終文件,并且在攝取數(shù)據(jù)后會打上快照年碘,因此可以確保從用戶配置的環(huán)境開始開始澈歉。這會隱式提交所有Raft日志條目,因此僅應(yīng)用于從中斷中恢復屿衅,但當集群中有數(shù)據(jù)可用時埃难,它允許在任何場景實現(xiàn)恢復。

使用peers.json文件手動恢復

首先,先要關(guān)閉所有幸存的服務(wù)器涡尘,用戶可以嘗試優(yōu)雅地關(guān)閉機器忍弛,但大多數(shù)情況下這個會不起作用。如果在關(guān)閉服務(wù)器時發(fā)生錯誤不用擔心考抄,此時群集處于非正常狀態(tài)细疚,這屬于正常情況。
在Consul 0.7及更高版本中川梅,peers.json文件默認不存在疯兼,僅在執(zhí)行恢復時使用。Consul啟動時會提取此文件贫途,然后將其刪除吧彪。Consul 0.7還使用自動創(chuàng)建的新的raft/peers.info文件,以避免在升級后首次啟動時提取raft/peers.json文件丢早,確保將raft/peers.info文件放置在正確的位置以供操作姨裸。
使用raft/peers.json進行恢復操作時,可能會導致未提交的Raft日志條目被隱式提交怨酝,因此傀缩,要確保僅在發(fā)生中斷(且無其他選項可用于恢復丟失的服務(wù)器)后才使用此命令
下一步是打開Consul服務(wù)器的-data-dir目錄,在該目錄中农猬,有一個raft/子目錄赡艰,我們在里面創(chuàng)建raft/peers.json文件,文件格式與Raft版本協(xié)議匹配盛险。
對于Raft協(xié)議版本為2及更早的版本瞄摊,應(yīng)將其格式化為JSON數(shù)組,其中包含集群中每個Consul服務(wù)器的地址端口苦掘,如下所示:

["10.1.0.1:8300", "10.1.0.2:8300", "10.1.0.3:8300"]

對于Raft協(xié)議版本為3及更高的版本换帜,此文件的格式也為JSON數(shù)組,其中包含集群中每個Consul服務(wù)器的節(jié)點ID鹤啡、地址:端口選舉權(quán)信息惯驼,如下所示:

[
  {
    "id": "adf4238a-882b-9ddc-4a9d-5b6758e4159e",
    "address": "10.1.0.1:8300",
    "non_voter": false
  },
  {
    "id": "8b6dda82-3103-11e7-93ae-92361f002671",
    "address": "10.1.0.2:8300",
    "non_voter": false
  },
  {
    "id": "97e17742-3103-11e7-93ae-92361f002671",
    "address": "10.1.0.3:8300",
    "non_voter": false
  }
]
  • id(字符串,必要字段):指定服務(wù)器節(jié)點ID递瑰,如果它是自動生成的祟牲,可以在服務(wù)器啟動時在日志中找到它,也可以在服務(wù)器的數(shù)據(jù)目錄中的node-id文件中找到它抖部;
  • address(字符串说贝,必要字段):指定服務(wù)器的端口和IP,端口用于集群的RPC通信慎颗;
  • non_voter(布爾類型乡恕,非必要字段):控制服務(wù)器是否具有選舉權(quán)言询,默認為false

只需為所有服務(wù)器創(chuàng)建該配置項即可傲宜,用戶必須確認未包含在此處的服務(wù)器確實發(fā)生了故障运杭,并且以后也不會重新加入群集了,確保其他所有服務(wù)器節(jié)點上的配置文件均相同函卒。
此時辆憔,用戶可以重新啟動其他所有服務(wù)器,在Consul 0.7及更高版本中报嵌,用戶會看到它們接收恢復文件:

...
2016/08/16 14:39:20 [INFO] consul: found peers.json file,recovering Raft configuration...
2016/08/16 14:39:20 [INFO] consul.fsm:snapshot created in 12.484μs
2016/08/16 14:39:20 [INFO] snapshot: Creating newsnapshot at /tmp/peers/raft/snapshots/2-5-1471383560779.tmp
2016/08/16 14:39:20 [INFO] consul: deleted peers.json file after successful recovery
2016/08/16 14:39:20 [INFO] raft: Restored from snapshot 2-5-1471383560779
2016/08/16 14:39:20 [INFO] raft: Initial configuration (index=1): [{Suffrage:VoterID:10.212.15.121:8300 Address:10.212.15.121:8300}] ...

對任何正常離開集群的服務(wù)器執(zhí)行join命令都可以使它們重新加入集群:

$ consul join <Node Address> Successfully joined cluster by contacting 
1 nodes.

gossip協(xié)議將負責發(fā)現(xiàn)服務(wù)器節(jié)點虱咧,所有存在的都會加入集群中,此時沪蓬,集群重新進入可操作狀態(tài)彤钟,某些節(jié)點會打印下列日志確認領(lǐng)導者信息:

[INFO] consul: cluster leadership acquired

在Consul 0.7及更高版本中来候,可以使用consul operator命令檢查Raft配置:

$ consul operator raft list-peers
Node ID Address State Voter RaftProtocol
alice 10.0.1.8:8300 10.0.1.8:8300 follower true 3
bob 10.0.1.6:8300 10.0.1.6:8300 leader true 3
carol 10.0.1.7:8300 10.0.1.7:8300 follower true 3

故障排除

故障排除是任何開發(fā)人員的一項基本技能跷叉,Consul提供了多種工具來幫助用戶查看日志消息,驗證配置文件营搅,檢查服務(wù)目錄以及進行其他調(diào)試云挟。

故障排除步驟

在開始之前,用戶應(yīng)考慮遵循預定的故障排除工作流程转质,好的工作流程可以幫助用戶集中精力來發(fā)現(xiàn)和解決問題园欣,我們推薦使用以下流程解決問題:

  • 收集資料
  • 驗證有效性
  • 一次解決一個問題
  • 提出假設(shè)并進行驗證
  • 重復整個流程

Consul和其他工具會生成日志文件狀態(tài)消息休蟹,進程列表沸枯,數(shù)據(jù)反饋和其他有用的信息,用戶可以在收集數(shù)據(jù)時使用它們赂弓,在本章節(jié)中绑榴,我們將介紹這些工具。
驗證有效性的方法很重要盈魁,因為Consul位于其他高度復雜系統(tǒng)的中心翔怎。確保核心系統(tǒng)、網(wǎng)絡(luò)和服務(wù)是正常工作的,可以幫助用戶縮小問題范圍,并防止用戶花時間對錯誤的問題進行故障排除入录。如果不確定某個組件是如何工作的醋虏,或者不確定它是否正常運行,需要把它先列出來芋膘,或者花些時間驗證其是否正常運行。
由于Consul是高度可配置的,因此用戶會發(fā)現(xiàn)如果一次解決一個問題會比較容易剔氏,驗證成功的操作脖旱,然后繼續(xù)進行下一個問題。有必要的話介蛉,用戶可以構(gòu)建一個較小的系統(tǒng)萌庆,在其中測試不確定的配置項或功能,在驗證成功之后币旧,再將這些更改集成到主系統(tǒng)中践险。
基于假設(shè)去測試可以幫助用戶專注于所選的某一個問題,用戶需要記下什么問題可能導致該問題以及解決方案吹菱,然后觀察數(shù)據(jù)并采取行動巍虫,看下理論是否正確,問題是否可以解決鳍刷。
用戶可能需要重復此過程中的某些或全部步驟占遥,以找出問題所在,通過遵循一致的解決問題流程输瓜,可以高效解決問題瓦胎。

Consul專用工具

介紹完故障排除流程之后,我們可以看一些定位Consul問題的專用工具尤揣,這些工具可以幫助用戶收集數(shù)據(jù)搔啊,驗證系統(tǒng)運行狀態(tài)。
注意北戏,下面提到的每個Consul命令都可以在有權(quán)訪問Consul代理的節(jié)點上運行负芋。

查看Consul架構(gòu)

在與團隊中的其他成員或技術(shù)支持人員交流時,查看有關(guān)Consul體系結(jié)構(gòu)的一些詳細信息很有幫助嗜愈,其中包括:

  • 如何查詢Consul旧蛾?(DNS、HTTP)
  • Consul Web控制臺頁面是否可以查詢蠕嫁?
  • 用戶使用什么系統(tǒng)啟動微服務(wù)锨天?(systemdkubernetes拌阴、upstart绍绘、Nomad等)
members指令

consul members指令會列出連接到當前代理的Consul群集中的其他服務(wù)器和代理:

$ consul members 
Node    Address         Status  Type    Build  Protocol  DC   Segment 
laptop  127.0.0.1:8301  alive   server  1.4.0  2         dc1  <all>
list-peers指令

如果用戶需要除members指令提供的信息之外的詳細信息,可以嘗試使用list-peers指令迟赃,這個指令會提供一些集群的底層信息陪拘,其中包括領(lǐng)導者狀態(tài)投票狀態(tài)Raft協(xié)議版本

$ consul operator raft list-peers 
Node    ID           Address         State   Voter  RaftProtocol 
laptop  abc-def-g12  127.0.0.1:8300  leader  true   3
monitor指令

consul monitor指令會顯示Consul代理的日志纤壁,使用其他參數(shù)可以更改日志級別左刽,比如-log-level debug或者-log-level trace都會打印大量日志:

$ consul monitor
2019/01/25 17:48:33 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:abcdef Address:127.0.0.1:8300}]
2019/01/25 17:48:33 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
2019/01/25 17:48:33 [INFO] serf: EventMemberJoin: laptop.dc1 127.0.0.1
2019/01/25 17:48:33 [INFO] serf: EventMemberJoin: laptop 127.0.0.1
2019/01/25 17:48:33 [INFO] consul: Adding LAN server laptop (Addr: tcp/127.0.0.1:8300) (DC: dc1)
2019/01/25 17:48:33 [INFO] consul: Handled member-join event for server "laptop.dc1" in area "wan"
2019/01/25 17:48:33 [ERR] agent: Failed decoding service file "services/.DS_Store": invalid character '\x00' looking for beginning of value
2019/01/25 17:48:33 [INFO] agent: Started DNS server 127.0.0.1:8600 (tcp)
2019/01/25 17:48:33 [INFO] agent: Started DNS server 127.0.0.1:8600 (udp)
2019/01/25 17:48:33 [INFO] agent: Started HTTP server on 127.0.0.1:8500 (tcp)
2019/01/25 17:48:33 [INFO] agent: Started gRPC server on 127.0.0.1:8502 (tcp)
validate指令

consul validate指令可以作用于單個Consul配置文件,更多的是在整個配置文件目錄上運行酌媒,它會分析配置文件的基本語法和邏輯正確性:

consul validate /etc/consul.d/counting.json
* invalid config key serrrvice
debug指令

在節(jié)點上運行consul debug指令欠痴,它會在當前目錄下記錄下兩分鐘內(nèi)的系統(tǒng)指標迄靠、日志、概要分析數(shù)據(jù)和其他數(shù)據(jù)喇辽,所有內(nèi)容均以純文本格式寫入壓縮文檔掌挚,因此請勿在未加密的通道上傳輸此數(shù)據(jù),用戶可以將其提供給技術(shù)支持人員菩咨,幫助調(diào)試Consul群集:

$ consul debug
==> Starting debugger and capturing static information...
    Agent Version: '1.4.0'
         Interval: '30s'
         Duration: '2m0s'
           Output: 'consul-debug-1548721978.tar.gz'
          Capture: 'metrics, logs, pprof, host, agent, cluster'
==> Beginning capture interval 2019-01-28 16:32:58.56142 -0800 PST (0)

解壓縮:

$ tar xvfz consul-debug-1548721978.tar.gz

顯示內(nèi)容:

$ tree consul-debug-1548721978
健康檢查

健康檢查是Consul集群非常重要的一個部分吠式,啟用之后,不健康的服務(wù)將不會被發(fā)現(xiàn)抽米。查看初識健康狀態(tài)最簡單的方法訪問Consul Web控制臺頁面特占,地址是http://localhost:8500/ui。點擊特定服務(wù)云茸,比如counting服務(wù)是目,可以看見這個服務(wù)在每個節(jié)點上的狀態(tài),包括健康檢查的輸出信息标捺。
或者懊纳,用戶也可以使用HTTP API查看整個目錄或特定服務(wù),/v1/agent/services端點將返回所有注冊在目錄中服務(wù)的列表:

$ curl "http://127.0.0.1:8500/v1/agent/services"

可以在查詢字符串上增加過濾器宜岛,僅查詢通過健康檢查的服務(wù):

$ curl 'http://localhost:8500/v1/health/service/counting?passing'
[
    {
        "Node": {
            "ID": "da8eb9d3-...",
            "Node": "laptop",
            "Address": "127.0.0.1",
            "Datacenter": "dc1",
        },
        "Checks": [
            {
                "Node": "laptop",
                "Output": "Agent alive and reachable"
            },
            {
                "Node": "laptop",
                "Name": "Service 'counting' check",
                "Status": "passing",
                "Output": "HTTP GET http://localhost:9003/health: 200 OK Output: Hello, you've hit /health\n",
                "ServiceName": "counting"
            }
        ]
    }
]

健康檢查還有一個很重要的方面是长踊,服務(wù)不僅要當下健康功舀,更要保持健康狀態(tài)萍倡,如果某個服務(wù)在健康與不健康狀態(tài)之間波動,我們稱之為flapping辟汰。這可能是由于服務(wù)本身的問題造成的(內(nèi)部崩潰)列敲,這需要檢查服務(wù)本身,或運行進程的進程啟動器帖汞,比如systemd戴而。
這里還要考慮使用合適的健康檢查方式,推薦使用內(nèi)置的健康檢查工具(如TCPHTTP)翩蘸,而不是使用外置的Shell腳本所意。

外部工具

Consul的設(shè)計是建立在現(xiàn)有網(wǎng)絡(luò)生態(tài)協(xié)議之中的,這意味著用戶可以使用現(xiàn)有工具來收集數(shù)據(jù)催首,驗證哪些服務(wù)正在運行以及調(diào)試Consul周邊的網(wǎng)絡(luò)扶踊,應(yīng)用程序和安全上下文。

ps指令

Consul服務(wù)發(fā)現(xiàn)依賴于現(xiàn)有的進程啟動工具郎任,例如systemd秧耗、upstartinit.d。如果選擇使用這些工具舶治,可以參考其文檔編寫配置文件分井、啟動车猬、停止重新啟動腳本以及監(jiān)控由這些工具啟動的進程的輸出尺锚。
ps是Unix系統(tǒng)上的常用工具珠闰,運行它可以驗證服務(wù)進程是否按預期運行:

$ ps | grep counting 
79846 ttys001 0:00.07 ./counting-service

或者可以考慮在操作系統(tǒng)中單獨安裝pstree,它會顯示正在運行的父子進程和它們的層次結(jié)構(gòu)瘫辩。

$ pstree 
| | \-+= 74259 geoffrey -zsh 
| | \--= 79846 geoffrey ./counting-service
dig指令

如果Consul使用DNS協(xié)議铸磅,則可以使用標準DNS工具,Consul默認情況下在8600端口上運行杭朱,而不是DNS默認端口53阅仔。
dig工具是一個命令行應(yīng)用程序,可與各種DNS記錄進行交互弧械。我們可以使用@127.0.0.1加上-p 8600參數(shù)和Consul服務(wù)器的IP地址查詢詳細的DNS記錄八酒。
在此示例中,我們找到了counting服務(wù)的IP地址:

$ dig @127.0.0.1 -p 8600 counting.service.consul 
; <<>> DiG 9.10.6 <<>> @127.0.0.1 -p 8600 counting.service.consul ... ;; 
ANSWER SECTION: counting.service.consul. 0 IN A 192.168.0.35

Consul還可以通過SRV(服務(wù))參數(shù)提供其他信息刃唐,在dig命令中添加SRV參數(shù)查看counting服務(wù)所使用的端口號(下面顯示為9003):

$ dig @127.0.0.1 -p 8600 counting.service.consul SRV
;; ANSWER SECTION: counting.service.consul. 0 IN SRV 1 1 9003
Machine.local.node.dc1.consul.
;; ADDITIONAL SECTION: Machine.local.node.dc1.consul. 0 IN A
192.168.0.35

如果用戶已經(jīng)配置了DNS轉(zhuǎn)發(fā)將系統(tǒng)DNS與Consul集成羞迷,則可以省略IP地址和端口號。但是画饥,用戶在進行調(diào)試時經(jīng)常需要進行專門的設(shè)置衔瓮,用來驗證與Consul代理的直接通信是否按預期進行。

curl指令

curl命令看起來很簡單抖甘,但它在調(diào)試Web服務(wù)热鞍,或者發(fā)現(xiàn)HTTP協(xié)議相關(guān)的問題時極其有用,用戶可以使用curl命令查詢健康檢查端點驗證服務(wù)是否處于連接衔彻,可以使用IP地址薇宠,也可以使用localhost,如果用戶配置了DNS轉(zhuǎn)發(fā)艰额,則可以使用Consul綁定的域名與服務(wù)進行通信澄港,例如http://counting.service.consul

$ curl http://localhost:9003/health 
Hello, you've hit /health
ping指令

ping命令也是一個簡單的工具,用于驗證與主機的網(wǎng)絡(luò)連接(如果它可以響應(yīng)ping請求)柄沮,使用IP地址驗證一個節(jié)點是否可以與另一節(jié)點通信回梧。ping命令對于查看節(jié)點之間的延遲情況以及它們之間數(shù)據(jù)包傳輸?shù)目煽啃砸卜浅S杏谩?/p>

$ ping 10.0.1.14 
PING 10.0.1.14 (10.0.1.14): 56 data bytes 
64 bytes from 10.0.1.14: icmp_seq=0 ttl=64 time=0.065 ms 
64 bytes from 10.0.1.14: icmp_seq=1 ttl=64 time=0.068 ms 
64 bytes from 10.0.1.14: icmp_seq=2 ttl=64 time=0.060 ms 
^C 
--- 10.0.1.14 ping statistics --- 
3 packets transmitted, 3 packets received, 0.0% packet loss 
round-trip min/avg/max/stddev = 0.060/0.064/0.068/0.003 ms
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市祖搓,隨后出現(xiàn)的幾起案子狱意,更是在濱河造成了極大的恐慌,老刑警劉巖棕硫,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件髓涯,死亡現(xiàn)場離奇詭異,居然都是意外死亡纬纪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門摘仅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人问畅,你說我怎么就攤上這事娃属。” “怎么了护姆?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵矾端,是天一觀的道長卵皂。 經(jīng)常有香客問我灯变,道長,這世上最難降的妖魔是什么添祸? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任滚粟,我火速辦了婚禮凡壤,結(jié)果婚禮上林艘,老公的妹妹穿的比我還像新娘啥酱。我一直安慰自己颤陶,他們只是感情好搅方,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布姨涡。 她就那樣靜靜地躺著,像睡著了一般娄蔼。 火紅的嫁衣襯著肌膚如雪怖喻。 梳的紋絲不亂的頭發(fā)上锚沸,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機與錄音哗蜈,去河邊找鬼坠韩。 笑死距潘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的只搁。 我是一名探鬼主播音比,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氢惋!你這毒婦竟也來了洞翩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤焰望,失蹤者是張志新(化名)和其女友劉穎骚亿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熊赖,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡来屠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俱笛。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡捆姜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫂粟,到底是詐尸還是另有隱情娇未,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布星虹,位于F島的核電站零抬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宽涌。R本人自食惡果不足惜平夜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卸亮。 院中可真熱鬧忽妒,春花似錦、人聲如沸兼贸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溶诞。三九已至鸯檬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間螺垢,已是汗流浹背喧务。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留枉圃,地道東北人功茴。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像孽亲,于是被迫代替她去往敵國和親坎穿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354