中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Airbnb的變更數(shù)據(jù)捕獲系統(tǒng),實(shí)現(xiàn)數(shù)據(jù)突變實(shí)時(shí)響應(yīng)

2018-09-27    來源:raincent

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

 

干貨前的小情景。

小長假馬上就要到啦!Karim決定要好好享受這個(gè)假期。他登陸Airbnb為去舊金山的旅行訂房間,偶然發(fā)現(xiàn)Dany登出的好房子,這可真是太好啦。

沒過一會(huì)兒,Dany收到了房間被預(yù)定的提示。他檢查了下日程表,確定自己已經(jīng)把這些日期預(yù)留了出來。也注意到那個(gè)時(shí)段房間的推薦價(jià)格上漲了一些。“這個(gè)假期一定有很多人來舊金山玩兒啊”,他自言自語道。Dany把這個(gè)周其他幾天的房間也顯示可用。

這時(shí)在美國另一邊的東海岸,Sara正在位于曼哈頓切爾西區(qū)的公寓里喝茶,為她去舊金山公司總部的商務(wù)旅行做準(zhǔn)備。她在Airbnb上找了一會(huì)兒房子,并沒有看到什么好的,正打算休息的時(shí)候,看到Dany的房間出現(xiàn)在了搜索頁面上。看了看介紹,Sara覺得這個(gè)房間太適合了!她馬上給Dany發(fā)了消息:“親愛的Dany,我要去舊金山旅行,你的房間看起來非常棒…”

在過去的幾年中,適應(yīng)數(shù)據(jù)演變已經(jīng)成為Airbnb許多新興應(yīng)用的經(jīng)常需求。上面的場景是個(gè)很好的示例,其中動(dòng)態(tài)定價(jià),房間可用性和預(yù)留工作流需要近乎實(shí)時(shí)地響應(yīng)系統(tǒng)中不同部分的變化。

從基礎(chǔ)架構(gòu)的角度來看,設(shè)計(jì)我們的架構(gòu)以擴(kuò)展是必要的,因?yàn)槲覀兊臄?shù)據(jù)和服務(wù)數(shù)量不斷增長。然而,作為努力面向服務(wù)架構(gòu)的一部分,在微服務(wù)之間傳播有意義的數(shù)據(jù)模型突變的有效方式同時(shí)保持保留數(shù)據(jù)所有權(quán)邊界的解耦架構(gòu)同樣重要。

作為回應(yīng),我們創(chuàng)造了SpinalTap;一種可擴(kuò)展,高性能,可靠,無損的變更數(shù)據(jù)捕獲(CDC)服務(wù),能夠檢測跨不同數(shù)據(jù)源類型的低延遲的數(shù)據(jù)突變,并將它們作為標(biāo)準(zhǔn)化事件傳播給下游的消費(fèi)者。SpinalTap已經(jīng)成為Airbnb基礎(chǔ)架構(gòu)和衍生數(shù)據(jù)處理平臺(tái)中不可或缺一部分,幾個(gè)關(guān)鍵應(yīng)用流水線都依賴于此。在這篇文章中,我們將概述它的系統(tǒng)體系結(jié)構(gòu),使用案例,性能保證以及它是怎樣擴(kuò)展的。

背景介紹

變更數(shù)據(jù)捕獲(CDC)是一種設(shè)計(jì)模式,可以捕獲數(shù)據(jù)更改并通知參與者,以便他們做出相應(yīng)的反應(yīng)。這遵循發(fā)布--訂閱模型,其中數(shù)據(jù)集的更改是關(guān)鍵。

系統(tǒng)要求

我們的這些使用案例需要該系統(tǒng)擁有這些高級要求:

無損:對數(shù)據(jù)丟失零容忍,這是針對基于流的會(huì)計(jì)審計(jì)應(yīng)用程序的需求

可擴(kuò)展性:水平擴(kuò)展以適應(yīng)日益增長的負(fù)載和數(shù)據(jù)集群,以避免隨著增長重復(fù)設(shè)計(jì)系統(tǒng)

性能:變更近乎實(shí)時(shí)地反饋給訂閱的用戶(亞秒級)

一致性:強(qiáng)制維持排序和時(shí)間線一致性以保留特定數(shù)據(jù)記錄的更改順序

