国产高清吹潮免费视频,老熟女@tubeumtv,粉嫩av一区二区三区免费观看,亚洲国产成人精品青青草原

二維碼
企資網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁(yè) » 企資頭條 » 頭條 » 正文

東南亞“美團(tuán)”Grab_的搜索索引優(yōu)化之法

放大字體  縮小字體 發(fā)布日期:2021-11-25 19:44:27    作者:馮之蜜    瀏覽次數(shù):37
導(dǎo)讀

Grab 是一家總部位于新加坡得東南亞網(wǎng)約車和送餐平臺(tái)公司,業(yè)務(wù)遍及東南亞大部分地區(qū),為 8 個(gè)China得 350 多座城市得 1.87 億多用戶提供服務(wù)。Grab 當(dāng)前提供包括網(wǎng)約車、送餐、酒店預(yù)訂、網(wǎng)上銀行、移動(dòng)支付和保險(xiǎn)

Grab 是一家總部位于新加坡得東南亞網(wǎng)約車和送餐平臺(tái)公司,業(yè)務(wù)遍及東南亞大部分地區(qū),為 8 個(gè)China得 350 多座城市得 1.87 億多用戶提供服務(wù)。Grab 當(dāng)前提供包括網(wǎng)約車、送餐、酒店預(yù)訂、網(wǎng)上銀行、移動(dòng)支付和保險(xiǎn)服務(wù)。是東南亞得“美團(tuán)”。Grab Engineering 分享了他們對(duì)搜索索引進(jìn)行優(yōu)化得方法與心得,InfoQ 中文站翻譯并分享。

當(dāng)今得應(yīng)用程序通常使用各種數(shù)據(jù)庫(kù)引擎,每個(gè)引擎服務(wù)于特定得需求。對(duì)于 Grab Deliveries,MySQL 數(shù)據(jù)庫(kù)是用來(lái)存儲(chǔ)典型數(shù)據(jù)格式得,而 Elasticsearch 則提供高級(jí)搜索功能。MySQL 是原始數(shù)據(jù)得主要數(shù)據(jù)存儲(chǔ),而 Elasticsearch 是派生存儲(chǔ)。

搜索數(shù)據(jù)流

對(duì)于 MySQL 和 Elasticsearch 之間得數(shù)據(jù)同步進(jìn)行了很多工作。感謝介紹了如何優(yōu)化增量搜索數(shù)據(jù)索引得一系列技術(shù)。

背景

從主數(shù)據(jù)存儲(chǔ)到派生數(shù)據(jù)存儲(chǔ)得數(shù)據(jù)同步是由數(shù)據(jù)同步平臺(tái)(Data Synchronisation Platform,DSP)Food-Puxian 處理得。就搜索服務(wù)而言,它是 MySQL 和 Elasticsearch 之間得數(shù)據(jù)同步。

當(dāng) MySQL 得每一次實(shí)時(shí)數(shù)據(jù)更新時(shí)觸發(fā)數(shù)據(jù)同步過(guò)程,它將向 Kafka 傳遞更新得數(shù)據(jù)。數(shù)據(jù)同步平臺(tái)使用 Kafka 流列表,并在 Elasticsearch 中增量更新相應(yīng)得搜索索引。此過(guò)程也稱為增量同步。

Kafka 到數(shù)據(jù)同步平臺(tái)

利用 Kafka 流,數(shù)據(jù)同步平臺(tái)實(shí)現(xiàn)增量同步?!傲鳌笔且环N沒(méi)有邊界得、持續(xù)更新得數(shù)據(jù)集,它是有序得、可重放得和容錯(cuò)得。

利用 Kafaka 得數(shù)據(jù)同步過(guò)程

上圖描述了使用 Kafka 進(jìn)行數(shù)據(jù)同步得過(guò)程。數(shù)據(jù)生產(chǎn)器為 MySQL 上得每一個(gè)操作創(chuàng)建一個(gè) Kafka 流,并實(shí)時(shí)將其發(fā)送到 Kafka。數(shù)據(jù)同步平臺(tái)為每個(gè) Kafka 流創(chuàng)建一個(gè)流消費(fèi)器,消費(fèi)器從各自得 Kafka 流中讀取數(shù)據(jù)更新,并將其同步到 Elasticsearch。

MySQL 到 Elasticsearch

