Sentinel 發布 v1.4,添加集群流控功能

2021-01-11 開源中國

自去年10月底發布GA版本後,Sentinel在近期發布了另一個裡程碑版本v1.4(最新的版本號是v1.4.1),加入了開發者關注的集群流控功能。

一、為什麼需要集群流控功能?

假設我們希望給某個用戶限制調用某個 API 的總 QPS 為 50,但機器數可能很多(比如有 100 臺)。這時候我們很自然地就想到,找一個 server 專門用來統計總的調用量,其它的實例都與這臺 server 通信以判斷是否可以調用。這就是最基礎的集群流控的方式。

那麼這個 server 如何部署呢?最直觀的方式就是作為獨立的 token server 進程啟動,獨立部署:

 

另一種就是嵌入模式(Embedded),即作為內置的 token server 與服務在同一進程中啟動,無需單獨部署:

此外,集群流控還可以解決流量不均勻導致總體限流效果不佳的問題。

假設集群中有 10 臺機器,我們給每臺機器設置單機限流閾值為 10 QPS,理想情況下整個集群的限流閾值就為 100 QPS。不過實際情況下流量到每臺機器可能會不均勻,會導致總量沒有到的情況下某些機器就開始限流:

因此,僅靠單機維度去限制的話會無法精確地限制總體流量。而集群流控可以精確地控制整個集群的調用總量,結合單機限流兜底,可以更好地發揮流量控制的效果。

 

二、Sentinel的集群流控功能是什麼?

Sentinel 1.4.0 開始引入了集群流控模塊,主要分為兩個部分:

 

Sentinel 集群流控支持限流規則和熱點規則兩種規則,並支持兩種形式的閾值計算方式:

 

集群總體模式:即限制整個集群內的某個資源的總體 QPS 不超過此閾值。

單機均攤模式:單機均攤模式下配置的閾值等同於單機能夠承受的限額,Token Server 會根據連接數來計算總的閾值(比如獨立模式下有 3 個 client 連接到了 token server,然後配的單機均攤閾值為 10,則計算出的集群總量就為 30),按照計算出的總的閾值來進行限制。這種方式根據當前的連接數實時計算總的閾值,對於機器經常進行變更的環境非常適合。

 

 

三、如何使用Sentinel的集群流控功能?部署方式

Sentinel 集群流控服務端支持獨立模式(Alone)以及嵌入模式(Embedded)。兩者的優缺點對比:

 

獨立模式作為獨立的 token server 進程啟動,獨立部署,隔離性好,但是需要額外的部署操作。獨立模式適合作為 Global Rate Limiter 給整個集群提供流控服務。

嵌入模式作為內置的 token server 嵌入到應用進程中。嵌入模式下集群中各個實例都是對等的,token server 和 client 可以隨時進行轉變,無需單獨部署,靈活性比較好。但缺點就是隔離性不佳,需要限制 token server 的總 QPS,防止影響應用本身。嵌入模式適合某個應用集群內部的流控。

 

Sentinel 提供 API 來對 client / server 進行配置以及指定模式,但是機器多的時候不方便進行管理。一般我們需要通過 Sentinel 控制臺的集群流控管理功能來統一管理某個應用集群下所有的 token server 和 token client,靈活進行分配。

 配置

配置是集群流控中比較重要的一部分。Sentinel 集群流控的配置主要包含幾部分:

集群規則配置需要藉助動態規則源。以集群流控規則為例,對於客戶端,我們可以用之前的方式向 FlowRuleManager 註冊動態規則源。而對於 Token Server,我們需要向集群規則管理器 ClusterFlowRuleManager 註冊規則源。我們推薦的方式是在應用端註冊動態規則源,然後在 Sentinel 控制臺直接推送規則到配置中心,即 push 模式:

 

以嵌入模式為例,一個比較好的實踐是:結合流量分布和實時負載情況來在服務集群中選取幾臺較為空閒的機器作為 Token Server,其它的機器作為 Token Client,劃分成幾組,分別歸屬各自的 Token Server 管理。最後組成一個映射表,類似於:

// ip: token server IP, port: token server port, clientSet: 所管轄的 token client 集合[{"clientSet":["112.12.88.66@8729","112.12.88.67@8727"],"ip":"112.12.88.68","machineId":"112.12.88.68@8728","port":11111}]

