1. 程式人生 > 資料庫 >探究 | Elasticsearch 與傳統資料庫界限

探究 | Elasticsearch 與傳統資料庫界限

轉載(原文連結):https://blog.csdn.net/laoyang360/article/details/103379651

0、引言

 現在幾乎網上所有資料都說資料儲存在傳統資料庫,再在 es 中同步一份資料作為檢索使用,但是也都沒有很詳細的說明為什麼要這麼做,而且在 es 本身可以儲存資料的情況下,儲存兩份資料是不是沒有必要?還會引起別的問題。

雖然收費而且支援的語法不完全,但是在現在 es 已經支援 sql 的情況下,我越來越搞不清楚 es 和資料庫之間的界限。

es 不支援事務但是能夠確保單條資料的寫入,這樣事務可以通過程式碼實現。很難進行聯合查詢可以像其他 nosql 一樣用寬表實現。實時性可以通過配置調整,而在擴充套件效能和複雜統計上肯定 es 更優。

基於以上疑問,請問現階段 es 與資料庫的區別或者說界限到底在哪?

https://elasticsearch.cn/question/8885

——來自社群的提問

其實拿傳統關係型資料庫和 Elasticsearch 直接來對比有些牽強,畢竟一個是資料庫,一個是搜尋引擎。

如果硬要對比,我們剝繭抽絲,一點點探究一下 Elasticsearch 與傳統資料庫的不同。

1、使命不同

Oracle 對關係型資料庫的定義:

關係型資料庫,是指採用了關係模型來組織資料的資料庫,其以行和列的形式儲存資料,以便於使用者理解,關係型資料庫這一系列的行(包含唯一 key 的記錄)和列(儲存了屬性)被稱為表,一組表組成了資料庫。

Elasticsearch 的官方定義:

Elasticsearch 是一個分散式的開源搜尋和分析引擎,適用於所有型別的資料,包括文字、數字、地理空間、結構化和非結構化資料。Elasticsearch 在 Apache Lucene 的基礎上開發而成,由 Elasticsearch N.V.(即現在的 Elastic)於 2010 年首次釋出。Elasticsearch 以其簡單的 REST 風格 API、分散式特性、速度和可擴充套件性而聞名,是 Elastic Stack 的核心元件;Elastic Stack 是適用於資料採集、充實、儲存、分析和視覺化的一組開源工具。人們通常將 Elastic Stack 稱為 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列豐富的輕量型資料採集代理,這些代理統稱為 Beats,可用來向 Elasticsearch 傳送資料。

A relational database can store data and also index it.

A search engine can index data but also store it.

如上可通俗解讀為:

關係資料庫可以儲存資料併為其建立索引。

搜尋引擎可以索引資料,但也可以儲存資料。

2、適用場景不同

關係型資料庫更適合 OLTP(是一種以事務元作為資料處理的單位、人機互動的計算機應用系統,最大優點:最大優點是可以即時地處理輸入的資料,及時地回答)的業務場景;而 Elasticsearch不能當做純資料庫來使用。

原因 1:不支援事務,

原因 2:近實時而非準實時,由 refresh_interval 控制,最快 1s 資料寫入後可檢索。

Elasticsearch 適合 OLAP的場景(它使分析人員能夠迅速、一致、互動地從各個方面觀察資訊,以達到深入理解資料的目的。側重分析)。

舉例:

海量日誌分析和檢索、

海量大文字的全文檢索等。

3,儲存型別不同

關係型資料庫一般只支援儲存結構化資料(pgsql 支援 json)。

結構化資料的特點:

由二維表結構來邏輯表達和實現的資料

嚴格地遵循資料格式與長度規範。

舉例:銀行交易資料、個人資訊資料等。

而 Elasticsearch 支援關係型和非結構化資料,如:json 由 object 或者 nested 型別或者父子 Join 儲存。

非結構化資料的特點:

資料結構不規則或不完整;

沒有預定義的資料模型,不方便用資料庫二維邏輯表來表現的資料。

舉例:包括所有格式的辦公文件、文字、圖片、XML,HTML、各類報表、影象和音訊/視訊資訊等等。

腦海中想一下:是不是實戰中遇到:資料結構不定、欄位個數不定、欄位型別不定、是否動態新增不定等多變的業務場景?

4,可擴充套件性不同

關係型資料庫通病, 如:mysql 單表支援資料量有限,資料量大了就得分庫分表,再大了考慮分散式,原生分散式的瓶頸如下:

分庫分表非常麻煩,

業務依賴性高,

複雜查詢會出現錯誤,

更重要的是分散式事務無法有效處理。

催生了很多第三方 NewSql 公司如:TIDB(開源+解決方案付費)。

而 Elasticsearh 支援橫向擴充套件,天生支援多節點叢集部署,擴充套件能力強,甚至支援跨叢集檢索;能支援 PB+的資料。

國內的:滴滴、攜程、順豐、今日頭條、bat 等很多核心資料業務都已經通過 Elasticsearch 實現。

5,解決問題不同

關係型資料庫針對核心:增刪改查的業務場景,對於全文檢索會慢的要死(很多客戶遷移 Elasticsearch 就是這個原因,早期用 lucene 後用 solr,但發現 Elasticsearch 更好用);而 Elasticsearch 的倒排索引機制更適合全文檢索。

實際業務中:

如果資料量不大,建議使用簡單的關係資料庫結合簡單的 SQL 查詢就能解決問題。

如果您對效能沒有問題,請保持架構簡單並使用單個數據庫儲存,必要時加些快取(如 redis)。

如果您在搜尋中遇到效能問題,則可以將關係型資料庫和 Elasticsearch 結合使用。

6,資料模型不同

關係型資料庫通常針對複雜業務會多表設計、不同表不同模型,多表通過 join 關聯或者檢視查詢。

而 Elasticsearch 支援複雜業務資料,通常不建議多表關聯,確切說 Elasticsearch 倒排索引機制決定了它天然不適合多表關聯。複雜業務資料通常解決方案:

1,寬表(空間換時間);

2,nested

3,父子關聯 join(針對頻繁更新場景)。

對於聚合業務場景,的確大資料量(千萬級以上)多重巢狀全量聚合 es 會很慢,業務選型可以考慮其他輔助方案。

7、底層邏輯不同

傳統資料庫的儲存引擎為 B+樹,包括 ES 的很多 NOSQL 資料庫使用的 LSM Tree,對寫操作支援更高效。

為什麼 Elasticsearch/Lucene 檢索可以比 mysql 快?

Mysq 的分詞詞典(term dictionary)是以 b-tree 排序的方式儲存在磁碟上的。檢索一個 term 需要若干次的隨機訪問磁碟操作。

而 Lucene 在分詞詞典的基礎上添加了 term index(以 FST(finite state transducers)形式儲存,非常節省記憶體)來加速檢索,term index 以樹的形式快取在記憶體中。從 term index 查到對應的 term dictionary 的 block 位置之後,再去磁碟上找 term,大大減少了磁碟的隨機訪問次數。

8、小結

所以,沒有最牛逼“一招先,吃遍天”的方案,只有最適合的方案。

適合自己業務場景的才是最好的!

其他歡迎補充。

參考:

[1] https://stackoverflow.com/questions/51639166/elasticsearch-vs-relational-database 

[2] https://zhuanlan.zhihu.com/p/73585202 

[3] https://www.elastic.co/cn/what-is/elasticsearch 

[4] https://www.oracle.com/database/what-is-a-relational-database/ 

[5] https://zhuanlan.zhihu.com/p/33671444

END