容錯(cuò):具有可配置的冗余度,可以抵御故障

可延伸性:可適應(yīng)不同數(shù)據(jù)源和接收器類型的通用框架

曾考慮過的解決方案

文獻(xiàn)中有用于構(gòu)建CDC系統(tǒng)的幾種解決方案,其中最常用是:

輪詢:通過跟蹤狀態(tài)屬性(例如上次的更新或版本),可以使用時(shí)間驅(qū)動(dòng)策略定期檢查是否已將任何更改記錄在數(shù)據(jù)存儲(chǔ)中

觸發(fā)器:對于支持?jǐn)?shù)據(jù)庫觸發(fā)器的存儲(chǔ)引擎(例如:MySQL),它們是基于行觸發(fā)存儲(chǔ)過程,可以以無縫方式將更改傳播到其他數(shù)據(jù)表

雙重寫入:在請求期間,數(shù)據(jù)更改可被傳遞給應(yīng)用程序?qū)又械挠嗛喯M(fèi)者,例如通過發(fā)出事件或在寫入提交后調(diào)度RPC

審計(jì)跟蹤:大多數(shù)數(shù)據(jù)存儲(chǔ)解決方案使用事務(wù)日志(或更改日志)來記錄和跟蹤提交到數(shù)據(jù)庫的更改。這通常用于群集節(jié)點(diǎn)之間的復(fù)制和恢復(fù)操作(例如意外服務(wù)器關(guān)閉或故障轉(zhuǎn)移)

使用數(shù)據(jù)庫更改日志來檢測更改有幾個(gè)好處:與觸發(fā)器和輪詢策略相比,從日志中讀取允許采用異步非侵入式方法來捕獲更改。它還支持提交時(shí)的強(qiáng)一致性和排序保證,并保留事務(wù)邊界信息,這兩點(diǎn)都是雙寫操作無法實(shí)現(xiàn)的。它允許從特定時(shí)間點(diǎn)重放事件。考慮到這一點(diǎn),SpinalTap是基于此設(shè)計(jì)的。

構(gòu)架

 

工作流程概述

 

在高層次上,SpinalTap被視為一個(gè)通用解決方案,它抽象了變更捕獲工作流程,足以輕松適應(yīng)不同的基本架構(gòu)(數(shù)據(jù)存儲(chǔ),事件總線,客戶服務(wù))。該方案由3個(gè)主要組件構(gòu)成,有助于實(shí)現(xiàn)這些特性:

來源

 

 

左圖:源組件圖;右圖:源事件工作流程

源表示來自特定數(shù)據(jù)存儲(chǔ)的變更事件流的來源。只要有可訪問的更改日志來流式傳輸事件,就可以使用不同的數(shù)據(jù)源類型輕松擴(kuò)展源抽象。從更改日志解析的事件將被過濾,處理并轉(zhuǎn)換為相應(yīng)的突變。

突變是應(yīng)用程序?qū)蛹壍,表示?shù)據(jù)實(shí)體的單個(gè)更改(插入,更新或刪除)。它包括更改前后的實(shí)體值,唯一標(biāo)識(shí)符,事務(wù)信息和來自源事件的元數(shù)據(jù)。源還負(fù)責(zé)檢測數(shù)據(jù)模式演變,并借用相應(yīng)的突變傳播模式信息。這對于確保在客戶端反序列化實(shí)體值或從早期狀態(tài)重放事件時(shí)的一致性非常重要。

目的地

 

左圖:目的地組件圖;右圖:目的地事件工作流程

 

在處理并轉(zhuǎn)換為標(biāo)準(zhǔn)化事件之后,目標(biāo)表示突變的接收器。目的地還跟蹤最后成功發(fā)布的突變,該突變用于將源狀態(tài)位置導(dǎo)出到檢查點(diǎn)。該組件抽象出所使用的傳輸介質(zhì)和格式。在Airbnb,Apache Kafka作為活動(dòng)總線,在基礎(chǔ)設(shè)施中廣泛使用。Apache Thrift被用作數(shù)據(jù)格式,定義標(biāo)準(zhǔn)化的變異模式并提供跨語言支持(Ruby和Java)。

通過對系統(tǒng)進(jìn)行基準(zhǔn)測試確定了主要瓶頸是變異發(fā)布?紤]到系統(tǒng)設(shè)置有利于延遲的強(qiáng)一致性,這種情,我們采用了一些優(yōu)化措施:

 

 