然後像 Token Client / Token Server 通信配置、集群流控模式等配置源都可以監聽這個分配映射表對應的數據源,來解析自己的身份和相關通信配置。當分配映射表變更時每臺機器對應的身份和配置也會實時變更,實時生效。Sentinel 1.4.1 改進了 Sentinel 控制臺集群流控的管理頁面,可以直接以應用維度來分配 Token Server。可以參考本文後面的指引來使用。

 

其它的配置比如 Token Server 的命名空間集合(namespace set,用於指定該 Token Server 可以為哪些應用/分組服務)、最大允許的總 QPS 等,既可以通過 Sentinel 預留的 HTTP API 來變更配置,也可以通過註冊動態配置源來進行配置。

 

快速使用集群流控

下面我們來看一下如何快速使用集群流控功能。接入集群流控模塊的步驟如下:

 

(1)引入集群流控依賴

這裡我們以嵌入模式來運行 token server,即在應用集群中指定某臺機器作為 token server,其它的機器指定為 token client。首先我們引入集群流控相關依賴:

<dependency>    <groupId>com.alibaba.csp</groupId>    <artifactId>sentinel-cluster-client-default</artifactId>    <version>1.4.1</version></dependency><dependency>    <groupId>com.alibaba.csp</groupId>    <artifactId>sentinel-cluster-server-default</artifactId>    <version>1.4.1</version></dependency>

 

(2)配置動態規則源

要想使用集群流控功能,我們需要在應用端配置動態規則源,並通過 Sentinel 控制臺實時進行推送。流程如下所示:

 