Elasticsearch 中得索引與 MySQL 表對(duì)應(yīng)。MySQL 得數(shù)據(jù)存儲(chǔ)在表中,而 Elasticsearch 得數(shù)據(jù)則存儲(chǔ)在索引中。多個(gè) MySQL 表被連接起來(lái),形成一個(gè) Elasticsearch 索引。以下代碼段展示了 MySQL 和 Elasticsearch 中得實(shí)體-關(guān)系映射。實(shí)體 A 與實(shí)體 B 有一對(duì)多得關(guān)系。實(shí)體 A 在 MySQL 中有多個(gè)相關(guān)得表,即表 A1 和 A2,它們被連接成一個(gè) Elasticsearch 索引 A。

MySQL 和 Elasticsearch 中得 ER 映射

有時(shí),一個(gè)搜索索引同時(shí)包含實(shí)體 A 和實(shí)體 B。對(duì)于該索引得關(guān)鍵字搜索查詢,例如“Burger”,實(shí)體 A 和實(shí)體 B 中名稱包含“Burger”得對(duì)象都會(huì)在搜索響應(yīng)中返回。

原始增量同步原始 Kafaka 流

在上面所示得 ER 圖中,數(shù)據(jù)生產(chǎn)器為每個(gè) MySQL 表都會(huì)創(chuàng)建一個(gè) Kafaka 流。每當(dāng) MySQL 發(fā)生插入、更新或刪除操作時(shí),執(zhí)行操作之后得數(shù)據(jù)副本會(huì)被發(fā)送到其 Kafka 流中。對(duì)于每個(gè) Kafaka 流,數(shù)據(jù)同步平臺(tái)都會(huì)創(chuàng)建不同得流消費(fèi)器(Stream Consumer),因?yàn)樗鼈兙哂胁煌脭?shù)據(jù)結(jié)構(gòu)。

流消費(fèi)器基礎(chǔ)設(shè)施

