第十二章 Net 5.0 快速開發架構 YC.Boilerplate --千萬級資料處了解決方案
線上文檔:http://doc.yc-l.com/#/README
線上示範位址:http://yc.yc-l.com/#/login
源碼github:https://github.com/yc-l/yc.boilerplate
源碼gitee:https://gitee.com/yc-power/yc.boilerplate
視訊教程:
元磁之力架構開源初心和架構設計介紹(上): https://www.bilibili.com/video/BV1VM4y1G7hC/
元磁之力架構開源初心和架構設計介紹(下): https://www.bilibili.com/video/BV15h411s7w6/
元磁之力架構資料庫表和代碼生成使用教程實戰: https://www.bilibili.com/video/BV1oM4y137D5/
QQ群:1060819005
後續:關于架構demo和細節技巧,會在QQ群中釋出,就不撰文說明。
簡介
為了提升<code>YC.Boilerlate</code> 在大資料量的處理能力,引入ES元件,封裝對應的子產品、實作租戶拆分、倉儲、叢集、大資料上億級别以上資料的檢索、統計、分析,并提供千萬級别分詞搜尋等示範示例。
ES基礎介紹
Elasticsearch 是一個分布式、RESTful 風格的搜尋和資料分析引擎,是PB級别大資料解決方案元件之一。
Elasticsearch是基于Lucense的搜尋伺服器,,基于RESTful web接口。Elasticsearch是Java語言開發的,并作為Apache許可條款下的開放源碼釋出,是一種流行的企業級搜尋引擎。Elasticsearch用于雲計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用友善。
ES解決什麼問題
對海量資料進行近實時的處理
ES自動可以将海量資料分散到多台伺服器上去存儲和檢索,通過内置搜尋引擎、分詞、實作
千萬級别資料秒級查詢、統計、分析等,相對傳統關系型資料庫的模糊查詢在速度有着質的飛躍。
ES 适用場景
維基百科,類似百度百科,牙膏,牙膏的維基百科,全文檢索,高亮,搜尋推薦
The Guardian(國外新聞網站),類似搜狐新聞,使用者行為日志(點選,浏覽,收藏,評論)+社交網絡資料(對某某新聞的相關看法),資料分析,給到每篇新聞文章的作者,讓他知道他的文章的公衆回報(好,壞,熱門,垃圾,鄙視,崇拜)
Stack Overflow(國外的程式異常讨論論壇),IT問題,程式的報錯,送出上去,有人會跟你讨論和回答,全文檢索,搜尋相關問題和答案,程式報錯了,就會将報錯資訊粘貼到裡面去,搜尋有沒有對應的答案
GitHub(開源代碼管理),搜尋上千億行代碼
電商網站,檢索商品
日志資料分析,logstash采集日志,ES進行複雜的資料分析(ELK技術,elasticsearch+logstash+kibana)
商品價格監控網站,使用者設定某商品的價格門檻值,當低于該門檻值的時候,發送通知消息給使用者,比如說訂閱牙膏的監控,如果高露潔牙膏的家庭套裝低于50塊錢,就通知我,我就去買
BI系統,商業智能,Business Intelligence。比如說有個大型商場集團,BI,分析一下某某區域最近3年的使用者消費金額的趨勢以及使用者群體的組成構成,産出相關的數張報表,**區,最近3年,每年消費金額呈現100%的增長,而且使用者群體85%是進階白領,開一個新商場。ES執行資料分析和挖掘,Kibana進行資料可視化國内
國内:站内搜尋(電商,招聘,門戶,等等),IT系統搜尋(OA,CRM,ERP,等等),資料分析(ES熱門的一個使用場景)
ES 常用組合
ELK :Elasticsearch是與名為Logstash的資料收集和日志解析引擎以及名為Kibana的分析和可視化平台一起開發的。這三個産品被設計成一個內建解決方案。
Elasticsearch可以用于搜尋各種文檔。它提供可擴充的搜尋,具有接近實時的搜尋,并支援多租戶。Elasticsearch是分布式的,這意味着索引可以被分成分片,每個分片可以有0個或多個副本。每個節點托管一個或多個分片,并充當協調器将操作委托給正确的分片。再平衡和路由是自動完成的。相關資料通常存儲在同一個索引中,該索引由一個或多個主分片和零個或多個複制分片組成。一旦建立了索引,就不能更改主分片的數量。
阿裡巴巴開發的canal:基于Mysql的binlog日志訂閱:binlog日志是Mysql用來記錄資料實時的變化。這裡主要的是binlog同步元件,目前實作的有國内的。
github位址:https://github.com/alibaba/canal
go-mysql-elasticsearch:go-mysql-elasticsearch是一款使用go語言開發的同步資料到ES的工具。 go-mysql-elasticsearch也是基于Mysql的binlog訂閱,也可以使用使用mysqldump的方式。目前還不支援ES6.x及以上的版本,也不支援mysql8.x版本,同時該項目目前還不夠穩定,也在開發中。
項目github位址:https://github.com/siddontang/go-mysql-elasticsearch
ES 和正常關系型資料庫差異
ES中有幾個基本概念:索引(index)、類型(type)、文檔(document)、映射(mapping)等。我們将這幾個概念與傳統的關系型資料庫中的庫、表、行、列等概念進行對比,如下表:

