圖書館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是否配置正确,如果仍然無法解決,提工單聯系資料內建。
填好後的頁面類似下面這樣:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxAHZj9CX0czMxMDO0ITO4ATNx8CXop3XuN2LcdzM5AjNvw1YpB3LcNHdlN3ch9CXt92YuMmbp1ib1lXasFmLzN3buU3bop3ZuFGat42Yu4Wd5lGbh1ycj9GZvw1LcpDc0RHaiojIsJye.png)
單擊确定,資料源建立成功,此時在資料源頁面會出現一個新的資料源資訊;
單擊 腳本模式 ,彈出一個 導入模闆 配置。
在導入模闆配置裡面:
來源類型:OTS Stream
目标類型:Elasticsearch
單擊确認,則進入配置界面。
在配置界面,已經提前嵌入了OTSStreamReader和ElasticsearchWriter的模闆,每一項配置後面都做了解釋。
點選上部的 儲存 按鈕,則彈出一個對話框,輸入任務名稱後按确定即可。
由于目前資料內建還沒辦法自動通路VPC環境内的Elasticsearch,是以暫時需要使用者自己購買VPC内的ECS機器作為排程資源。
購買一台ECS,新購ECS所在的VPC需要和Elasticsearch的VPC是同一個。
在彈出的對話框中輸入:資源名稱,選擇:歸屬項目。
然後點選 确定 ,會提示 添加排程資源成功 。
點選 管理伺服器 ,會彈出一個新的彈出框。
點選 增加伺服器 ,會彈出一個新的彈出框。
選擇 專有網絡 。
輸入剛剛購買的ECS的:ECS UUID。登陸ECS,以root身份執行指令 <code>bash dmidecode | grep UUID</code>即可擷取到UUID。
輸入剛剛購買的ECS的内網:機器IP。
單擊 添加 。
如果是添加機器,需要初始化伺服器,點選 排程資源清單 頁面相應資源名稱後面的 伺服器初始化 ,會彈出初始化步驟,按這個步驟執行。
執行完成後,再點選 排程資源清單 頁面相應資源名稱後面的 伺服器管理 ,點選 重新整理 ,當 服務狀态 變為 正常 時,表示排程資源配置成功。
可以先通過運作任務來測試配置是否正确和符合預期。
回到任務配置頁面 資料內建 > 離線同步 > 同步任務 > 資料同步 。
輕按兩下剛剛建立的任務:tablestore2es,點選配置内容上部的 運作 。
這時候會彈出一個參數設定框,設定之前配置的變量:
填完值後,點選 确認後,任務會立即開始運作。
運作結束後,如果沒有報錯,則執行成功,在日志裡面會列印同步的資料行數。
最後可以到Elasticsearch中查詢索引成功的文檔數。具體方法見後面的 <9. 驗證結果> 。
輕按兩下剛剛建立的任務:tablestore2es,點選配置内容上部的 送出 。
配置排程參數:
排程類型:周期排程
自動重跑:√
生效日期:預設值
排程周期:分鐘
起始時間:預設值
時間間隔:5分鐘
start_time:$[yyyymmddhh24miss-10/24/60],表示排程時間-10分鐘。
end_time:$[yyyymmddhh24miss-5/24/60],表示排程時間-5分鐘。
跨周期依賴:可以選擇:自依賴,等待上一排程結束,才能接續運作。
送出任務後,原有任務處于:直讀狀态。
切換到 運維中心 > 任務清單 > 周期任務 ,可以看到剛剛建立的周期任務:
選中剛剛建立的周期任務:tablestore2es。點選下部的 修改資源組 ,會彈出一個選擇框,選擇剛剛建立的資源組名稱:
點選 确認 ,即可綁定成功。
周期任務是從下一天的00:00點開始執行。
等執行完一個任務後,可以在ECS上通過下述指令檢視Elasticsearch中的資料量:
結果類似下面:
至此,TableStore資料通過資料內建同步到Elasticsearch的配置完成了,延遲在5分鐘到10分鐘之間。
雖然目前可以運作了,但是仍然存在一些問題。
需要 設定排程資源 ,比較麻煩。預計十二月中旬的時候這一步可以自動處理,不再需要配置。使用會更加簡單。
延遲在 5~10 分鐘,對于部分系統而言,可能延遲比較大,預計十二月底的時候可以減少到秒級。時效性會更高。
在使用中有任何問題,可以加入表格存儲釘釘技術交流群:11789671