簡(jiǎn)介
下面兩個(gè)章節(jié)中的內(nèi)容,可以幫助用戶部署一個(gè)由consul
打造的安全可靠的數(shù)據(jù)中心枝嘶。如果用戶希望將這個(gè)用戶中心投入生產(chǎn)環(huán)境使用乍构,建議從頭到尾仔細(xì)閱讀這份文檔,它們將幫助您成功建立和維護(hù)健康的數(shù)據(jù)中心柳譬,這篇文檔涵蓋以下幾個(gè)內(nèi)容:
- 基礎(chǔ)架構(gòu)建議
- 搭建數(shù)據(jù)中心
- 備份數(shù)據(jù)中心狀態(tài)
- 保護(hù)數(shù)據(jù)中心安全
- 配置網(wǎng)絡(luò)
- 多個(gè)數(shù)據(jù)中心配置
Consul 參考架構(gòu)
基礎(chǔ)設(shè)置要求
Consul 服務(wù)端
Consul服務(wù)端代理(Agent)維護(hù)集群狀態(tài)喳张,響應(yīng)RPC查詢,并處理所有寫入操作征绎。由于Consul服務(wù)端代理承擔(dān)了大部分繁重的工作蹲姐,因此服務(wù)器主機(jī)配置對(duì)于Consul集群的整體性能就比較關(guān)鍵了磨取,下面列舉了推薦的服務(wù)器配置:
規(guī)格 | CPU | 內(nèi)存 | 磁盤 | 典型的云示例配置 |
---|---|---|---|---|
Small | 2-4 core | 8-16 GB RAM | 50GB | AWS: m5.large, m5.xlarge;Azure: Standard_D2_v3, Standard_D4_v3柴墩;GCP: n2-standard-2, n2-standard-4 |
Large | 8-16 core | 32-64 GB RAM | 100GB | AWS: m5.2xlarge, m5.4xlarge忙厌;Azure: Standard_D8_v3, Standard_D16_v3;GCP: n2-standard-8, n2-standard-16 |
硬件配置考量
- 小規(guī)格配置適用于大多數(shù)小型生產(chǎn)環(huán)境或開發(fā)/測(cè)試環(huán)境
- 大規(guī)格配置適用于負(fù)載較高的生產(chǎn)環(huán)境
此處需要注意江咳,對(duì)于大型工作負(fù)載逢净,請(qǐng)確保磁盤支持大量 IOPS,以跟上 Raft 日志的更新速度歼指。
基礎(chǔ)架構(gòu)圖
數(shù)據(jù)中心設(shè)計(jì)
用戶可以在單個(gè)物理數(shù)據(jù)中心爹土、或跨多個(gè)數(shù)據(jù)中心部署Consul集群(通常是3或5臺(tái)服務(wù)器,加上客戶端代理)踩身。對(duì)于運(yùn)行時(shí)高讀寫的大型集群胀茵,將服務(wù)器部署在同物理地址可以提高性能;在云環(huán)境中挟阻,用戶可以跨多個(gè)可用區(qū)域(zone)部署一個(gè)數(shù)據(jù)中心琼娘,例如每個(gè)可用區(qū)域?qū)?yīng)一臺(tái)單一的主機(jī)。Consul還可以通過WAN連接單獨(dú)的集群組成多數(shù)據(jù)中心附鸽。
單數(shù)據(jù)中心
對(duì)于部署在同一個(gè)數(shù)據(jù)中心中的應(yīng)用程序脱拼,我們建議使用一個(gè)Consul集群。Consul支持傳統(tǒng)的三層架構(gòu)應(yīng)用坷备,同樣也支持微服務(wù)熄浓,搭建一個(gè)集群通常是3或5臺(tái)機(jī)器,用戶可以在可用性和性能間尋找平衡省撑。
單個(gè)數(shù)據(jù)中心的節(jié)點(diǎn)(node)數(shù)建議不超過5000個(gè)赌蔑,對(duì)于讀寫頻繁的集群,可能需要進(jìn)一步減少最大節(jié)點(diǎn)數(shù)竟秫,這具體取決KV對(duì)的數(shù)量以及監(jiān)控?cái)?shù)據(jù)的數(shù)量惯雳。當(dāng)用戶添加更多的客戶端機(jī)器時(shí),Gossip協(xié)議執(zhí)行的時(shí)間會(huì)更長(zhǎng)鸿摇、
對(duì)于寫負(fù)載高的集群石景,推薦使用硬件升級(jí)垂直擴(kuò)展,并使用低延遲存儲(chǔ)拙吉。
服務(wù)標(biāo)簽(Service Tag)
可幫助用戶對(duì)集群中的內(nèi)容進(jìn)行查詢
多數(shù)據(jù)中心
用戶可以通過WAN鏈接加入在不同數(shù)據(jù)中心中運(yùn)行相同服務(wù)的Consul集群潮孽。集群間獨(dú)立運(yùn)行,僅通過8302端口上的WAN通信筷黔,除非通過命令行或者API明確配置往史,否則Consul服務(wù)器將僅從其本地?cái)?shù)據(jù)中心返回結(jié)果。Consul不會(huì)在多個(gè)數(shù)據(jù)中心之間復(fù)制數(shù)據(jù)佛舱,但是用戶可以使用consul-replicate工具定期同步KV數(shù)據(jù)椎例。
比較好的實(shí)踐是啟用TLS服務(wù)名稱檢查挨决,以避免代理意外交叉連接。
Consul的預(yù)查詢(prepared queries)
允許客戶端在某一數(shù)據(jù)中心發(fā)生故障后订歪,去另一個(gè)數(shù)據(jù)中心發(fā)現(xiàn)服務(wù)脖祈。例如本地?cái)?shù)據(jù)中心dc1中的payment服務(wù)下線了,則預(yù)查詢使用戶能能訪問到離該數(shù)據(jù)中心地理位置最近的其他正常服務(wù)刷晋。
默認(rèn)情況下盖高,預(yù)查詢首先會(huì)在本地?cái)?shù)據(jù)中心解析。它們不支持查詢KV數(shù)據(jù)眼虱,但是可以使用ACLs喻奥。
網(wǎng)絡(luò)連接
局域網(wǎng)Gossip發(fā)生在單個(gè)數(shù)據(jù)中心中的所有代理之間,每個(gè)代理均向其成員列表中的隨機(jī)代理定期發(fā)送探測(cè)捏悬∽膊希客戶端和服務(wù)端代理都參與了Gossip協(xié)議。初識(shí)探測(cè)通過UDP
每秒發(fā)送一次过牙,如果節(jié)點(diǎn)在200ms內(nèi)未確認(rèn)诈豌,代理將使用TCP
ping通,如果TCP探測(cè)失斒愫汀(10s超時(shí)),它會(huì)要求其他隨機(jī)節(jié)點(diǎn)向這個(gè)節(jié)點(diǎn)發(fā)送探測(cè)(稱為間接探測(cè)
)彤蔽,如果還是沒有獲得有關(guān)該節(jié)點(diǎn)的響應(yīng)摧莽,則會(huì)將該代理標(biāo)記為已關(guān)閉。
代理的狀態(tài)直接影響服務(wù)發(fā)現(xiàn)結(jié)果顿痪,如果代理關(guān)閉镊辕,則它正在監(jiān)控的服務(wù)也會(huì)標(biāo)記為關(guān)閉。
此外蚁袭,代理還通過TCP
定期執(zhí)行完整狀態(tài)同步征懈,這將使每個(gè)代理了解其周圍的成員列表(包括節(jié)點(diǎn)名稱
、IP地址
和運(yùn)行狀況
)揩悄,相對(duì)于上述標(biāo)準(zhǔn)Gossip協(xié)議卖哎,這些操作開銷比較昂貴,時(shí)間通常在30s到5m之間删性,具體時(shí)間根據(jù)集群大小而定亏娜。
Consul涉及到的服務(wù)和端口如下所示:
名稱 | 端口 | 標(biāo)志位 | 描述 |
---|---|---|---|
Server RPC | 8300 | / | 服務(wù)端接收其他代理的請(qǐng)求,僅TCP連接 |
Serf LAN | 8301 | / | 用于處理局域網(wǎng)中的Gossip協(xié)議蹬挺,所有代理都需要维贺,TCP和UDP連接 |
Serf WAN | 8302 | -1禁用 | 服務(wù)端傳遞Gossip協(xié)議,TCP和UDP連接 |
HTTP API | 8500 | -1禁用 | 客戶端訪問Http請(qǐng)求巴帮,僅TCP連接 |
DNS Interface | 8600 | -1禁用 | / |
部署指南
這篇文章涵蓋了Consul安裝部署的細(xì)節(jié)溯泣,此章節(jié)與上一個(gè)章節(jié)關(guān)聯(lián)虐秋,此處強(qiáng)烈建議用戶先熟悉Consul的整體架構(gòu),為了提供高可用的單集群體系結(jié)構(gòu)垃沦,建議將Consul服務(wù)器代理部署在多臺(tái)主機(jī)上客给,Consul的參考體系架構(gòu)如下:
下載Consul
登錄Consul二進(jìn)制文件下載頁(yè)面,選擇對(duì)應(yīng)版本的Consul服務(wù):https://releases.hashicorp.com/consul/
安裝Consul
解壓zip包栏尚,將Consul二進(jìn)制文件移動(dòng)到/usr/local/bin/
目錄下起愈,檢驗(yàn)一下Consul命令是否可用:
unzip consul_${CONSUL_VERSION}_linux_amd64.zip
sudo chown root:root consul
sudo mv consul /usr/local/bin/
consul --version
開啟Consul的命令補(bǔ)全功能:
consul -autocomplete-install
complete -C /usr/local/bin/consul consul
創(chuàng)建一個(gè)非特權(quán)系統(tǒng)用戶運(yùn)行Consul并創(chuàng)建其數(shù)據(jù)目錄:
sudo useradd --system --home /etc/consul.d --shell /bin/false consul
sudo mkdir --parents /opt/consul
sudo chown --recursive consul:consul /opt/consul
配置systemd
(系統(tǒng)服務(wù)設(shè)置)
在/etc/systemd/system/consul.service
中創(chuàng)建Consul服務(wù)文件
sudo touch /etc/systemd/system/consul.service
在配置文件中添加配置:
[Unit]
Description="HashiCorp Consul - A service mesh solution"
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target
ConditionFileNotEmpty=/etc/consul.d/consul.hcl
[Service]
Type=notify
User=consul
Group=consul
ExecStart=/usr/local/bin/consul agent -config-dir=/etc/consul.d/
ExecReload=/usr/local/bin/consul reload
KillMode=process
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
systemd
配置項(xiàng)詳解:
配置項(xiàng) | 作用域 | 描述 |
---|---|---|
Description | Unit | 自定義字符串描述Consul服務(wù)名 |
Document | Unit | 關(guān)聯(lián)到Consul文檔 |
Requires | Unit | 服務(wù)啟動(dòng)前依賴的其他服務(wù) |
After | Unit | 服務(wù)啟動(dòng)完畢前依賴的其他服務(wù) |
ConditionFileNotEmpty | Unit | 依賴的配置項(xiàng)文件 |
User、Group | Service | 啟動(dòng)Consul的服務(wù)和組 |
ExecStart | Service | 啟動(dòng)Consul指令 |
ExecReload | Service | 重啟Consul指令 |
KillMode | Service | 指定如何結(jié)束該進(jìn)程 |
Restart | Service | 重啟服務(wù)機(jī)制 |
LimitNOFILE | Service | 文件描述符上限 |
WantedBy | Install | / |
配置Consul(服務(wù)端)
Consul有默認(rèn)配置項(xiàng)译仗,在配置文件中僅需設(shè)置需要自定義的配置項(xiàng)抬虽,配置項(xiàng)可以從多個(gè)配置文件中讀取,并順序加載纵菌。
整體配置
創(chuàng)建一個(gè)配置文件/etc/consul.d/consul.hcl
:
sudo mkdir --parents /etc/consul.d
sudo touch /etc/consul.d/consul.hcl
sudo chown --recursive consul:consul /etc/consul.d
sudo chmod 640 /etc/consul.d/consul.hcl
在配置文件中添加:
datacenter = "dc1"
data_dir = "/opt/consul"
encrypt = "Luj2FZWwlt8475wD1WtwUQ=="
配置項(xiàng) | 描述 |
---|---|
datacenter | 運(yùn)行代理的數(shù)據(jù)中心 |
data_dir | 代理存儲(chǔ)狀態(tài)的數(shù)據(jù)目錄 |
encrypt | 對(duì)Consul網(wǎng)絡(luò)流量進(jìn)行加密的密鑰 |
自動(dòng)加入集群
retry_join
參數(shù)允許用戶配置Consul代理阐污,通過DNS地址
、IP地址
或Cloud Auto-join
自動(dòng)形成集群咱圆,這樣就無(wú)需手動(dòng)配置Consul節(jié)點(diǎn)加入集群笛辟。
retry_join = ["172.16.0.11"]
配置項(xiàng) | 描述 |
---|---|
retry_join | 啟動(dòng)時(shí)需要加入的另一個(gè)代理的地址 |
性能配置
性能配置允許調(diào)整Consul中不同子系統(tǒng)的性能。
performance {
raft_multiplier = 1
}
度量指標(biāo)(Telemetry)配置
度量指標(biāo)
為Consul指定了各種配置序苏,將度量標(biāo)準(zhǔn)發(fā)布到上游系統(tǒng)手幢。
服務(wù)端配置
server = true
bootstrap_expect = 3
配置項(xiàng) | 描述 |
---|---|
server | 用于表示該Consul服務(wù)是服務(wù)端模式還是客戶端模式 |
bootstrap_expect | 用于表示數(shù)據(jù)中心預(yù)期的服務(wù)器數(shù)量 |
控制臺(tái)UI配置
Consul具有基于Web的控制臺(tái)界面,用戶可以通過圖形界面輕松查看所有服務(wù)忱详、節(jié)點(diǎn)和其他信息
ui = true
配置Consul(客戶端)
Consul客戶端代理配置是Consul服務(wù)端代理的子集围来,按實(shí)際需要配置。
啟動(dòng)Consul
使用systemctl
命令控制systemd
托管服務(wù)匈睁。
sudo systemctl enable consul
sudo systemctl start consul
sudo systemctl status consul
數(shù)據(jù)中心備份
在生產(chǎn)環(huán)境中創(chuàng)建服務(wù)器備份是非常重要的监透,備份為服務(wù)器提供了一種從故障(網(wǎng)絡(luò)問題、人員失誤或磁盤損壞)中恢復(fù)的機(jī)制航唆。所有服務(wù)器在提交寫請(qǐng)求之前胀蛮,都會(huì)先寫入-data-dir
,客戶端代理也可以使用相同的路徑來(lái)保存本地狀態(tài)糯钙,但一般不太必要粪狼,通常情況僅需備份服務(wù)端的Raft存儲(chǔ)狀態(tài)。
Consul可以使用命令行或者API執(zhí)行快照(Snapshot)
命令任岸,快照命名可以保存執(zhí)行時(shí)間點(diǎn)上的服務(wù)器狀態(tài)鸳玩,其中包含:
- KV條目(KV entries)
- 服務(wù)目錄(the service catalog)
- 查詢語(yǔ)句(prepared queries)
- 會(huì)話(sessions)
- 訪問控制列表(ACLs)
默認(rèn)情況下,所有快照均使用一致性模式(consistent mode)
拍攝演闭,在該模式下不跟,請(qǐng)求將轉(zhuǎn)發(fā)給領(lǐng)導(dǎo)者(leader)
,領(lǐng)導(dǎo)者在拍攝快照之前會(huì)驗(yàn)證服務(wù)是否仍在運(yùn)行米碰,如果數(shù)據(jù)中心降級(jí)或者沒有領(lǐng)導(dǎo)者窝革,則快照不會(huì)保存购城,為了減輕領(lǐng)導(dǎo)者的負(fù)載,可以使用弱一致性模式(stale consistency mode)虐译。
這將負(fù)載分散到各個(gè)節(jié)點(diǎn)上瘪板,會(huì)損失一部分一致性,微量的最近的寫入信息會(huì)遺漏漆诽,省略的寫操作通常限于從恢復(fù)點(diǎn)開始到最近100ms或更短時(shí)間內(nèi)的寫入數(shù)據(jù)侮攀,這通常適用于災(zāi)難恢復(fù)了。
創(chuàng)建數(shù)據(jù)備份
保存快照命令有許多配置選項(xiàng)厢拭,在生產(chǎn)環(huán)境中兰英,為了提高安全性,用戶需要配置ACL令牌和客戶端證書供鸠,使用默認(rèn)配置(包含一致性模式)保存快照命令如下:
consul snapshot save backup.snap
備份內(nèi)容會(huì)保存在執(zhí)行命令的目錄中畦贸,可以使用inspect
子命令查看備份文件的元數(shù)據(jù):
$ consul snapshot inspect backup.snap
ID 2-1182-1542056499724
Size 4115
Index 1182
Term 2
Version 1
接下來(lái),使用弱一致性模式保存快照:
consul snapshot save -stale backup.snap
一旦配置了ACL或者代理證書楞捂,需要將它們作為環(huán)境變量或標(biāo)志傳遞:
export CONSUL_HTTP_TOKEN=<your ACL token>
consul snapshot save -stale -ca-file=</path/to/file> backup.snap
在上面的示例中薄坏,我們將令牌設(shè)置為環(huán)境變量,將證書文件設(shè)置為命令行標(biāo)志寨闹。
對(duì)于生產(chǎn)環(huán)境胶坠,應(yīng)該將快照命令或API編寫為腳本定期運(yùn)行,除了日常備份之外繁堡,還有幾種情況需要手動(dòng)執(zhí)行保存快照沈善。一個(gè)是在升級(jí)前執(zhí)行備份;另一個(gè)是在數(shù)據(jù)中心失去仲裁帖蔓,在服務(wù)器狀態(tài)發(fā)散前執(zhí)行備份。在實(shí)際操作過程中瞳脓,不需要為每臺(tái)服務(wù)器都執(zhí)行備份塑娇,備份的文件可以保存在掛載的文件系統(tǒng)或者使用云存儲(chǔ)(例如Amazon S3)。
從備份中恢復(fù)
執(zhí)行下述操作劫侧,Raft協(xié)議
可確保所有服務(wù)器恢復(fù)到相同狀態(tài):
consul snapshot restore backup.snap
和save
子命令一樣埋酬,restore
子命令也有許多配置項(xiàng)。