<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          降本提效!注冊(cè)中心在螞蟻集團(tuán)的蛻變之路

          共 9522字,需瀏覽 20分鐘

           ·

          2021-11-26 23:47

          324adb0e548be9f411f48114a13591c2.webp


          文|林育智(花名:源三?)

          螞蟻集團(tuán)高級(jí)專家專注微服務(wù)/服務(wù)發(fā)現(xiàn)相關(guān)領(lǐng)域

          校對(duì)|李旭東


          本文?8624?字 閱讀?18?分鐘



          |引 言|


          服務(wù)發(fā)現(xiàn)是構(gòu)建分布式系統(tǒng)的最重要的依賴之一, 在螞蟻集團(tuán)承擔(dān)該職責(zé)的是注冊(cè)中心和 Antvip,其中注冊(cè)中心提供機(jī)房?jī)?nèi)的服務(wù)發(fā)現(xiàn)能力,Antvip 提供跨機(jī)房的服務(wù)發(fā)現(xiàn)能力。


          本文討論的重點(diǎn)是注冊(cè)中心和多集群部署形態(tài)(IDC 維度),集群和集群之間不涉及到數(shù)據(jù)同步。


          PART. 1

          背 景


          回顧注冊(cè)中心在螞蟻集團(tuán)的演進(jìn),大概起始于 2007/2008 年,至今演進(jìn)超過 13 年。時(shí)至今日,無論是業(yè)務(wù)形態(tài)還是自身的能力都發(fā)生了巨大的變化。


          簡(jiǎn)單回顧一下注冊(cè)中心的歷代發(fā)展:


          ?V1:引進(jìn)淘寶的 configserver


          dfedbc727996570fa7688511a819609e.webp


          ?V2:橫向擴(kuò)展?


          598e2b54a9d9296e8847110c85b55220.webp


          從這個(gè)版本開始,螞蟻和阿里開始獨(dú)立的演進(jìn),最主要的差異點(diǎn)是在數(shù)據(jù)存儲(chǔ)的方向選擇上。螞蟻選擇了橫向擴(kuò)展,數(shù)據(jù)分片存儲(chǔ)。阿里選擇了縱向擴(kuò)展,加大 data 節(jié)點(diǎn)的內(nèi)存規(guī)格。


          這個(gè)選擇影響到若干年后的 SOFARegistry 和 Nacos 的存儲(chǔ)架構(gòu)。


          ?V3 / V4:LDC 支持和容災(zāi)?


          b3328b0252a2e67758dbec6907602bc9.webp


          V3 支持 LDC 單元化。


          V4 增加了決策機(jī)制和運(yùn)行時(shí)列表,解決了單機(jī)宕機(jī)時(shí)需要人工介入處理的問題,一定程度上提升高可用和減少運(yùn)維成本。


          ?V5:SOFARegistry


          28b68d220e83b9ea1cb8757ebea0ca52.webp


          前四個(gè)版本是 confreg,17 年啟動(dòng) V5 項(xiàng)目 SOFARegistry,目標(biāo)是:


          1.代碼可維護(hù)性:confreg 代碼歷史包袱較重

          - 少量模塊使用 guice 做依賴管理,但大部分模塊是靜態(tài)類交互,不容易分離核心模塊和擴(kuò)展模塊,不利于產(chǎn)品開源。

          - 客戶端與服務(wù)端的交互模型嵌套復(fù)雜,理解成本極高且對(duì)多語(yǔ)言不友好。


          2.運(yùn)維痛點(diǎn):引入 Raft 解決 serverlist 的維護(hù)問題,整個(gè)集群的運(yùn)維包括 Raft,通過 operator 來簡(jiǎn)化。


          3.魯棒性:在一致性 hash 環(huán)增加多節(jié)點(diǎn)備份機(jī)制(默認(rèn) 3 副本),2 副本宕機(jī)業(yè)務(wù)無感。


          4.跨集群服務(wù)發(fā)現(xiàn):站內(nèi)跨集群服務(wù)發(fā)現(xiàn)額外需要 antvip 支撐,希望可以統(tǒng)一 2 套設(shè)施的能力,同時(shí)商業(yè)化場(chǎng)景也有跨機(jī)房數(shù)據(jù)同步的需求。


          這些目標(biāo)部分實(shí)現(xiàn)了,部分實(shí)現(xiàn)的還不夠好,例如運(yùn)維痛點(diǎn)還殘留一部分,跨集群服務(wù)發(fā)現(xiàn)在面對(duì)主站的大規(guī)模數(shù)據(jù)下穩(wěn)定性挑戰(zhàn)很大。


          ?V6:SOFARegistry 6.0?


          2020 年 11 月,SOFARegistry 總結(jié)和吸收內(nèi)部/商業(yè)化打磨的經(jīng)驗(yàn),同時(shí)為了應(yīng)對(duì)未來的挑戰(zhàn),啟動(dòng)了 6.0 版本大規(guī)模重構(gòu)計(jì)劃。


          歷時(shí) 10 個(gè)月,完成新版本的開發(fā)和升級(jí)工作,同時(shí)鋪開了應(yīng)用級(jí)服務(wù)發(fā)現(xiàn)。


          PART. 2

          挑 戰(zhàn)


          ?當(dāng)下面臨的問題?


          集群規(guī)模的挑戰(zhàn)


          - 數(shù)據(jù)增長(zhǎng):隨著業(yè)務(wù)的發(fā)展,業(yè)務(wù)的實(shí)例數(shù)在不斷增長(zhǎng),pub/sub 的數(shù)量也相應(yīng)增長(zhǎng)。以其中一個(gè)集群為例,2019 年的數(shù)據(jù)為基準(zhǔn)數(shù)據(jù),在 2020 年 pub 接近千萬(wàn)級(jí)。
          下圖是該集群歷年雙十一時(shí)的數(shù)據(jù)對(duì)比和切換應(yīng)用級(jí)的優(yōu)化效果。相比 2019 年雙十一,2021 年雙十一接口級(jí)的 pub 增長(zhǎng) 200%,sub 增長(zhǎng) 80%。
          795d6746531f920468d9a81ba8d97309.webp
          - 故障爆炸半徑增長(zhǎng):集群接入的實(shí)例越多,故障影響的業(yè)務(wù)和實(shí)例數(shù)也就越多,保障業(yè)務(wù)的穩(wěn)定是最基礎(chǔ)也是優(yōu)先級(jí)最高的要求。
          - 考驗(yàn)橫向擴(kuò)展能力:集群達(dá)到一定的規(guī)模后,是否還具備繼續(xù)橫向擴(kuò)展的能力,需要集群具備良好的橫向擴(kuò)展能力,從 10 擴(kuò)到 100 和從 100 擴(kuò)到 500 是不一樣的難度。
          - HA 能力:集群實(shí)例數(shù)多了后,面臨的節(jié)點(diǎn)總體的硬件故障率也相應(yīng)增高,各種機(jī)器故障集群是否能快速恢復(fù)?有運(yùn)維經(jīng)驗(yàn)的同學(xué)都知道,運(yùn)維一個(gè)小集群和運(yùn)維一個(gè)大集群面臨的困難簡(jiǎn)直是指數(shù)級(jí)增長(zhǎng)。
          - 推送性能:大多數(shù)服務(wù)發(fā)現(xiàn)的產(chǎn)品都選擇了數(shù)據(jù)的最終一致性,但是這個(gè)最終在不同集群的規(guī)模下到底是多久?相關(guān)的產(chǎn)品其實(shí)都沒有給出明確的數(shù)據(jù)。
          但是實(shí)際上,我們認(rèn)為這個(gè)指標(biāo)是服務(wù)發(fā)現(xiàn)產(chǎn)品的核心指標(biāo)。這個(gè)時(shí)長(zhǎng)對(duì)調(diào)用有影響:新加的地址沒有流量;刪除的地址沒有及時(shí)摘除等。螞蟻集團(tuán)的 PaaS 對(duì)注冊(cè)中心的推送時(shí)延是有 SLO 約束的:如果變更推送列表延時(shí)超過約定值,業(yè)務(wù)端的地址列表就是錯(cuò)誤的。我們歷史上也曾發(fā)生過因推送不及時(shí)導(dǎo)致的故障。
          業(yè)務(wù)實(shí)例規(guī)模增加的同時(shí)也帶來推送的性能壓力:發(fā)布端 pub 下面的實(shí)例數(shù)增加;訂閱端業(yè)務(wù)實(shí)例數(shù)增加;一個(gè)簡(jiǎn)單的估算,pub/sub 增長(zhǎng) 2 倍,推送的數(shù)據(jù)量是 2*2,增長(zhǎng) 4 倍,是一個(gè)乘積的關(guān)系。同時(shí)推送的性能也決定了同一時(shí)間可以支持的最大運(yùn)維業(yè)務(wù)實(shí)例數(shù),例如應(yīng)急場(chǎng)景下,業(yè)務(wù)大規(guī)模重啟。如果這個(gè)是瓶頸,就會(huì)影響故障的恢復(fù)時(shí)間。


          集群規(guī)模可以認(rèn)為是最有挑戰(zhàn)性的,核心的架構(gòu)決定了它的上限,確定后改造成本非常高。而且往往等到發(fā)現(xiàn)瓶頸的時(shí)候已經(jīng)是兵臨城下了,我們要選擇能拉高產(chǎn)品技術(shù)天花板的架構(gòu)。


          運(yùn)維的挑戰(zhàn)


          SOFARegistry 立項(xiàng)時(shí)的一個(gè)主要目標(biāo)是具備比 confreg 更好的運(yùn)維能力:引入 meta 角色,通過 Raft 選舉和存儲(chǔ)元信息,提供集群的控制面能力。但是事實(shí)證明,我們還是低估了可運(yùn)維的重要性,正如魯迅先生說:【程序員的工作只有兩件事情,一件是運(yùn)維,另一件還是運(yùn)維】。


          三年前的目標(biāo)放到今天已經(jīng)嚴(yán)重滯后了。


          - 集群數(shù)增長(zhǎng):螞蟻集團(tuán)內(nèi)部的業(yè)務(wù)是分站點(diǎn)部署的(簡(jiǎn)單理解為每個(gè)站點(diǎn)是一塊相對(duì)比較獨(dú)立的業(yè)務(wù),需要不同級(jí)別的隔離),同時(shí)一個(gè)站點(diǎn)需要部署多套集群:容災(zāi)需要分機(jī)房部署;開發(fā)需要分多環(huán)境。部署站點(diǎn)的數(shù)目增長(zhǎng)超出我們的想像。現(xiàn)在已經(jīng)達(dá)到數(shù)百個(gè)集群了,還在迅速增長(zhǎng)中,增長(zhǎng)速度參考最近幾年美聯(lián)儲(chǔ)的貨幣供應(yīng)量增長(zhǎng)速度。以前認(rèn)為有些運(yùn)維工作可以茍且,人肉頂一下,集群數(shù)增長(zhǎng)后,茍且次數(shù)太多了,擠占了開發(fā)/運(yùn)維同學(xué)的精力,完全沒資源去規(guī)劃詩(shī)和遠(yuǎn)方。
          04f63202fc456bad37c9713d0181e5d6.webp
          -?業(yè)務(wù)打擾:業(yè)務(wù)的運(yùn)維是全天候 7*24 的,容量自適應(yīng)/自愈/MOSN 每月一版本把全站應(yīng)用犁一遍等等。下圖是每分鐘運(yùn)維的機(jī)器批數(shù),可以看到,就算是周末和深夜,運(yùn)維任務(wù)也是不斷的。


          37a24b031b140747929707a00e865d14.webp


          螞蟻集團(tuán)的同學(xué)對(duì)注冊(cè)中心的運(yùn)維公告應(yīng)該是比較熟悉和痛恨的。因?yàn)闃I(yè)務(wù)的敏感性,注冊(cè)中心之前一直是停機(jī)發(fā)布和運(yùn)維,這個(gè)時(shí)候需要鎖定全站的發(fā)布/重啟動(dòng)作。為了盡量少影響業(yè)務(wù),注冊(cè)中心相關(guān)的同學(xué)只能獻(xiàn)祭一頭黑發(fā),在深夜低峰期做相關(guān)的操作。即使這樣,仍然沒辦法做到對(duì)業(yè)務(wù)零打擾。



          ?云原生時(shí)代 naming 的挑戰(zhàn)?


          8bc69749e39fa1c38c6e4f2255669a07.webp


          云原生的技術(shù)時(shí)代下,可以觀察到一些趨勢(shì):


          - 微服務(wù)/FaaS 的推廣導(dǎo)致輕型應(yīng)用增多:實(shí)例數(shù)增多,需要能支撐更大的業(yè)務(wù)規(guī)模
          - 應(yīng)用實(shí)例的生命周期更短:FaaS 按需使用,autoscale 容量自適應(yīng)等手段導(dǎo)致實(shí)例的漲潮退潮更頻繁,注冊(cè)中心的性能主要體現(xiàn)在實(shí)例變更的響應(yīng)速度上
          - 多語(yǔ)言支持:在過去,螞蟻集團(tuán)主要的開發(fā)體系是 Java,非 Java 語(yǔ)言對(duì)接基礎(chǔ)設(shè)施都是二等公民,隨著 AI 和創(chuàng)新性業(yè)務(wù)的需求,非 Java 體系的場(chǎng)景越來越多。如果按照每種語(yǔ)言一個(gè) SDK,維護(hù)成本會(huì)是個(gè)噩夢(mèng),當(dāng)然 sidecar(MOSN)是個(gè)解法,但是自身是否能支持低侵入性的接入方式,甚至 sdk-free 的能力?
          - 服務(wù)路由:在過去絕大部分的場(chǎng)景都可以認(rèn)為 endpoint 是平等的,注冊(cè)中心只提供通信的地址列表是可以滿足需求的。在 Mesh 的精確路由場(chǎng)景里面,pilot 除了提供 eds(地址列表)也同時(shí)提供 rds(routing),注冊(cè)中心需豐富自身的能力。
          - K8s:K8s 當(dāng)前已經(jīng)成為事實(shí)上的分布式操作系統(tǒng),K8s-service 如何和注冊(cè)中心打通?更進(jìn)一步,是否能解決 K8s-service 跨 multi-cluster 的問題?


          「總結(jié)」


          綜上,除了腳踏實(shí)地,解決當(dāng)下的問題,還需要仰望星空。具備解決云原生趨勢(shì)下的 naming 挑戰(zhàn)的可能性,也是 V6 重構(gòu)的主要目標(biāo)。


          PART. 3

          SOFARegistry 6.0:面向效能


          SOFARegistry 6.0 不只是一個(gè)注冊(cè)中心引擎,需要和周邊的設(shè)施配合,提升開發(fā)、運(yùn)維、應(yīng)急的效能,解決以下的問題。(紅色模塊是比較有挑戰(zhàn)性的領(lǐng)域)


          7b81dd0922a408a045f221e8c44157fe.webp


          SOFARegistry 6.0 相關(guān)的工作包括:


          26a0d1b92b231f0db1439fd2e98f5b52.webp



          ?架構(gòu)優(yōu)化?


          架構(gòu)的改造思路:在保留 V5 的存儲(chǔ)分片架構(gòu)的同時(shí),重點(diǎn)的目標(biāo)是優(yōu)化元信息 meta 一致性和確保推送正確的數(shù)據(jù)。


          f47f8f17738d895ae2835eabf131af5c.webp


          元信息 meta 一致性


          V5 在 meta 角色中引入 Raft 的強(qiáng)一致性進(jìn)行選舉 leader 和存放元信息,其中元信息包括節(jié)點(diǎn)列表和配置信息。數(shù)據(jù)的分片通過獲取 meta 的節(jié)點(diǎn)列表做一致性 hash,這里面存在兩個(gè)問題:


          - Raft/operator 運(yùn)維復(fù)雜? (1)定制運(yùn)維流程:需要支持 change peer 等編排。在螞蟻集團(tuán),特化的運(yùn)維流程成本較高,同時(shí)也不利于輸出。? (2)實(shí)現(xiàn)一個(gè)生產(chǎn)健壯的 operator 成本非常高,包括接入變更管控 operator 自身的變更三板斧等。? (3)對(duì)于網(wǎng)絡(luò)/磁盤的可用性比較敏感。在輸出的場(chǎng)景,會(huì)面臨比較惡劣的硬件情況,排查成本較高。
          - 脆弱的強(qiáng)一致性meta 信息的使用建立在滿足強(qiáng)一致性的情況下,如果出現(xiàn)網(wǎng)絡(luò)問題,例如有 session 網(wǎng)絡(luò)分區(qū)連不上 meta,錯(cuò)誤的路由表會(huì)導(dǎo)致數(shù)據(jù)分裂。需要機(jī)制確保:即使 meta 信息不一致也能在短時(shí)間內(nèi)維持?jǐn)?shù)據(jù)的正確性,留有應(yīng)急的緩沖時(shí)間。


          推送正確的數(shù)據(jù)


          當(dāng) data 節(jié)點(diǎn)大規(guī)模運(yùn)維時(shí),節(jié)點(diǎn)列表劇烈變化導(dǎo)致數(shù)據(jù)不斷遷移,推送出去的數(shù)據(jù)存在完整性/正確性的風(fēng)險(xiǎn)。V5 通過引 3 副本來避免這種情況,只要有一個(gè)副本可用,數(shù)據(jù)就是正確的,但是該限制對(duì)運(yùn)維流程負(fù)擔(dān)很大,我們要確保每次操作少于兩個(gè)副本或者挑選出滿足約束的運(yùn)維序列。

          對(duì)于 V5 及之前的版本,運(yùn)維操作是比較粗糙的,一刀切做停機(jī)發(fā)布,通過鎖 PaaS?禁止業(yè)務(wù)變更,等 data 節(jié)點(diǎn)穩(wěn)定后,再打開推送能力來確保避免推送錯(cuò)誤數(shù)據(jù)的風(fēng)險(xiǎn)。

          此外,預(yù)期的運(yùn)維工作可以這樣做,但是對(duì)于突發(fā)的多 data 節(jié)點(diǎn)宕機(jī),這個(gè)風(fēng)險(xiǎn)仍然是存在的。

          我們需要有機(jī)制確保:data 節(jié)點(diǎn)列表變化導(dǎo)致數(shù)據(jù)遷移時(shí),容忍接受額外的輕微推送時(shí)延,確保推送數(shù)據(jù)正確。


          「成果」


          - meta 存儲(chǔ)/選舉 組件插件化,站內(nèi)去 Raft,使用 db 做 leader 選舉和存儲(chǔ)配置信息,降低運(yùn)維成本。
          - 數(shù)據(jù)使用固定 slot 分片,meta 提供調(diào)度能力,slot 的調(diào)度信息通過 slotTable 保存,session/data 節(jié)點(diǎn)可容忍該信息的弱一致性,提升魯棒性。
          - 多副本調(diào)度減少 data 節(jié)點(diǎn)變動(dòng)時(shí)數(shù)據(jù)遷移的開銷,當(dāng)前線上的數(shù)據(jù)量 follower 升級(jí) leader 大概 200ms (follower 持有絕大部分的數(shù)據(jù)),直接分配 leader 數(shù)據(jù)同步耗時(shí) 2s-5s。
          - 優(yōu)化數(shù)據(jù)通信/復(fù)制鏈路,提升性能和擴(kuò)展能力。
          - 大規(guī)模運(yùn)維不需要深夜鎖 PaaS,減少對(duì)業(yè)務(wù)打擾和保住運(yùn)維人員頭發(fā),提升幸福感。


          數(shù)據(jù)鏈路和 slot 調(diào)度:


          - slot 分片參考 Redis Cluster 的做法,采用虛擬哈希槽分區(qū),所有的 dataId 根據(jù)哈希函數(shù)映射到 0 ~ N 整數(shù)槽內(nèi)。
          - meta 的 leader 節(jié)點(diǎn),通過心跳感知存活的 data 節(jié)點(diǎn)列表,盡可能均勻的把 slot 的多副本分配給 data 節(jié)點(diǎn),相關(guān)的映射關(guān)系保存在 slotTable,有變更后主動(dòng)通知給 session/data。
          - session/data 同時(shí)通過心跳獲取最新的 slotTable,避免 meta 通知失效的風(fēng)險(xiǎn)。
          - slot 在 data 節(jié)點(diǎn)上有狀態(tài)機(jī) Migrating -> Accept -> Moved。遷移時(shí)確保 slot 的數(shù)據(jù)是最新的才進(jìn)入 Accept 狀態(tài),才可以用于推送,確保推送數(shù)據(jù)的完整性。
          1d69ee665dd75571adf102311057a5ba.webp


          data 節(jié)點(diǎn)變動(dòng)的數(shù)據(jù)遷移:


          2864738e0700a4ce2e3c4f425048b8e2.webp


          對(duì)一個(gè)接入 10w+ client 的集群進(jìn)行推送能力壓測(cè),分鐘級(jí) 12M 的推送量,推送延遲 p999 可以保持在 8s 以下。session cpu20%,data cpu10%,物理資源水位較低,還有較大的推送 buffer。


          4ace65804fec2b00761236532b19484b.webp


          同時(shí)我們也在線上驗(yàn)證橫向擴(kuò)展能力,集群嘗試最大擴(kuò)容到 session*370,data*60,meta*3 ;meta 因?yàn)橐幚硭械墓?jié)點(diǎn)心跳,CPU 達(dá)到 50%,需要 8C 垂直擴(kuò)容或者進(jìn)一步優(yōu)化心跳開銷。按照一個(gè) data 節(jié)點(diǎn)的安全水位支撐 200w pub,一個(gè) pub 大概 1.5K 開銷,考慮容忍 data 節(jié)點(diǎn)宕機(jī) 1/3 仍然有服務(wù)能力,需要保留 pub 上漲的 buffer,該集群可支撐 1.2 億的 pub,如果配置雙副本則可支撐 6kw 的 pub。



          ?應(yīng)用級(jí)服務(wù)發(fā)現(xiàn)?


          注冊(cè)中心對(duì) pub 的格式保留很強(qiáng)的靈活性,部分 RPC 框架實(shí)現(xiàn) RPC 服務(wù)發(fā)現(xiàn)時(shí),采用一個(gè)接口一個(gè) pub 的映射方式,SOFA/HSF/Dubbo2 都是采用這種模式,這種模型比較自然,但是會(huì)導(dǎo)致 pub/sub 和推送量膨脹非常厲害。


          Dubbo3 提出了應(yīng)用級(jí)服務(wù)發(fā)現(xiàn)和相關(guān)原理【1】。在實(shí)現(xiàn)上,SOFARegistry 6.0 參考了 Dubbo3,采用在 session 端集成服務(wù)的元數(shù)據(jù)中心模塊的方案,同時(shí)在兼容性上做了一些適配。


          「應(yīng)用級(jí)服務(wù) pub 數(shù)據(jù)拆分」


          729f0eaefb60da46ee40139ec06bd092.webp


          「兼容性」


          應(yīng)用級(jí)服務(wù)發(fā)現(xiàn)的一個(gè)難點(diǎn)是如何低成本的兼容接口級(jí)/應(yīng)用級(jí),雖然最后大部分的應(yīng)用都能升級(jí)到應(yīng)用級(jí),升級(jí)過程中會(huì)面臨以下問題:


          - 應(yīng)用數(shù)多,同時(shí)各個(gè)應(yīng)用升級(jí)到應(yīng)用級(jí)的時(shí)間點(diǎn)差距比較大- 部分應(yīng)用無法升級(jí),例如一些遠(yuǎn)古應(yīng)用


          我們采用以應(yīng)用級(jí)服務(wù)為主,同時(shí)兼容接口級(jí)的解決方案:


          5e1e3cb1092a4fdaa7ec23521bcd05da.webp


          在升級(jí)時(shí)同時(shí)存在新舊版本的兩個(gè) SOFARegistry,不同版本的 SOFARegistry 對(duì)應(yīng)到不同的域名。升級(jí)后的應(yīng)用端(圖中的 MOSN)采用雙訂閱雙發(fā)布的方式逐步灰度切換,確保切換過程中,沒有升級(jí)接入 MOSN 或者沒有打開開關(guān)的應(yīng)用不受影響。


          在完成絕大多數(shù)應(yīng)用的應(yīng)用級(jí)遷移后,升級(jí)后的應(yīng)用都已經(jīng)到了 SOFARegistry 6.0 版本的注冊(cè)中心上,但仍然存在少量應(yīng)用因?yàn)闆]有接入 MOSN,這些余留的 old app 也通過域名切換到 SOFARegistry 6.0,繼續(xù)以接口級(jí)訂閱發(fā)布和注冊(cè)中心交互。為了確保已升級(jí)的和沒升級(jí)的應(yīng)用能夠互相訂閱,做了一些支持:


          - 提供應(yīng)用級(jí) Publisher 轉(zhuǎn)接到口級(jí) Publisher 的能力:接口級(jí)訂閱端是無法直接訂閱應(yīng)用級(jí)發(fā)布數(shù)據(jù)的,針對(duì)接口級(jí)訂閱按需從 AppPublisher 轉(zhuǎn)換出 InterfacePublisher,沒有接入 MOSN 的應(yīng)用可以順利的訂閱到這部分?jǐn)?shù)據(jù),因?yàn)橹挥猩倭繎?yīng)用沒有接入 MOSN,需要轉(zhuǎn)化的應(yīng)用級(jí) Publisher 很少。
          - 應(yīng)用級(jí)訂閱端在訂閱的時(shí)候額外發(fā)起一個(gè)接口級(jí)的訂閱,用于訂閱沒有接入升級(jí)的應(yīng)用發(fā)布數(shù)據(jù)。由于這部分應(yīng)用非常少,實(shí)際絕大多數(shù)的服務(wù)級(jí)訂閱都不會(huì)有推送任務(wù),因此對(duì)推送不會(huì)造成壓力。


          「效果」


          b1bb3fe5151bb6a5fec119c1facf54c6.webp


          上圖是一個(gè)集群切換應(yīng)用級(jí)后的效果,其中切換后剩余部分接口級(jí) pub 是為了兼容轉(zhuǎn)換出來的數(shù)據(jù),接口級(jí) sub 沒減少也是為了兼容接口級(jí)發(fā)布。如果不考慮兼容性,pub 數(shù)據(jù)減少高達(dá) 97%。極大的減輕了數(shù)據(jù)規(guī)模的對(duì)集群的壓力。



          ?SOFARegistryChaos:自動(dòng)化測(cè)試?


          注冊(cè)中心的最終一致性的模型一直是個(gè)測(cè)試難題:


          - 最終是多久?- 達(dá)到最終前有沒有推送錯(cuò)誤的數(shù)據(jù)- 達(dá)到最終前有沒有推送少數(shù)據(jù)- 集群發(fā)生故障/數(shù)據(jù)遷移時(shí)對(duì)數(shù)據(jù)的正確性和時(shí)延的影響- client 端頻繁按照各種順序調(diào)用 API 的影響- client 端頻繁連接斷連的影響


          針對(duì)該系列問題,我們開發(fā)了 SOFARegistryChaos,特別針對(duì)最終一致性提供完備的測(cè)試能力,除此還提供功能/性能/大規(guī)模壓測(cè)/混沌測(cè)試等能力。同時(shí),通過插件化的機(jī)制,也支持接入測(cè)試其他服務(wù)發(fā)現(xiàn)產(chǎn)品的能力,基于 K8s 的部署能力,能讓我們快速的部署測(cè)試組件。


          具備以上的能力后,不單可以測(cè)試自身的產(chǎn)品能力,例如還可以快速的測(cè)試 zookeeper 在服務(wù)發(fā)現(xiàn)方面的相關(guān)性能來做產(chǎn)品比較。


          f1f38102269bfa48b5dbbe7a3e1a82b7.webp


          測(cè)試觀測(cè)性


          提供的關(guān)鍵數(shù)據(jù)的觀測(cè)能力,通過 metrics 透出,對(duì)接 Prometheus 即可提供可視化能力:


          - 推送時(shí)延- 設(shè)定時(shí)間內(nèi)的最終一致性檢測(cè)- 發(fā)生故障注入的時(shí)間點(diǎn)- 最終一致期間推送數(shù)據(jù)的完整性
          該能力的測(cè)試是一個(gè)比較有意思的創(chuàng)新點(diǎn),通過固化一部分的 client 和對(duì)應(yīng)的 pub,校驗(yàn)每次其他各種變更導(dǎo)致的推送數(shù)據(jù),這部分?jǐn)?shù)據(jù)都必須是要完整和正確的。- 推送次數(shù)
          - 推送數(shù)據(jù)體積


          25649e32a87ad7bddf4adc058b888407.webp


          失敗 case 的排查


          測(cè)試場(chǎng)景中,client 操作時(shí)序和故障注入都是隨機(jī)編排的,我們?cè)?SOFARegistryChaos master 端記錄和收集了所有的操作命令時(shí)序。當(dāng) case 失敗時(shí),可通過失敗的數(shù)據(jù)明細(xì)和各個(gè) client 的 API 調(diào)用情況來快速定位問題。


          例如下圖的失敗 case 顯示在某個(gè) Node 上的訂閱者對(duì)某個(gè) dataId 的訂閱數(shù)據(jù)沒通過校驗(yàn),預(yù)期是應(yīng)該要推空, 但是推送了一條數(shù)據(jù)下來。同時(shí)顯示了該 dataId 所有相關(guān)的 publisher 在測(cè)試期間的相關(guān)操作軌跡。


          2e975d4336988fe55b094c604944b79e.webp


          黑盒探測(cè)


          大家是否經(jīng)歷過類似的 case:


          - 突然被業(yè)務(wù)告知系統(tǒng)出現(xiàn)問題,一臉懵的我:系統(tǒng)沒異常啊- 發(fā)現(xiàn)系統(tǒng)出現(xiàn)故障時(shí),實(shí)際已經(jīng)對(duì)業(yè)務(wù)造成了嚴(yán)重影響


          注冊(cè)中心因?yàn)楸旧淼奶匦裕瑢?duì)業(yè)務(wù)的影響往往是滯后的,例如 2K 個(gè) IP 只推送了 1K 個(gè),這種錯(cuò)誤不會(huì)導(dǎo)致業(yè)務(wù)馬上感知到異常。但是實(shí)際本身已經(jīng)出問題了。對(duì)于注冊(cè)中心,更需要有提前發(fā)現(xiàn)治末病的能力。


          這里我們引入黑盒探測(cè)的方式:模擬廣義上的用戶行為,探測(cè)鏈路是否正常。

          SOFARegistryChaos 實(shí)際上就可以作為一個(gè)注冊(cè)中心的用戶,并且是加強(qiáng)版的,提供端到端的告警能力。


          我們把 SOFARegistryChaos 部署到線上,開啟小流量作為一個(gè)監(jiān)控項(xiàng)。當(dāng)注冊(cè)中心異常但還沒對(duì)業(yè)務(wù)造成可感知的影響時(shí),我們有機(jī)會(huì)及時(shí)介入,減少風(fēng)險(xiǎn)事件升級(jí)成大故障的風(fēng)險(xiǎn)。


          磨刀不誤砍柴工


          通過 SOFARegistryChaos,核心能力的驗(yàn)證效率極大提升,質(zhì)量得到保障的同時(shí),開發(fā)同學(xué)寫代碼也輕松了許多。從 7 月份到 10 月中的 3 個(gè)半月時(shí)間里,我們迭代并發(fā)布了 5 個(gè)版本,接近 3 周 1 個(gè)版本。這個(gè)開發(fā)效率在以前是不敢想象的,同時(shí)也獲得完善的端到端告警能力。



          ?運(yùn)維自動(dòng)化?


          nightly build


          雖然我們集群數(shù)目非常多,但是因?yàn)槭菂^(qū)分了多環(huán)境,部分環(huán)境對(duì)于穩(wěn)定性的要求相對(duì)生產(chǎn)流量要求稍微低一些,例如灰度以下的環(huán)境。這些環(huán)境的集群是否可以在新版本保證質(zhì)量的情況下,快速低成本的 apply 。結(jié)合 SOFARegistryChaos,我們和質(zhì)量/SRE 的同學(xué)正在建設(shè) nightly build 設(shè)施。


          SOFARegistryChaos 作為變更門禁,新版本自動(dòng)化的部署,接受 SOFARegistryChaos 的測(cè)試通過后,自動(dòng)化部署到灰度以下的集群,僅在生產(chǎn)發(fā)布時(shí)候人工介入。


          613a926713b22d8856b08ebdd00bba9b.webp


          通過 nightly build,極大的減輕非生產(chǎn)環(huán)境的發(fā)布成本,同時(shí)新版本能盡早接受業(yè)務(wù)流量的檢驗(yàn)。


          故障演練


          雖然我們做了大量的質(zhì)量相關(guān)的工作,但是在線上面對(duì)各種故障時(shí)究竟表現(xiàn)如何?是騾子還是馬,還是要拉出來溜一溜。


          我們和 SRE 的同學(xué)在線上會(huì)定期做故障容災(zāi)演練,包括但不限于網(wǎng)絡(luò)故障;大規(guī)模機(jī)器宕機(jī)等。另外演練不能是一錘子買賣的事情,沒有保鮮的容災(zāi)能力其實(shí)等于 0。在仿真/灰度集群,進(jìn)行容災(zāi)常態(tài)化,演練-迭代循環(huán)。


          0440a2d974bd2935c57e9983a9ed752c.webp


          定位診斷


          故障容災(zāi)演練常態(tài)化后,如何快速的定位到故障源成了擺在桌子上的一個(gè)問題,否則每次演練都雞飛狗跳的,效率太低了。

          SOFARegistry 各個(gè)節(jié)點(diǎn)做了大量的可觀測(cè)性的改進(jìn),提供豐富的可觀測(cè)能力,SRE 的診斷系統(tǒng)通過相關(guān)數(shù)據(jù)做實(shí)時(shí)診斷,例如這個(gè) case 里就是一個(gè) session 節(jié)點(diǎn)故障導(dǎo)致 SLO 破線。有了定位能力后,自愈系統(tǒng)也可以發(fā)揮作用,例如某個(gè) session 節(jié)點(diǎn)被診斷出網(wǎng)絡(luò)故障,自愈系統(tǒng)可以觸發(fā)故障節(jié)點(diǎn)的自動(dòng)化替換。


          8fdab3c15b77d9277deb39b8d5e3d5de.webp


          目前,我們的容災(zāi)演練應(yīng)急絕大部分 case 已經(jīng)不需要人肉介入,也只有這樣低成本的演練才能常態(tài)化。


          「收益」


          通過不斷的演練暴露問題和快速迭代修復(fù),SOFARegistry 的穩(wěn)定性逐步提升。


          「總結(jié)」


          SOFARegistry 6.0 除了自身的優(yōu)化,在測(cè)試/運(yùn)維/應(yīng)急方面做了大量的工作,目標(biāo)是提升研發(fā)/質(zhì)量/運(yùn)維人員的效能,讓相關(guān)同學(xué)擺脫低效的人肉工作,提升幸福感。


          PART. 4

          開源:一個(gè)人可以走得很快,

          但一群人可以走的更遠(yuǎn)


          SOFARegistry 是一個(gè)開源項(xiàng)目,也是開源社區(qū) SOFAStack 重要的一環(huán),我們希望用社區(qū)的力量推動(dòng) SOFARegistry 的前進(jìn),而不是只有螞蟻集團(tuán)的工程師去開發(fā)。


          在過去一年,SOFARegistry 因?yàn)橹匦脑?6.0 重構(gòu)上,社區(qū)幾乎處于停滯狀態(tài),這個(gè)是我們做得不夠好的地方。


          我們制定了未來半年的社區(qū)計(jì)劃,在 12 月份會(huì)基于內(nèi)部版本開源 6.0,開源的代碼包含內(nèi)部版本的所有核心能力,唯一區(qū)別是內(nèi)部版本多了對(duì) confreg-client 的兼容性支持。


          affdb567d294d2c61285edd32ebe1aec.webp


          另外從 6.1 后,我們希望后繼的方案設(shè)計(jì)/討論也是基于社區(qū)來開展,整個(gè)研發(fā)進(jìn)程更透明和開放。


          PART. 5

          我們?nèi)栽诼飞?/strong>


          2021 年是 SOFARegistry 審視過去,全面夯實(shí)基礎(chǔ),提升效能的一年。


          當(dāng)然,我們當(dāng)前還仍然處在初級(jí)階段,前面還有很長(zhǎng)的路要走。例如今年雙十一的規(guī)模面臨一系列非常棘手的問題:


          - 一個(gè)集群內(nèi)單應(yīng)用實(shí)例數(shù)過多(熱點(diǎn)應(yīng)用單集群高達(dá) 7K 個(gè)實(shí)例)導(dǎo)致業(yè)務(wù)端收到地址推送時(shí) CPU/memory 開銷過大。- 全地址列表推送,導(dǎo)致的連接數(shù)過多等。


          還有其他的挑戰(zhàn):


          - 增量推送,減少推送數(shù)據(jù)量和 client 端的資源開銷- 統(tǒng)一服務(wù)發(fā)現(xiàn),支持跨集群- 適應(yīng)云原生下的新趨勢(shì)- 社區(qū)的運(yùn)營(yíng)- 產(chǎn)品易用性


          「參 考」


          【1】Dubbo3 提出了應(yīng)用級(jí)服務(wù)發(fā)現(xiàn)和相關(guān)原理:

          https://dubbo.apache.org/zh/blog/2021/06/02/dubbo3-%E5%BA%94%E7%94%A8%E7%BA%A7%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0/



          關(guān)于我們:


          螞蟻應(yīng)用服務(wù)團(tuán)隊(duì)是服務(wù)于整個(gè)螞蟻集團(tuán)的核心技術(shù)團(tuán)隊(duì),打造了世界領(lǐng)先的金融級(jí)分布式架構(gòu)的基礎(chǔ)設(shè)施平臺(tái),是 Service Mesh 等云原生領(lǐng)域的領(lǐng)先者,開發(fā)運(yùn)維著全球最大的 Service Mesh 集群,螞蟻集團(tuán)的消息中間件每天支撐上萬(wàn)億的消息流轉(zhuǎn)。


          歡迎對(duì) Service Mesh/微服務(wù)/服務(wù)發(fā)現(xiàn) 等領(lǐng)域感興趣的同學(xué)加入我們。


          聯(lián)系郵箱:?[email protected]



          ???本周推薦閱讀??


          bbe0635ca7ee9d52b3eab99afd2d938a.webp

          穩(wěn)定性大幅度提升:SOFARegistry v6 新特性介紹


          b3dcaaee2bcb7a566f95abb9500607a5.webp

          我們做出了一個(gè)分布式注冊(cè)中心


          a6f5ba1ac89736bcd4a3b668b6400189.webp

          Prometheus on CeresDB 演進(jìn)之路


          12e4fc080083cc6799ac46dcf049804b.webp

          如何在生產(chǎn)環(huán)境排查 Rust 內(nèi)存占用過高問題



          瀏覽 59
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆0047醉酒欲女邻居进错房 | 亚洲蜜臀AV乱码久久精品蜜桃图片 | 欧美一级片 | 欧美性爱成 | 亚州欧美 |