天天看點

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

圖書館Q是一家大型圖書館,圖書館藏書衆多,紙質圖書600多萬冊,電子圖書7000多萬冊,總數有八千多萬冊,這些圖書之前都是人工檢索維護的,現在需要做一個系統來存儲管理這些圖書資訊。

需求如下:

圖書總量目前八千多萬冊,考慮到未來二十年的增長,需要系統能支援一億的存儲量。

圖書資訊很重要,不能接受丢失發生。

圖書的名字和作者名字需要支援模糊搜尋。

每本書的屬性最多有一百多個,且不固定,不同類型的圖書的屬性列差異較大。且未來可能會新增屬性列。

根據上面這些需求特點,要完成這個管理系統,需要兩類系統支援:

分布式NoSQL資料庫:解決兩億存儲量的問題,解決屬性列較多且不固定的問題,解決可靠性要求高的問題。

搜尋系統:解決固定列模糊搜尋的需求。

如果使用阿裡雲産品,那麼對應的産品就是:

Table Store:分布式NoSQL資料庫。

Elasticsearch:搜尋系統,支援模糊搜尋。

在管理系統中使用上述兩個系統的時候,目前需要雙寫,當新增一本書的時候,需要将詳細書本資訊寫入Table Store,将書本ID和作者,書名寫入Elasticsearch,并且對書名,作者建索引。查詢的時候,如果是根據書本ID,則直接查詢Table Store。如果是根據書名模糊查詢,則先查Elasticsearch,擷取到比對的書本的ID後,再到Table Store中查詢詳細資訊。

如果Table Store到Elasticsearch有自動同步通道,那麼隻需要将新書資訊寫入Table Store即可,不再需要寫Elasticsearch。減少了一次寫入操作,且不用再考慮資料一緻性問題,系統架構大大簡化。那麼如何才能實作這個自動同步通道呢?

類似于上面的場景,有很多系統都有這樣的需求:擁有PB級海量資料需要持久化存儲,同時有一兩個字段需要做模糊查詢,比如姓名,手機号碼等,目前很多解決方案需要雙寫分布式資料庫和Elasticsearch,但這樣不僅會帶來開發、運維複雜度,而且還有資料不一緻的問題。

針對上述問題,Table Store團隊聯合資料內建(CDP)和Elasticsearch團隊上線了近實時的資料同步方案,使用者隻需要将資料寫入Table Store,Table Store會負責将資料在10分鐘内自動發送給Elasticsearch建索引。

Table Store:阿裡雲分布式NoSQL資料庫,專注于海量資料的存儲服務,目前單表可支援10PB級,10萬億行以上的資料量,且資料量增大後性能仍然保持穩定。Table Store Stream功能是一種增量實時通道服務,類似于MySQL的binlog,可以通過Stream接口實時讀取到最新的變化資料(Put/Update/Delete)。

資料內建 :阿裡雲資料管理平台,支援資料同步等衆多資料功能。

Elasticsearch :阿裡雲Elasticsearch是剛推出的一項新服務,提供基于開源Elasticsearch及商業版X-Pack插件,緻力于資料分析、資料搜尋等場景服務。在開源Elasticsearch基礎上提供企業級權限管控、安全監控告警、自動報表生成等功能。

三種産品在新解決方案中的角色如下:

産品

Table Store

資料內建

Elasticsearch

角色

資料存儲

資料同步通道

查詢增強

由于Table Store和Elasticsearch不是完全對等的産品,是以如果需要将資料導入Elasticsearch,那麼在使用Table Store的時候有一些注意的地方:

Table Store主鍵列個數:

目前Table Store最大支援4個主鍵列,而Elasticsearch隻支援一個,是以Table Store的表設計時隻能使用一個主鍵列,如果之前有多個主鍵列,可以将多個主鍵列的值轉換成String,然後拼接成一個主鍵列。

Table Store資料變化類型:

僅支援PUT(新增),UPDATE(更新)兩種操作。

不支援DELETE操作。

Table Store多版本:

僅支援單版本,不支援多版本

Elasticsearch:

版本:支援阿裡雲和開源的5..版本。

延時:

目前使用的是周期排程,每隔5分鐘排程一次,再加上插件中有5分鐘延遲,同步總延遲在5~10分鐘。

Table Store:

點選開通。

建立執行個體和表,表需要開通Stream,有效時間可以選擇24小時。

Table Store支援按預留CU和按量付費兩種收費模式,如果建立表時指定讀寫CU都為0則表示為按量付費,後期如果沒有使用則不收費。且目前每月有10GB,1000萬CU的免費額度。

Table Store中表需要開通Stream功能。

然後建立項目即可。

注意:子賬号不能建立項目,隻能被主賬号授權。

點選立即購買,購買時的VPC必須和之前購買的ECS在同一個VPC環境内部。

根據資料量預估,購買相應的執行個體大小。

目前收費是按執行個體規格收費。

Table Store:PutRow/BatchWriteRow接口寫入資料

Elasticsearch:無須寫入

Elasticsearch:搜尋到請求結果後,拿到每個doc的_id字段值。

Table Store:Elasticsearch中的_id字段就是Table Store中的主鍵值,擷取到一系列_id值後,使用Table Store的BatchGetRow可以查詢到完整資料。

整個同步流程應該包括下面兩個步驟:

導出Table Store的全量資料到Elasticsearch,并且記錄開始時間T1。

等全量導出結束後,再開始同步增量資料,增量資料開始同步的時間是T1。

對于全量導出,需要使用otsreader插件,配置中的Range使用INF_MIN到INF_MAX,也就是導出所有資料。