以流控規則為例,假設我們使用 ZooKeeper 作為配置中心,則可以向客戶端 FlowRuleManager 註冊 ZooKeeper 動態規則源:

ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new ZookeeperDataSource<>(remoteAddress, path, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

 

另外,我們還需要針對 Token Server 註冊集群規則數據源。由於嵌入模式下 token server 和 client 可以隨時變換,因此我們只需在每個實例都向集群流控規則管理器ClusterFlowRuleManager註冊動態規則源即可。Token Server 抽象出了命名空間(namespace)的概念,可以支持多個應用/服務,因此我們需要註冊一個自動根據 namespace 創建動態規則源的生成器:

// Supplier 會根據 namespace 生成的動態規則源,類型為 SentinelProperty<List<FlowRule>>,針對不同的 namespace 生成不同的規則源(監聽不同 namespace 的 path).// 默認 namespace 為應用名(project.name)// ClusterFlowRuleManager 針對集群限流規則,ClusterParamFlowRuleManager 針對集群熱點規則,配置方式類似ClusterFlowRuleManager.setPropertySupplier(namespace -> {    return new SomeDataSource(address, dataIdPrefix + namespace).getProperty();});

 

(3)控制臺進行改造適配動態規則源

我們只需簡單對 Sentinel 控制臺進行改造即可直接將流控規則推送至配置中心。從 Sentinel 1.4.0 開始,Sentinel 控制臺提供 DynamicRulePublisher 和 DynamicRuleProvider  接口用於實現應用維度的規則推送和拉取,並提供了 Nacos 推送的示例(位於 test 目錄下)。我們只需要實現自己的 DynamicRulePublisher 和 DynamicRuleProvider接口並在 FlowControllerV2類中相應位置通過 @Qualifier註解指定對應的 bean name 即可,類似於:

@Autowired@Qualifier("flowRuleNacosProvider")private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;@Autowired@Qualifier("flowRuleNacosPublisher")private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

 

Sentinel 控制臺提供應用維度推送的頁面(/v2/flow)。在上述配置完成後,我們可以在此頁面向配置中心推送規則:

 

(4)控制臺分配 Token Server

當上面的步驟都完成後,我們就可以在 Sentinel 控制臺的&ldquo;集群流控&rdquo; Token Server 列表頁面管理分配 token server 了。假設我們啟動了三個應用實例,我們選擇一個實例為 token server,其它兩個為 token client:

頁面上機器的顯示方式為 ip@commandPort,其中 commandPort 為應用端暴露給 Sentinel 控制臺的埠。選擇好以後,點擊 保存 按鈕,刷新頁面即可以看到 token server 分配成功:

 

並且我們可以在頁面查看 token server 的連接情況:

 

(5)配置規則,觀察效果

接下來我們配置一條集群限流規則,限制 com.alibaba.csp.sentinel.demo.cluster.app.service.DemoService:sayHello(java.lang.String)  資源的集群總 QPS 為 10,選中&ldquo;是否集群&rdquo;選項,閾值模式選擇總體閾值:

 

模擬流量同時請求這三臺機器,過一段時間後觀察效果。可以在監控頁面看到對應資源的集群維度的總 QPS 穩定在 10。

 

四、還有哪些問題需要注意?

集群流控能夠精確地控制整個集群的 QPS,結合單機限流兜底,可以更好地發揮流量控制的效果。

還有更多的場景等待大家發掘,比如:

儘管集群流控比較好用,但它不是萬能的,只有在確實有必要的場景下才推薦使用集群流控。

另外若在生產環境使用集群限流,管控端還需要關注以下的問題:

未來我們還計劃實現集群流控多語言版本的客戶端,並對接 Service Mesh,讓 Sentinel 集群流控可以在更多場景下使用。

 

本文作者:宿何,社區暱稱sczyh30,阿里巴巴高可用架構組開發工程師,目前主要負責Sentinel 開源項目的開發和社區維護。

相關焦點

  • Sentinel Go 1.0.1 發布,雲原生流控降級組件
    Sentinel Go 1.0.1 版本正式發布,針對 1.0 GA 版本進行了一些功能改進和 bug fix。
  • Sentinel 1.6.3 正式發布,引入網關流控控制臺的支持
    Sentinel 1.6.3 正式發布,引入網關流控控制臺的支持,同時帶來一些 bug 修復和功能改進,歡迎使用!
  • Sentinel Dashboard(基於1.8.1)流控規則持久化到Nacos——涉及...
    那麼就會出現很嚴重的問題(流控規則達不到預期,配置數據不一致),所以推薦使用Sentinel Dashboard統一界面進行配置管理流控規則正因為Sentinel Dashboard當前版本(截至目前為止是1.8.1-SNAPSHOT)暫不支持,但是可以通過改造部分源碼實現此功能,具體請看下面介紹。
  • Sentinel Go 0.6.0 發布,支持 Warm-Up 預熱流控
    Sentinel Go 0.6.0 正式發布,該版本帶來了 Warm-Up 預熱流控特性、go-micro 框架的適配模塊,以及其它的一些特性改進
  • Sentinel 1.7.0 發布,支持 Envoy 集群流量控制
    流控降級中間件 Sentinel 1.7.0 版本正式發布,引入了 Envoy 集群流量控制支持、properties 文件配置、Consul/Etcd/Spring Cloud Config
  • 流控降級組件 Sentinel Go 0.4.0 發布,支持熱點流量防護能力
    Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺、冷啟動、消息削峰填谷、集群流量控制、實時熔斷下遊不可用服務等,是保障微服務高可用的利器,原生支持 Java/Go/C++ 等多種語言,並且提供 Istio/Envoy/SOFA MOSN 全局流控支持來為 Service Mesh 提供高可用防護的能力。
  • 阿里雙11流控降級組件Sentinel Go正式GA,助力雲原生服務穩穩穩
    4. 熱點防護流量是隨機的,不可預測的。為了防止被大流量打垮,我們通常會對核心接口配置限流規則,但有的場景下配置普通的流控規則是不夠的。我們來看這樣一種場景——大促峰值的時候,總是會有不少「熱點」商品,這些熱點商品的瞬時訪問量非常高。
  • Sentinel 1.5.0 正式發布,引入 Reactive 支持
    流控降級組件 Sentinel 的又一個裡程碑版本 1.5.0 正式發布,引入了 reactive 的支持,並提供多項新特性與改進。
  • Sentinel V1.7.0 已發布
    從1.7.0開始,Sentinel支持通過任意屬性文件進行配置。我們可以使用-Dcsp.sentinel.config.file屬性項設置屬性文件的路徑。請參閱此處了解更多詳細信息。更新功能: 增添Sentinel發送rls token伺服器實現 支持Sentinel的任意配置屬性文件路徑 改進SPI類加載器機制以處理更複雜的場景 添加對資源分類適配器的支持 .......................
  • Sentinel 1.7.2 發布,完善開源生態及擴展性
    Sentinel 1.7.2 正式發布,帶來了 Logger SPI 擴展機制、Zuul 2.x 網關流控、SOFARPC 適配等多項特性和改進。
  • Sentinel Go 0.4.0 發布,支持熱點流量防護能力
    Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺、冷啟動、消息削峰填谷、集群流量控制、實時熔斷下遊不可用服務等,是保障微服務高可用的利器,原生支持 Java/Go/C++ 等多種語言,並且提供 Istio/Envoy/SOFA MOSN 全局流控支持來為 Service Mesh 提供高可用防護的能力。
  • 阿里中間件開源組件 Sentinel 發布首個官方推薦可生產版本
    近日,阿里中間件開源組件Sentinel 發布首個官方推薦可生產版本:1.3.0-GA ,該版本包括 Sentinel 控制臺功能的完善和一些
  • 基於Sentinel的高可用限流系統設計及實現完整版
    二、架構設計設計原則:1)高可用2)高可擴展3)高性能4)支持高並發三、具體實現1、sentinel-dashboard的修改1)修改Metric的存儲將Metric數據由默認存儲到內存中,修改為存儲到外部Influxdb集群中,Influxdb集群理論上支持任意多個Influxdb實例,sentinel-dashboard
  • 新增多集群管理,支持GPU及批量導入主機,KubeOperator v3.4發布
    12月14日,開源容器平臺KubeOperator發布v3.4.0版本。在這一版本中,KubeOperator新增了多集群管理(X-Pack增強包內)、GPU支持、集群操作日誌、批量導入主機、集群日誌支持Loki等功能,同時針對FusionCompute支持默認模板,在應用商店中增加了Kuboard和TensorFlow。
  • Redis Sentinel-深入淺出原理和實戰
    Sentinel功能概覽Sentinel其大致的功能如下圖。SentinelSentinel是Redis高可用的解決方案之一,本身也是分布式的架構,包含了「多個」Sentinel節點和「多個」Redis節點。
  • 面試官:Redis有哪幾種集群方案?原理和優缺點是什麼?
    哨兵的配置文件為sentinel.conf,在文件中添加sentinel monitor mymaster 127.0.0.1 6379 1 sentinel auth-pass mymaster 123456 sentinel down-after-milliseconds mymaster 5000 sentinel parallel-syncs
  • Redis 單例、主從模式、sentinel 以及集群的配置方式及優缺點對比
    關於sentinel,這裡需要說明幾個概念:每個sentinel節點其實就是一個redis實例,與主從節點不同的是sentinel節點作用是用於監控redis數據節點的,而sentinel節點集合則表示監控一組主從redis實例多個sentinel監控節點的集合,比如有主節點master和從節點slave-1、slave-2。
  • MongoDB 4.0 正式發布,支持多文檔事務
    Transactions,多文檔事務MongoDB 4.0 提供了針對副本集執行多文檔事務的功能。macOS MongoDB 4.0 二進位文件支持 TLS 1.2,同時在支持 TLS 1.1+ 的系統上禁用對 TLS 1.0 加密的支持。Windows 上的 MongoDB Enterprise 不再支持 AES256-GCM。
  • 邁向雲原生,Sentinel Golang 首個版本發布
    Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺、冷啟動、消息削峰填谷、集群流量控制、實時熔斷下遊不可用服務等,是保障微服務高可用的利器。Sentinel 開源初期主要面向 Java 微服務,同時也在朝著多語言擴展的方向不斷探索。
  • TeaWeb v0.1.5 發布,支持 HTTPS 證書申請、HTTP 隧道功能
    本版本主要提供了一個免費HTTPS證書的申請工具、一個簡單易用的HTTP隧道功能。申請HTTPS證書界面預覽:TCP),可以通過代理功能,將你本機的Web服務發布到公網,具體請看 http://teaos.cn/doc/proxy/Tunnel.md     * 改進內存緩存,提升緩存性能     * 更全面地支持IPv6     * 優化訪問日誌信息解析速度     * 增加緩存相關變量:${cache.status