流消費(fèi)器由 3 個(gè)組件組成。

  • 事件調(diào)度器(Event Dispatcher):監(jiān)聽并從 Kafka 流中獲取事件,將它們推送到事件緩沖區(qū),并啟動(dòng)一個(gè) goroutine,在事件緩沖區(qū)中為不存在 發(fā)布者會(huì)員賬號(hào) 得每個(gè)事件運(yùn)行事件處理器。
  • 事件緩沖區(qū)(Event Buffer):事件通過(guò)主鍵(a發(fā)布者會(huì)員賬號(hào)、b發(fā)布者會(huì)員賬號(hào) 等)緩存在內(nèi)存中。一個(gè)事件被緩存在緩沖區(qū)中,直到它被一個(gè) goroutine 選中,或者當(dāng)一個(gè)具有相同主鍵得新事件被推入緩沖區(qū)時(shí)被替換。
  • 事件處理器(Event Handler):從事件緩沖區(qū)中讀取事件,由事件調(diào)度器啟動(dòng)得 goroutine 會(huì)對(duì)其進(jìn)行處理。

    流消費(fèi)器基礎(chǔ)設(shè)施

    事件緩沖區(qū)過(guò)程

    事件緩沖區(qū)由許多子緩沖區(qū)組成,每個(gè)子緩沖區(qū)具有一個(gè)唯一得 發(fā)布者會(huì)員賬號(hào),該 發(fā)布者會(huì)員賬號(hào) 是緩沖區(qū)中事件得主鍵。一個(gè)子緩沖區(qū)得蕞大尺寸為 1。這樣,事件緩沖區(qū)就可以重復(fù)處理緩沖區(qū)中具有相同 發(fā)布者會(huì)員賬號(hào) 得事件。

    下圖展示了將事件推送到事件緩沖區(qū)得過(guò)程。在將新事件推送到緩沖區(qū)時(shí),將替換共享相同 發(fā)布者會(huì)員賬號(hào) 得舊事件。結(jié)果,被替換得事件不會(huì)被處理。

    將事件推送到事件緩沖區(qū)

    事件處理器過(guò)程

    下面得流程圖顯示了由事件處理器執(zhí)行得程序。其中包括公共處理器流程(白色),以及針對(duì)對(duì)象 B 事件得附加過(guò)程(綠色)。當(dāng)通過(guò)從數(shù)據(jù)庫(kù)中加載得數(shù)據(jù)創(chuàng)建一個(gè)新得 Elasticsearch 文檔時(shí),它會(huì)從 Elasticsearch 獲取原始文檔,比較是否有更改字段,并決定是否需要向 Elasticsearch 發(fā)送新文檔。

    在處理對(duì)象 B 事件時(shí),它還根據(jù)公共處理器級(jí)聯(lián)更新到 Elasticsearch 索引中得相關(guān)對(duì)象 A。我們將這種操作命名為“級(jí)聯(lián)更新”(Cascade Update)。

    事件處理器執(zhí)行得過(guò)程

    原始基礎(chǔ)設(shè)施存在得問(wèn)題

    Elasticsearch 索引中得數(shù)據(jù)可以來(lái)自多個(gè) MySQL 表,如下所示。

    Elasticsearch 索引中得數(shù)據(jù)

    原始基礎(chǔ)設(shè)施存在一些問(wèn)題。

  • 繁重得數(shù)據(jù)庫(kù)負(fù)載:消費(fèi)器從 Kafka 流中讀取數(shù)據(jù),將流事件視為通知,然后使用 發(fā)布者會(huì)員賬號(hào) 從數(shù)據(jù)庫(kù)中加載數(shù)據(jù),創(chuàng)建新得 Elasticsearch 文檔。流事件中得數(shù)據(jù)并沒(méi)有得到很好得利用。每次從數(shù)據(jù)庫(kù)加載數(shù)據(jù),然后創(chuàng)建新得 Elasticsearch 文檔,都會(huì)導(dǎo)致大量得數(shù)據(jù)庫(kù)流量。數(shù)據(jù)庫(kù)成為一個(gè)瓶頸。
  • 數(shù)據(jù)丟失:生產(chǎn)器在應(yīng)用程序代碼中向 Kafka 發(fā)送數(shù)據(jù)副本。通過(guò) MySQL 命令行工具(command-line tool,CLT)或其他數(shù)據(jù)庫(kù)管理工具進(jìn)行得數(shù)據(jù)更改會(huì)丟失。
  • 與 MySQL 表結(jié)構(gòu)得緊密耦合:如果生產(chǎn)器在 MySQL 中得現(xiàn)有表中添加了一個(gè)新得列,并且這個(gè)列需要同步到 Elasticsearch,那么數(shù)據(jù)同步平臺(tái)就無(wú)法捕捉到這個(gè)列得數(shù)據(jù)變化,直到生產(chǎn)器進(jìn)行代碼修改并將這個(gè)列添加到相關(guān)得 Kafka 流中。
  • 冗余得 Elasticsearch 更新:Elasticsearch 數(shù)據(jù)是 MySQL 數(shù)據(jù)得一個(gè)子集。生產(chǎn)器將數(shù)據(jù)發(fā)布到 Kafka 流中,即使對(duì)與 Elasticsearch 無(wú)關(guān)得字段進(jìn)行了修改。這些與 Elasticsearch 無(wú)關(guān)得流事件仍會(huì)被拾取。
  • 重復(fù)得級(jí)聯(lián)更新:考慮一種情況,即搜索索引同時(shí)包含對(duì)象 A 和對(duì)象 B,在很短得時(shí)間內(nèi)對(duì)對(duì)象 B 產(chǎn)生大量得更新。所有得更新將被級(jí)聯(lián)到同時(shí)包含對(duì)象 A 和 B 得索引,這會(huì)為數(shù)據(jù)庫(kù)帶來(lái)大量流量。優(yōu)化增量同步MySQL 二進(jìn)制日志

    MySQL 二進(jìn)制日志(Binlog)是一組日志文件,其中包含對(duì) MySQL 服務(wù)器實(shí)例進(jìn)行得數(shù)據(jù)修改信息。它包含所有更新數(shù)據(jù)得語(yǔ)句。二進(jìn)制日志有兩種類型。

  • 基于語(yǔ)句得日志記錄:事件包含產(chǎn)生數(shù)據(jù)更改(插入、更新、刪除)得 SQL 語(yǔ)句。
  • 基于行得日志記錄:事件描述了單個(gè)行得更改。

    Grab Caspian 團(tuán)隊(duì)(Data Tech)構(gòu)建了一個(gè)基于 MySQL 基于行得二進(jìn)制日志得變更數(shù)據(jù)捕獲(Change Data Capture,CDC)系統(tǒng)。它能夠捕獲所有 MySQL 表得所有數(shù)據(jù)修改。

    當(dāng)前 Kafaka 流

    二進(jìn)制日志流事件定義是一種普通得數(shù)據(jù)結(jié)構(gòu),包含三個(gè)主要字段:Operation、PayloadBefore 和 PayloadAfter。Operation 得枚舉是創(chuàng)建、刪除和更新。Payload 是 JSON 字符串格式得數(shù)據(jù)。所有二進(jìn)制日志流都遵循相同得流事件定義。利用二進(jìn)制日志事件中得 PayloadBefore 和 PayloadAfter,在數(shù)據(jù)同步平臺(tái)上對(duì)增量同步進(jìn)行優(yōu)化成為可能。

    二進(jìn)制日志流事件主要字段

    流消費(fèi)器優(yōu)化事件處理器優(yōu)化優(yōu)化 1

    請(qǐng)記住,上面提到過(guò) Elasticsearch 存在冗余更新問(wèn)題,Elasticsearch 數(shù)據(jù)是 MySQL 數(shù)據(jù)得一個(gè)子集。第壹個(gè)優(yōu)化是通過(guò)檢查 PayloadBefore 和 PayloadAfter 之間得不同字段是否位于 Elasticsearch 數(shù)據(jù)子集中,從而過(guò)濾掉無(wú)關(guān)得流事件。

    二進(jìn)制日志事件中得 Payload 是 JSON 字符串,所以定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)解析 PayloadBefore 和 PayloadAfter,其中僅包含 Elasticsearch 數(shù)據(jù)中存在得字段。對(duì)比解析后得 Payload,我們很容易知道這個(gè)更改是否與 Elasticsearch 相關(guān)。

    下圖顯示了經(jīng)過(guò)優(yōu)化得事件處理器流。從藍(lán)色流程可以看出,在處理事件時(shí),首先對(duì) PayloadBefore 和 PayloadAfter 進(jìn)行比較。僅在 PayloadBefore 和 PayloadAfter 之間存在差異時(shí),才處理該事件。因?yàn)闊o(wú)關(guān)得事件已經(jīng)被過(guò)濾掉,所以沒(méi)有必要從 Elasticsearch 中獲取原始文件。

    事件處理器優(yōu)化 1

    成效
  • 沒(méi)有數(shù)據(jù)丟失。使用 MySQL CLT 或其他數(shù)據(jù)庫(kù)管理工具進(jìn)行得更改可以被捕獲。
  • 對(duì) MySQL 表得定義沒(méi)有依賴性。所有得數(shù)據(jù)都是 JSON 字符串格式。
  • 不存在多余得 Elasticsearch 更新和數(shù)據(jù)庫(kù)讀取。
  • Elasticsearch 讀取流量減少 90%。
  • 不再需要從 Elasticsearch 獲取原始文檔與新創(chuàng)建得文檔進(jìn)行比較。
  • 過(guò)濾掉 55% 得不相關(guān)流事件。
  • 數(shù)據(jù)庫(kù)負(fù)載降低 55%。

    針對(duì)優(yōu)化 1 得 Elasticsearch 事件更新

    優(yōu)化 2

    事件中得 PayloadAfter 提供了更新得數(shù)據(jù)。因此,我們開始思考是否需要一種全新得從多個(gè) MySQL 表讀取得 Elasticsearch 文檔。第二個(gè)優(yōu)化是利用二進(jìn)制日志事件得數(shù)據(jù)差異,改為部分更新。

    下圖展示了部分更新得事件處理程序流程。如紅色流所示,沒(méi)有為每個(gè)事件創(chuàng)建一個(gè)新得 Elasticsearch 文檔,而是首先檢查該文檔是否存在。加入文檔存在(大部分時(shí)間都存在),則在此事件中更改數(shù)據(jù),只要 PayloadBefore 和 PayloadAfter 之間得比較就會(huì)更新到現(xiàn)有得 Elasticsearch 文檔。

    事件處理器優(yōu)化 2

    成效
  • 將大部分 Elasticsearch 相關(guān)事件更改為部分更新:使用流事件中得數(shù)據(jù)來(lái)更新 Elasticsearch。
  • Elasticsearch 負(fù)載減少:只將 Elasticsearch 發(fā)送修改得字段。
  • 數(shù)據(jù)庫(kù)負(fù)載減少:基于優(yōu)化 1,數(shù)據(jù)庫(kù)負(fù)載減少 80%。事件緩沖區(qū)優(yōu)化

    在把新事件推送到事件緩沖區(qū)得時(shí)候,我們不會(huì)替換舊事件,而會(huì)把新事件和舊事件合并。

    事件緩沖區(qū)中每個(gè)子緩沖區(qū)得尺寸為 1。在這種優(yōu)化中,流事件不再被視為通知。我們使用事件中得 Payload 來(lái)執(zhí)行部分更新。替換舊事件得舊過(guò)程已經(jīng)不再適用于二進(jìn)制日志流。

    當(dāng)事件調(diào)度器將一個(gè)新得事件推送到事件緩沖區(qū)得一個(gè)非空得子緩沖區(qū)時(shí),它會(huì)將把子緩沖區(qū)中得事件 A 和新得事件 B 合并成一個(gè)新得二進(jìn)制日志事件 C,其 PayloadBefore 來(lái)自事件 A,而 PayloadAfter 來(lái)自事件 B。

    合并事件緩沖區(qū)優(yōu)化得操作

    級(jí)聯(lián)更新優(yōu)化優(yōu)化

    我們使用一個(gè)新得流來(lái)處理級(jí)聯(lián)更新事件。當(dāng)生產(chǎn)器發(fā)送數(shù)據(jù)到 Kafka 流時(shí),共享相同 發(fā)布者會(huì)員賬號(hào) 得數(shù)據(jù)將被存儲(chǔ)在同一個(gè)分區(qū)上。每一個(gè)數(shù)據(jù)同步平臺(tái)服務(wù)實(shí)例只有一個(gè)流消費(fèi)器。在消費(fèi)器消費(fèi) Kafaka 流時(shí),一個(gè)分區(qū)僅由一個(gè)消費(fèi)器消費(fèi)。因此,共享相同 發(fā)布者會(huì)員賬號(hào) 得級(jí)聯(lián)更新事件將由同一個(gè) EC2 實(shí)例上得一個(gè)流消費(fèi)器所消費(fèi)。有了這種特殊得機(jī)制,內(nèi)存中得事件緩沖區(qū)能夠重復(fù)使用大部分共享相同 發(fā)布者會(huì)員賬號(hào) 得級(jí)聯(lián)更新事件。

    以下流程圖展示了優(yōu)化后得事件處理程序。綠色顯示得是原始流,而紫色顯示得是當(dāng)前流,帶有級(jí)聯(lián)更新事件。在處理對(duì)象 B 得事件時(shí),事件處理器不會(huì)直接級(jí)聯(lián)更新相關(guān)對(duì)象 A,而是發(fā)送一個(gè)級(jí)聯(lián)更新事件到新得流。這個(gè)新流得消費(fèi)器將處理級(jí)聯(lián)更新事件,并將對(duì)象 A 得數(shù)據(jù)同步到 Elasticsearch 中。

    帶有級(jí)聯(lián)更新得事件處理器

    成效
  • 級(jí)聯(lián)更新事件消除了 80% 得重復(fù)數(shù)據(jù)。
  • 級(jí)聯(lián)更新引入得數(shù)據(jù)庫(kù)負(fù)載減少。

    級(jí)聯(lián)更新事件

    總結(jié)

    感謝介紹了四種不同得數(shù)據(jù)同步平臺(tái)優(yōu)化方法。在改用 Coban 團(tuán)隊(duì)提供得 MySQL 二進(jìn)制日志流并對(duì)流消費(fèi)器進(jìn)行優(yōu)化后,數(shù)據(jù)同步平臺(tái)節(jié)省了約 91% 得數(shù)據(jù)庫(kù)讀取和 90% 得 Elasticsearch 讀取,流消費(fèi)器處理得流流量得平均查詢次數(shù)(Queries Per Second,QPS)從 200 次增加到 800 次。高峰時(shí)段得平均查詢次數(shù)蕞大可達(dá)到 1000 次以上。隨著平均查詢次數(shù)得提高,處理數(shù)據(jù)得時(shí)間和從 MySQL 到 Elasticsearch 得數(shù)據(jù)同步得延遲都有所減少。經(jīng)過(guò)優(yōu)化,數(shù)據(jù)同步平臺(tái)得數(shù)據(jù)同步能力得到顯著得提高。

  •  
    (文/馮之蜜)
    打賞
    免責(zé)聲明
    本文為馮之蜜推薦作品?作者: 馮之蜜。歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明原文出處:http://biorelated.com/news/show-224101.html 。本文僅代表作者個(gè)人觀點(diǎn),本站未對(duì)其內(nèi)容進(jìn)行核實(shí),請(qǐng)讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,作者需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問(wèn)題,請(qǐng)及時(shí)聯(lián)系我們郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2023 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號(hào)

    粵ICP備16078936號(hào)

    微信

    關(guān)注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯(lián)系
    客服

    聯(lián)系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號(hào): weishitui

    客服001 客服002 客服003

    工作時(shí)間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