Day 4 - PB级规模数据的Elasticsearch分库分表实践
Day 4 - PB級規模數據的Elasticsearch分庫分表實踐
?
從2018年7月在開始在某阿里云數據中心部署Elasticsearch軟件,到2018年12月共創建了15個集群,服務于客戶的文檔檢索、交通視頻檢索、地理信息檢索、日志安全審計等業務。其中數據規模最大的一個業務,共有800張表,7萬億條數據,每天新增500億條記錄,數據要求存儲半年,單條記錄大小1KB左右,存儲規模約10PB,需要支持1000并發查詢。
一、數據存儲空間規劃。
數據中心能用于搭建Elasticsearch集群的SSD盤共700TB,SATA盤共50PB。根據業務類型、時間范圍劃分熱數據和冷數據,一部分重要數據存儲在SSD盤的熱數據集群,其它數據存儲在SATA盤的冷數據集群。熱數據集群主要存儲各類實體信息,包括人員、物品、事件、地址、組織數據,以及最新軌跡數據。冷數據集群主要存儲歷史軌跡信息。熱數據和冷數據按照業務拆分多個小集群,每個集群規模保持在50個節點左右,單個集群最大不超過200個節點。利用阿里云平臺彈性伸縮的能力,每個Elasticsearch集群可以先從小規模創建,根據資源使用情況來彈性擴展節點規模。
Elasticsearch集群節點配置
?
二、索引設計。
1.索引別名(alias)。每類數據根據數據源表名建立索引(index),索引中只包含一個類型(type)。配置索引別名(alias),業務上根據別名寫入、查詢數據,索引重建等數據維護操作可以通過別名切換對業務透明。
2.按時間分表。軌跡類數據按時間(日/月)拆分,每個索引存儲數據量保持在1TB(10億)左右,索引名帶上日期/月份后綴,拆分后的索引配置別名區分冷熱數據。配置索引模板,指定索引分片數和副本數、字段類型、分詞器。配置Linux crontab定時任務,通過shell腳本創建索引。
3.分片(shard)設置。索引按照單個分片10-40GB數據大小設計分片數,數據量少于10GB(1000萬)的索引設置1個分片即可,數據量大于1TB(10億)的索引設置分片數為集群節點數整數倍(例如50個節點的集群配置50個分片)。
4.副本(replica)設置。數據首次批量導入時索引副本數設置為0,快速寫入數據。生產環境索引副本數設置為1,避免集群節點故障數據丟失。
三、索引mapping設計。
1.精心設計索引字段類型。在開發環境配置Elasticsearch允許自動創建索引,從數據源每張表取1000條記錄批量寫入Elasticsearch,自動創建索引mapping,然后再根據業務需要修改mapping配置合適的字段類型,指定字段索引分詞器、是否存儲、是否索引、是否合并至全文檢索字段。 對于數據量大的表尤其要精心設計字段類型,盡量減少索引存儲空間占用。在生產環境中建議配置不允許自動創建索引。
2.配置全文檢索字段。如果業務需要全文檢索,可以配置開啟全文字段,同時需要占用更多存儲空間;如果業務上只是按字段查詢,可以配置禁用全文字段,減少存儲空間。Elasticsearch5.X及之前的版本默認啟用_all字段,合并所有字段的值。Elasticsearch6.X及之后的版本默認禁用_all字段,可以通過copy_to將多個字段值合并成一個全文字段。對于數據查全率要求高的業務場景,建議對全文字段配置cjk分詞器(Elasticsearch和Lucene中自帶,對中日韓文進行二元分詞的分詞器)。
3.通用字段統一命名。各個索引中的姓名、證件號碼、時間(開始時間、結束時間)、地點(始發地、目的地)等常用字段統一命名。用戶指定證件號、時間范圍等精確字段查詢條件時,可以使用統一的查詢條件并行查詢多個索引。
四、分詞設置。
1.選擇合適的分詞器。Elasticsearch中內置了很多分詞器:standard、cjk、nGram等,也可以安裝ik、pinyin等開源分詞器, 可以根據業務場景選擇合適的分詞器。 常用分詞器: standard:Elasticsearch默認分詞,英文按空格切分,中文按單個漢字切分。 cjk:根據二元索引(兩個相鄰的字作為一個詞條)對中日韓文分詞,可以保證查全率。 NGram:可以將英文按照字母切分,結合Elasticsearch的短語搜索(match_phrase)使用。 ik:比較熱門的中文分詞,能按照中文語義切分,可以自定義詞典。 pinyin:可以讓用戶輸入拼音,就能查找到相關的關鍵詞。 對于查全率要求較高的場景,建議使用cjk分詞,同時能支持比較快的響應速度。對于查準率要求較高的場景,建議使用ik分詞。
CJK分詞和IK分詞對比(測試環境:Elasticsearch5.5.3,8335萬條人員檔案信息,10節點集群,單節點16核CPU、64G內存、2T SSD盤,1個線程批量寫入,1個并發查詢)
?
測試分詞效果: curl -XPOST "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d' { "analyzer": "ik_max_word", "text": "南京市長江大橋" }'
2.NGram分詞。對于像車牌號之類數字和字母連在一起的字符,默認會被切成一個完整詞條,但是業務上又需要支持前綴、后綴模糊匹配,可以根據業務需求進行分詞。車牌號建議增加一個分詞字段,配置NGram分詞器,切分1元至7元的組合。身份證號碼建議增加分詞字段,根據業務需要切分18位完整詞條、前2位(省)、前4位(省市)、前6位(省市區縣)、后4位、出生年月日、出生年份、出生年月、出生月日等組合。
3.單字分詞。對于像姓名類字段,業務上需要支持完整匹配,又需要支持單字查詢。可以配置1個keyword字段(不分詞);1個text字段(分詞),分詞器選擇Elasticsearch默認分詞器standard,按單個漢字切分。
五、數據寫入策略。
1.批量離線數據導入。各類業務數據源主要在數據倉庫MaxCompute(原ODPS),為了把表數據從MaxCompute表導入到ElasticSearch集群中, 我們基于MaxCompute MapReduce開發了MaxCompute到ElasticSearch的數據導出作業,通過簡單的配置就可以把數據導入到ElasticSearch中。 數據源在關系數據庫RDS或者NoSQL的數據,可以通過配置DataWorks(dataX企業版)導入Elasticsearch集群。
2.實時數據導入。實時數據源主要是流式數據服務DataHub, 配置DataHub任務即可同步至Elasticsearch集群。也可以自己開發程序調用DataHub的SDK獲取實時數據,經過業務處理后,調用ES Rest Client SDK批量寫入Elasticsearch。
3.冷熱數據自動遷移。軌跡類實時數據默認先寫入熱數據集群(SSD盤Elasticsearch集群),對于熱數據集群過期的索引(例如1個月前的索引)需要遷移到冷數據集群(SATA盤Elasticsearch)。為了實現數據跨集群遷移,我們開發了snapshot插件將索引備份到對象存儲服務OSS或分布式文件系統盤古。配置定時任務,將熱數據集群索引備份后,從冷數據集群恢復,然后再刪除熱集群中的過期索引,保持熱數據集群只存儲較小規模數據。冷數據集群的索引如果超過半年,則關閉索引,減少JVM堆內存占用。
4.配置索引主鍵字段。為了保證Elasticsearch集群和數據源記錄的一致性,建議所有索引配置主鍵字段,而不是讓Elasticsearch自動生成主鍵。配置數據業務主鍵字段作為Elasticsearch主鍵字段。如果沒有主鍵字段,則將原始數據能確定記錄惟一性的幾個字段合并為主鍵,或者將所有字段值合并起來計算MD5值作為主鍵。
5.配置寫入路由。如果業務上需要經常根據某個字段查詢,例如用戶ID、車牌號等的字段,寫入時可以指定路由字段。
6.寫入參數調優。調整數據寫入任務參數,避免寫入操作占用過多磁盤IO和CPU。使用批量請求,配置合理的寫入線程數,調大索引刷新時間間隔refresh interval,調整事務日志translog同步策略。
六、數據查詢策略。
1.冷熱庫異步查詢。用戶輸入關鍵詞查詢時,優先從熱數據集群查詢,有結果立即返回,并估算命中記錄條數。熱數據集群命中結果集不足時,再查詢冷數據集群。
2.跨集群搜索。業務上需要多個Elasticsearch集群一起參與檢索時,可以通過Cross Cluster Search同時對多個集群發起檢索請求合并檢索結果。單獨創建一個5節點的Cross Cluster,設置遠程集群節點信息,用于跨集群搜索,不存儲業務數據。
3.快速返回和超時設置。查詢請求中設置參數teminate_after指定每個分片(shard)最多匹配N條記錄后返回(例如10000),設置查詢超時時間timeout(例如10s),避免查詢一些寬泛的條件時耗費過多系統資源。
4.查詢語法解析。解析用戶查詢條件,識別用戶的查詢類型,例如用戶輸入車牌號、證件號、年齡段等條件時,查詢條件改寫為字段精確匹配,無法識別的查詢條件默認從全文字段匹配。
5.查詢條件調優。查詢結果不需要相關度排序時使用過濾器(filter),盡量使用路由(routing),設置較少的查詢讀取記錄條數和字段,避免前綴模糊匹配,設置search_after規避深度翻頁性能問題。
七、數據寫入、查詢性能測試。
SSD盤集群寫入性能測試(測試環境:Elasticsearch6.3.2集群,單節點16核CPU、64G內存、2T SSD盤,寫入10億條記錄,單條記錄1KB,副本數為0,1臺寫入服務器):
?
SSD盤集群查詢性能測試
?
SATA盤集群寫入性能測試(測試環境:Elasticsearch5.5.3集群,單節點56核CPU、128G內存、12塊 6T SATA盤,分別寫入1億、3億、5億、30億、300億條記錄,單條記錄1KB,0副本,50臺寫入服務器):
?
SATA盤集群查詢性能測試
?
參考文檔:
總結
以上是生活随笔為你收集整理的Day 4 - PB级规模数据的Elasticsearch分库分表实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让Elasticsearch飞起来!——
- 下一篇: 框架开发之Java注解的妙用