緩沖目標(biāo):為了避免在等待發(fā)布突變時(shí)阻塞源,我們使用內(nèi)存中有界隊(duì)列來緩沖從源發(fā)出的事件(消費(fèi)者-生產(chǎn)者模式)。當(dāng)目標(biāo)發(fā)布突變時(shí),源將向緩沖區(qū)添加事件。一旦可用,目標(biāo)將從緩沖區(qū)中提取事件并處理下一批突變。

 

 

目標(biāo)池:對于在傳入事件速率中顯示不穩(wěn)定尖峰行為的源,內(nèi)存緩沖區(qū)偶爾會(huì)飽和,從而導(dǎo)致性能的間歇性降級。為了減輕系統(tǒng)的不規(guī)則負(fù)載模式,我們將源事件的應(yīng)用程序級分區(qū)應(yīng)用于由線程池管理的一組可配置的緩沖目標(biāo)。事件多路復(fù)用到線程目標(biāo),同時(shí)保留排序模式。這使我們能夠?qū)崿F(xiàn)高吞吐量,同時(shí)不會(huì)影響延遲或一致性。

管道

 

 

左:管道組件圖;右:管道管理者協(xié)調(diào)管道生命周期

管道協(xié)調(diào)給定源和目標(biāo)之間的工作流程。它代表了并行的基本單位。它還負(fù)責(zé)定期檢查源狀態(tài),并管理事件流的生命周期。如果出現(xiàn)錯(cuò)誤行為,管道將執(zhí)行正常關(guān)閉并啟動(dòng)故障恢復(fù)過程。根據(jù)最后的狀態(tài)檢查點(diǎn),采用保持活動(dòng)機(jī)制來確保在發(fā)生故障時(shí)重新啟動(dòng)源流。這允許在保持?jǐn)?shù)據(jù)完整性的同時(shí)自動(dòng)修復(fù)間歇性故障。管道管理器負(fù)責(zé)在給定的集群節(jié)點(diǎn)上創(chuàng)建,更新和刪除管道以及管道生命周期(啟動(dòng)/停止)。它還確保在運(yùn)行時(shí)相應(yīng)地傳播對管道配置的任何更改。

集群管理

 

 

左圖:集群資源管理;中圖:節(jié)點(diǎn)故障恢復(fù);右:使用實(shí)例標(biāo)記進(jìn)行隔離

為了實(shí)現(xiàn)某些理想的體系結(jié)構(gòu)方面-例如可擴(kuò)展性,容錯(cuò)性和隔離性-我們采用了一個(gè)集群管理框架(Apache Helix)來協(xié)調(diào)跨計(jì)算資源的流處理分布。這有助于我們實(shí)現(xiàn)確定性負(fù)載平衡,并通過集群中源處理器的自動(dòng)重新分配實(shí)現(xiàn)水平擴(kuò)展。

為了通過可配置的容錯(cuò)來提升高可用性,每個(gè)源都被指定為集群節(jié)點(diǎn)的某個(gè)子集來處理事件流。我們使用Leader-Standby狀態(tài)模型,其中只有一個(gè)節(jié)點(diǎn)在任何給定點(diǎn)流式傳輸來自源的事件,而子群集中的其余節(jié)點(diǎn)處于待命狀態(tài)。如果領(lǐng)導(dǎo)者關(guān)閉,那么其中一個(gè)備用節(jié)點(diǎn)將擔(dān)任領(lǐng)導(dǎo)。

為了支持源類型處理之間的隔離,群集中的每個(gè)節(jié)點(diǎn)都標(biāo)記有可以委派給它的源類型。流處理跨群集節(jié)點(diǎn)分布,同時(shí)保持此隔離標(biāo)準(zhǔn)。

為了解決來自網(wǎng)絡(luò)分區(qū)的不一致性,特別是在多個(gè)節(jié)點(diǎn)承擔(dān)來自特定源(分裂腦)的流式傳輸?shù)念I(lǐng)導(dǎo)的情況下,我們維持每個(gè)源的全局領(lǐng)導(dǎo)者時(shí)期,其在領(lǐng)導(dǎo)者轉(zhuǎn)換時(shí)原子遞增。隨著每個(gè)突變傳播領(lǐng)導(dǎo)者時(shí)代,并且通過忽略具有比觀察到的最新時(shí)期更小的時(shí)期的事件,通過客戶端過濾來減輕不一致性。