對于增量同步,需要配置起始時間和結束時間為一個變量,在排程周期配置的時候配置起始時間必須小于等于T1,否則可能會有資料丢失發生。

我們下面會以增量同步為例來介紹如何配置增量同步任務。

無須配置

如果已經建立了Table Store的資料源,則可以跳過這一步。

如果不希望建立資料源,也可以在配置頁面配置相應的endpoint,instanceName,AccessKeyID和AccessKeySecret。如果希望建立,則按照下面步驟操作。

單擊左側 離線同步 > 資料源。

在資料源配置頁面,選擇右上角 新增資料源 ,會有一個彈出框。

按照說明填寫:

資料源名稱:填寫一個資料源辨別符,比如車聯網。

資料源描述:填入描述符,比如:車聯網GPS資料存儲。

資料源類型:選擇 ots ,ots是Table Store曾用名。

OTS Endpoint:填入TableStore 執行個體頁面的執行個體位址,如果Table Store的執行個體和目标産品(比如Elasticsearch)在同一個region,則可以填入私網位址,否則需要填入公網位址,不能填入VPC位址。

OTS 執行個體ID:填入Table Store的執行個體名稱。

Access Id:填入阿裡雲網站的AccessKeyID。

Access Key:填入阿裡雲網站AccessKeyID對應的AccessKeySecret。

點選 測試連通性 ,如果成功則會在右上角提示:測試連接配接成功。 如果失敗,點選endpoint是否配置正确,如果仍然無法解決,提工單聯系資料內建。

填好後的頁面類似下面這樣:

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

單擊确定,資料源建立成功,此時在資料源頁面會出現一個新的資料源資訊;

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐
TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

單擊 腳本模式 ,彈出一個 導入模闆 配置。

在導入模闆配置裡面:

來源類型:OTS Stream

目标類型:Elasticsearch

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

單擊确認,則進入配置界面。

在配置界面,已經提前嵌入了OTSStreamReader和ElasticsearchWriter的模闆,每一項配置後面都做了解釋。

點選上部的 儲存 按鈕,則彈出一個對話框,輸入任務名稱後按确定即可。

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

由于目前資料內建還沒辦法自動通路VPC環境内的Elasticsearch,是以暫時需要使用者自己購買VPC内的ECS機器作為排程資源。

購買一台ECS,新購ECS所在的VPC需要和Elasticsearch的VPC是同一個。

在彈出的對話框中輸入:資源名稱,選擇:歸屬項目。

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

然後點選 确定 ,會提示 添加排程資源成功 。

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

點選 管理伺服器 ,會彈出一個新的彈出框。

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

點選 增加伺服器 ,會彈出一個新的彈出框。

選擇 專有網絡 。

輸入剛剛購買的ECS的:ECS UUID。登陸ECS,以root身份執行指令 <code>bash dmidecode | grep UUID</code>即可擷取到UUID。

輸入剛剛購買的ECS的内網:機器IP。

單擊 添加 。

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

如果是添加機器,需要初始化伺服器,點選 排程資源清單 頁面相應資源名稱後面的 伺服器初始化 ,會彈出初始化步驟,按這個步驟執行。

執行完成後,再點選 排程資源清單 頁面相應資源名稱後面的 伺服器管理 ,點選 重新整理 ,當 服務狀态 變為 正常 時,表示排程資源配置成功。

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

可以先通過運作任務來測試配置是否正确和符合預期。

回到任務配置頁面 資料內建 &gt; 離線同步 &gt; 同步任務 &gt; 資料同步 。

輕按兩下剛剛建立的任務:tablestore2es,點選配置内容上部的 運作 。

這時候會彈出一個參數設定框,設定之前配置的變量:

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

填完值後,點選 确認後,任務會立即開始運作。

運作結束後,如果沒有報錯,則執行成功,在日志裡面會列印同步的資料行數。

最後可以到Elasticsearch中查詢索引成功的文檔數。具體方法見後面的 &lt;9. 驗證結果&gt; 。

輕按兩下剛剛建立的任務:tablestore2es,點選配置内容上部的 送出 。

配置排程參數:

排程類型:周期排程

自動重跑:√

生效日期:預設值

排程周期:分鐘

起始時間:預設值

時間間隔:5分鐘

start_time:$[yyyymmddhh24miss-10/24/60],表示排程時間-10分鐘。

end_time:$[yyyymmddhh24miss-5/24/60],表示排程時間-5分鐘。

跨周期依賴:可以選擇:自依賴,等待上一排程結束,才能接續運作。

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

送出任務後,原有任務處于:直讀狀态。

切換到 運維中心 &gt; 任務清單 &gt; 周期任務 ,可以看到剛剛建立的周期任務:

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

選中剛剛建立的周期任務:tablestore2es。點選下部的 修改資源組 ,會彈出一個選擇框,選擇剛剛建立的資源組名稱:

TableStore+ Elasticsearch:海量圖書資訊全文檢索系統實踐

點選 确認 ,即可綁定成功。

周期任務是從下一天的00:00點開始執行。

等執行完一個任務後,可以在ECS上通過下述指令檢視Elasticsearch中的資料量:

結果類似下面:

至此,TableStore資料通過資料內建同步到Elasticsearch的配置完成了,延遲在5分鐘到10分鐘之間。

雖然目前可以運作了,但是仍然存在一些問題。

需要 設定排程資源 ,比較麻煩。預計十二月中旬的時候這一步可以自動處理,不再需要配置。使用會更加簡單。

延遲在 5~10 分鐘,對于部分系統而言,可能延遲比較大,預計十二月底的時候可以減少到秒級。時效性會更高。

在使用中有任何問題,可以加入表格存儲釘釘技術交流群:11789671