Docker實戰之Consul叢集
前言
最近參加了幾場 Java 面試,發現大多數的微服務實踐還是 Eureka 偏多,鑑於筆者的單位選型 Consul,這裡對 Consul 做簡單總結。
該篇是 Docker 實戰系列的第三篇。傳送門:
- Docker 實戰之 MySQL 主從複製
- Docker 實戰之 Redis-Cluster 叢集
為什麼選 Consul?
首先 Consul 有以下幾個關鍵特性:
- 服務發現:支援服務發現。你可以通過 DNS 或 HTTP 的方式獲取服務資訊。
- 健康檢查:支援健康檢查。可以提供與給定服務相關聯的任何數量的健康檢查(如 web 狀態碼或 cpu 使用率)。
- K/V 儲存:鍵/值對儲存。你可用通過 consul 儲存如動態配置之類的相關資訊。
- 多資料中心:支援多資料中心,開箱即用。
- WEB-UI:支援 WEB-UI。點點點,你就能夠了解你的服務現在的執行情況,一目瞭然,對開發運維是非常友好的。
作為高頻的提問方式,面試官永遠從十萬個為什麼開始。但是最為程式設計師,還是需要知其然,知其所以然
。以下是幾個常用的服務發現元件的對比。
服務發現元件的選型主要從以下幾個方面進行。CAP 理論、一致性演算法、多資料中心、健康檢查、是否支援 k8s 等。
1. CAP
一致性的強制資料統一要求,必然會導致在更新資料時部分節點處於被鎖定狀態,此時不可對外提供服務,影響了服務的可用性。
2. 一致性演算法
Raft
演算法將 Server 分為三種類型:Leader、Follower 和 Candidate。Leader 處理所有的查詢和事務,並向 Follower 同步事務。Follower 會將所有的 RPC 查詢和事務轉發給 Leader 處理,它僅從 Leader 接受事務的同步。資料的一致性以 Leader 中的資料為準實現。
以下是幾種常見的一致性演算法
3. 多資料中心
Consul 通過 WAN 的 Gossip 協議,完成跨資料中心的同步;而其他的產品則需要額外的開發工作來實現;
注意多資料中心和多節點是 2 個概念
Gossip 協議是 P2P 網路中比較成熟的協議。Gossip 協議的最大的好處是,即使叢集節點的數量增加,每個節點的負載也不會增加很多,幾乎是恆定的。這就允許 Consul 管理的叢集規模能橫向擴充套件到數千個節點。
Consul 的每個 Agent 會利用 Gossip 協議互相檢查線上狀態,本質上是節點之間互 Ping,分擔了伺服器節點的心跳壓力。如果有節點掉線,不用伺服器節點檢查,其他普通節點會發現,然後用 Gossip 廣播給整個叢集。
Consul 架構
consul 的架構是什麼,官方給出了一個很直觀的圖片
單獨看資料中心 1,可以看出 consul 的叢集是由 N 個 SERVER,加上 M 個 CLIENT 組成的。而不管是 SERVER 還是 CLIENT,都是 consul 的一個節點,所有的服務都可以註冊到這些節點上,正是通過這些節點實現服務註冊資訊的共享。除了這兩個,還有一些小細節,一一簡單介紹。
CLIENT
CLIENT 表示 consul 的 client 模式,就是客戶端模式。是 consul 節點的一種模式,這種模式下,所有註冊到當前節點的服務會被轉發到 SERVER,本身是不持久化這些資訊。
SERVER
SERVER 表示 consul 的 server 模式,表明這個 consul 是個 server,這種模式下,功能和 CLIENT 都一樣,唯一不同的是,它會把所有的資訊持久化的本地,這樣遇到故障,資訊是可以被保留的。
SERVER-LEADER
中間那個 SERVER 下面有 LEADER 的字眼,表明這個 SERVER 是它們的老大,它和其它 SERVER 不一樣的一點是,它需要負責同步註冊的資訊給其它的 SERVER,同時也要負責各個節點的健康監測。
Docker 環境搭建
docker-compose-consul-cluster.yml
version: '3'
services:
consul-server1:
image: consul:latest
hostname: "consul-server1"
ports:
- "8500:8500"
- "53"
volumes:
- ./consul/data1:/consul/data
command: "agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0"
consul-server2:
image: consul:latest
hostname: "consul-server2"
ports:
- "8501:8500"
- "53"
volumes:
- ./consul/data2:/consul/data
command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0"
depends_on:
- consul-server1
consul-server3:
image: consul:latest
hostname: "consul-server3"
ports:
- "8502:8500"
- "53"
volumes:
- ./consul/data3:/consul/data
command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0"
depends_on:
- consul-server1
consul-node1:
image: consul:latest
hostname: "consul-node1"
command: "agent -join consul-server1 -disable-host-node-id"
depends_on:
- consul-server1
consul-node2:
image: consul:latest
hostname: "consul-node2"
command: "agent -join consul-server1 -disable-host-node-id"
depends_on:
- consul-server1
執行 docker-compose -f docker-compose-consul-cluster.yml up -d
啟動,然後訪問
http://localhost:8500
看到下圖即啟動成功
最後
Docker 實戰系列皆以快速搭建學習環境為主,Consul 的特性學習及生產環境配置還任重道遠。閱讀過程中如有疑問或錯誤,還望多多指正。
公眾號 【當我遇上你】