保證

某些保證對于系統(tǒng)維護(hù)是必不可少的,以適應(yīng)所有下游用例。

數(shù)據(jù)完整性:系統(tǒng)保持至少一次交付保證,其中對底層數(shù)據(jù)存儲(chǔ)的任何更改最終都會(huì)傳播到客戶端。這表明更改日志中不存在任何事件永久丟失,并且是在SLA指定的時(shí)間窗口內(nèi)傳遞。我們確保不會(huì)發(fā)生數(shù)據(jù)損壞,并且突變內(nèi)容保持源事件的奇偶校驗(yàn)。

事件排序:根據(jù)規(guī)定的分區(qū)方案強(qiáng)制執(zhí)行排序。我們維持每個(gè)數(shù)據(jù)記錄(行)的排序,即給定數(shù)據(jù)庫表中特定行的所有更改都將按順序接收。

時(shí)間線一致性:在時(shí)間線上保持一致要求在給定時(shí)間范圍內(nèi)按時(shí)間順序接收變化,給定變異集的兩個(gè)序列在發(fā)送過程中不可交錯(cuò)。裂腦情景可能會(huì)影響這種保證,但如前所述,它可以通過紀(jì)元圍欄得到緩解。

Validation

 

SpinalTap驗(yàn)證框架

 

證明SpinalTap在設(shè)計(jì)方面的保證沒有出現(xiàn)事故是不夠的,我們需要一種更實(shí)用的數(shù)據(jù)驅(qū)動(dòng)方法來驗(yàn)證我們的假設(shè)。為了解決這個(gè)問題,我們開發(fā)了一個(gè)連續(xù)的在線端到端驗(yàn)證管道,負(fù)責(zé)驗(yàn)證消費(fèi)者在真實(shí)來源上收到的突變,并斷言在預(yù)生產(chǎn)和生產(chǎn)環(huán)境中都沒有檢測到錯(cuò)誤的行為。

為了實(shí)現(xiàn)可靠的驗(yàn)證工作流,消耗的突變被分區(qū)并存儲(chǔ)在本地磁盤上,同樣的分區(qū)方案應(yīng)用于源事件。一旦接收到對應(yīng)于分區(qū)事件的所有突變,就通過聲明前面描述的保證的測試列表來驗(yàn)證分區(qū)文件與原始源分區(qū)。特別是對于MySQL,binlog文件被認(rèn)為是一個(gè)干凈的分區(qū)邊界。

我們在沙箱環(huán)境中設(shè)置了離線集成測試,以防止將回歸部署到生產(chǎn)環(huán)境中。驗(yàn)證器也通過為每個(gè)源流消費(fèi)實(shí)時(shí)事件在線生產(chǎn)。這有助于檢測未在我們的測試管道中捕獲的任何漏洞,并通過將源狀態(tài)回滾到先前的檢查點(diǎn)來自動(dòng)修復(fù)。這強(qiáng)制了在解決任何問題之前不會(huì)繼續(xù)流式傳輸,并最終保證一致性和數(shù)據(jù)完整性。

模型突變

 

 

左圖:同步與異步應(yīng)用程序工作流程; 右圖:將模型突變傳播給下游消費(fèi)者

消費(fèi)者服務(wù)直接攻擊給定服務(wù)數(shù)據(jù)庫的SpinalTap事件的缺點(diǎn)是數(shù)據(jù)模式泄露,從而產(chǎn)生不必要的耦合。此外,用于處理封裝在擁有服務(wù)中的數(shù)據(jù)突變的域邏輯也需要復(fù)制到消費(fèi)者服務(wù)。

為了緩解這種情況,我們在SpinalTap之上構(gòu)建了一個(gè)模型流媒體庫,它允許服務(wù)從服務(wù)的數(shù)據(jù)存儲(chǔ)中偵聽事件,將它們轉(zhuǎn)換為域模型突變,并在消息總線中重新注入它們。這有效地允許數(shù)據(jù)模型突變成為服務(wù)接口的一部分,并且請求/響應(yīng)周期與異步數(shù)據(jù)攝取和事件傳播的隔離。它還有助于解耦域依賴關(guān)系,促進(jìn)事件驅(qū)動(dòng)的通信,并通過隔離同步和異步應(yīng)用程序工作流來提供服務(wù)的性能和容錯(cuò)改進(jìn)。