正常問題
記憶體:es 的預設配置在正常伺服器上大部分都有記憶體使用率的問題,需要根據實際情況合理調優。
版本:ES 每個版本配套元件有極強耦合,無法做到各個版本相容,是以jdk、以及其他元件需要指定适配。
分詞:es除了内置standard分詞,還可以其他分詞元件,對中文支援比較好的有:es-ik。
分片(shard): 因為 ES 是個分布式的搜尋引擎, 是以索引通常都會分解成不同部分, 而這些分布在不同節點的資料就是分片. ES自動管理群組織分片, 并在必要的時候對分片資料進行再平衡配置設定, 是以使用者基本上不用擔心分片的處理細節.
副本(replica): ES 預設為一個索引建立 5 個主分片, 并分别為其建立一個副本分片. 也就是說每個索引都由 5 個主分片成本, 而每個主分片都相應的有一個 copy。對于分布式搜尋引擎來說, 分片及副本的配置設定将是高可用及快速搜尋響應的設計核心.主分片與副本都能處理查詢請求,它們的唯一差別在于隻有主分片才能處理索引請求.副本對搜尋性能非常重要,同時使用者也可在任何時候添加或删除副本。額外的副本能給帶來更大的容量, 更高的呑吐能力及更強的故障恢複能力。
深度查詢:在Elasticsearch中如果需要做分頁查詢,我們通常使用form和size實作。form指定從有序哪一行開始,size表示從目前開始讀取多少行。但是我們發現查詢結果最大隻能到10000,這是因為Elasticsearch中的size的預設值在index.max_result_window 中設定,并且預設值就是10000,如果需要擴充,可以通過如下操作【擴大查詢最大值】其中1000000是辨別擴大為10萬:
還可以采用searchAfer、scroll等方案。
叢集部署
在本地或者伺服器上搭建3個es節點,形成叢集,針對<code>elasticsearch.yml</code> 進行節點配置,最後啟動服務,并安裝對應的kibana元件【可視化】。
配置
在項目的YC.ServiceWebApi 中的配置檔案 DefaultConfig.json,做如下配置,其中node是對應的es節點。
在項目的YC.ServiceWebApi 找到 <code>ElasticSearchAutofacModule.cs</code>該檔案是相關的IOC 注入配置,在<code>Startup.cs</code>中進行如下注入操作:
ES 子產品調用
在示例示範 <code>BookAppService</code> 中可以直接使用對應的注入調用es元件。
YC.ElasticSearch 子產品介紹
子產品包含有請求上下文、以及預設倉儲,其中倉儲封裝了正常crud、聚合查詢、searchAfter查詢等正常操作異步方法,并在倉儲上提供一個公開請求上下文對象,用于自定義化es操作,子產品配套對應的單元測試,提供基礎調用示例。
es 其他使用介紹
分片
使用 kibana 操作,對指定的Index進行分片
資料結構修改和遷移
分頁查詢
結果如下:
深度查詢 searchAfter
配套的net單元測試代碼如下:
scroll 查詢
聚合查詢
YC.ElasticSearch 大資料檢索示例
在<code>http://yc.yc-l.com/</code> 示範站點中,預設使用租戶1 作為es 檢索示範,内置1000多萬條測試資料,通過 <code>書名、書内容關鍵詞、釋出時間範圍</code>等可進行查詢,<code>價格</code> 查詢在示範站點中關閉了,無法查詢,請注意。
備注:示範站點預設使用10000條資料查詢上限邊界。
筆者原創!如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”将是我最大的寫作動力!歡迎各位轉載,轉載請添加原部落格連接配接,否則保留追究法律責任的權利,謝謝!
YC.Boilerplate 快速開發架構交流,請加群:1060819005
區塊鍊交流請加QQ群:538327407(已滿),群2:135019400.
我的部落格位址:http://www.cnblogs.com/linbin524/