使用案例

SpinalTap用于基礎(chǔ)架構(gòu)中的許多用例,其中最突出的是:

高速緩存失效:CDC系統(tǒng)的常見應(yīng)用是高速緩存失效,其中后備數(shù)據(jù)存儲(chǔ)的更改由高速緩存無效器服務(wù)或進(jìn)程檢測,從而驅(qū)逐(或更新)相應(yīng)的高速緩存條目。優(yōu)先采用異步方法允許我們將緩存機(jī)制與請求路徑以及為生產(chǎn)流量提供服務(wù)的應(yīng)用程序代碼分離。這種模式在服務(wù)中廣泛使用,以保持真實(shí)數(shù)據(jù)源存儲(chǔ)和分布式緩存集群(例如Memcached,Redis)之間的一致性。

搜索索引:Airbnb上有多個(gè)搜索產(chǎn)品使用實(shí)時(shí)索引(例如,評論搜索,收件箱搜索,支持票搜索)。SpinalTap被證明非常適合構(gòu)建從數(shù)據(jù)存儲(chǔ)到搜索后端(例如ElasticSearch)的索引管道,特別是它的有序和至少一次傳遞語義。服務(wù)可以輕松地使用相應(yīng)主題的事件并轉(zhuǎn)換突變以更新索引,這有助于確保搜索新鮮度和低延遲。

離線處理:SpinalTap還用于以流方式將在線數(shù)據(jù)存儲(chǔ)導(dǎo)出到離線大數(shù)據(jù)處理系統(tǒng)(例如Hive,Airstream),這需要高吞吐量,低延遲和適當(dāng)?shù)目蓴U(kuò)展性。該系統(tǒng)在歷史上也用于數(shù)據(jù)庫快照管道,連續(xù)構(gòu)建在線數(shù)據(jù)庫的備份并將它們存儲(chǔ)在HBase中。這大大減少了每日備份的時(shí)間,并允許以更精細(xì)的時(shí)間粒度(例如:每小時(shí))拍攝快照。

信令:用于在分布式體系結(jié)構(gòu)中傳播數(shù)據(jù)變化的另一個(gè)經(jīng)常性用例是作為信令機(jī)制,其中依賴服務(wù)可以近實(shí)時(shí)地訂閱并響應(yīng)來自另一服務(wù)的數(shù)據(jù)變化。例如,可用性服務(wù)將通過訂閱預(yù)訂服務(wù)中的更改來阻止列表的日期,以便在預(yù)訂時(shí)收到通知。風(fēng)險(xiǎn),安全,支付,搜索和定價(jià)工作流程是我們的生態(tài)系統(tǒng)中采用此模式的幾個(gè)示例。

結(jié)語

在過去幾年中SpinalTap已成為我們基礎(chǔ)架構(gòu)不可或缺的一部分,并為許多核心工作流程提供了動(dòng)力。如果是尋求可以與您的基礎(chǔ)架構(gòu)輕松集成的可靠通用框架,它很實(shí)用。在Airbnb,SpinalTap用于傳播來自MySQL,DynamoDB和我們內(nèi)部存儲(chǔ)解決方案的數(shù)據(jù)突變。Kafka是首選事件總線,但系統(tǒng)的可擴(kuò)展性也允許我們考慮其他媒介(例如:Kinesis)。

相關(guān)報(bào)道:

https://medium.com/airbnb-engineering/capturing-data-evolution-in-a-service-oriented-architecture-72f7c643ee6f

標(biāo)簽: Mysql 安全 大數(shù)據(jù) 大數(shù)據(jù)處理 代碼 服務(wù)器 漏洞 媒體 數(shù)據(jù)庫 搜索 通信 網(wǎng)絡(luò)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:BAT加持下的大數(shù)據(jù),新行業(yè)驅(qū)動(dòng)器的繁華與蒼涼

下一篇:超級大匯總!200多個(gè)最好的機(jī)器學(xué)習(xí)、NLP和Python教程