前言
我們可以在不關心原理的情況下使用Elasticsearch(以下簡稱ES),但要想用好ES,就必須熟知其內部原理。
為什麼要閱讀代碼?在傳統軟件行業,技術文檔非常豐富。當開展一個項目時,從需求分析,到概要設計、詳細設計,每個步驟都有相應的文檔,從項目的整體架構、技術方案選型,到流程圖、類圖,細化到每個接口及參數。在這種情況下,想要搞清楚繫統原理,並不需要閱讀代碼,文檔上什麼都有。但是互聯網產品迭代快,技術文檔不全,想要搞清楚原理,隻能閱讀代碼,相當於從代碼中逆向理解設計思想。
通過分析源碼,我們可以有以下收獲:
理解設計思想當我們面臨要解決的問題或實現的目標時,往往有多種方案可以選擇。無論表面上看起來多麼簡單的架構,其背後都經過了深思熟慮。思考一下為什麼使用現在的方案?有沒有更好的解決方案?
探究內部機制的原理某個技術點是怎麼實現的?
搞明白執行流程某個過程是什麼樣的,都做了什麼?有幾步?先做什麼,後做什麼?
熟悉代碼結構如果需要進行二次開發,則給出代碼入口和調用關繫,有時候找到某個邏輯的代碼實現要花很多時間。
學以致用借鋻其設計理念,掌握其解決問題的方式和方法,將來面對類似的問題時可以參考。
本書結構
本書由四部分組成,第一部分為基礎知識和環境準備(第1~2章);第二部分介紹ES的主要流程(第3~10章),包括集群啟動流程、節點啟動/關閉流程、選主流程、讀寫流程、搜索流程和索引恢復流程;第三部分主要介紹重要內部模塊(第11~17章),包括gateway模塊、allocation模塊、Snapshot模塊、Cluster模塊、Transport模塊和ThreadPool模塊等;第四部分介紹優化和診斷方法(第18~22章),包括寫入速度優化、搜索速度優化、磁盤使用量優化,以及在生產環境中的實際應用建議,第22章介紹常用的問題診斷方法,排查集群遇到的問題。
術語約定
ES中有一些特有的概念,這些概念對應的中文翻譯約定如下:
\u009f 分片(shard);
\u009f 主分片(primary shard),簡稱P;
\u009f 分片副本(特指數據的一個分片,無論主分片,還是副分片);
\u009f 副分片(replica shard),簡稱R;
\u009f 分片分配(shard allocation);
\u009f 集群狀態(cluster state);
\u009f 分配決策(allocation decision);
\u009f 分配感知(allocation awareness);
\u009f 分配標識(allocation IDs);
\u009f 追蹤(tracking);
\u009f 事務日志(translog);
\u009f 同步集合(in-sync set)。
行文約定
雖然本書是一本源碼分析類圖書,但原則上盡量少貼代碼,引用的代碼隻是為了說明原理,因此所引用的代碼並不保證和源碼完全一致,對非核心邏輯有所刪減,同時在代碼塊中,函數參數可能被省略,省略的函數參數用“…”表示,如:
executeBulk(...);
在引用代碼中的某個方法時,使用#號分隔類名與方法名:
類名#方法名
一個索引由許多分片組成。我們用如下方式表示索引website的第0個分片:
website[0]
聯繫
讀者有任何意見和建議都可以聯繫作者,郵箱:elasticsearchbook@163.com。
本書配套網站:www.elasticsearchbook.cn。
致謝
感謝李欣傑和郭東東,他們帶我走進搜索領域;感謝韓洪偉,他讓我學到了很多搜索繫統的知識。欣傑和老韓都是資深的搜索架構師,能夠和優秀的團隊共事是我的榮幸。感謝ES團隊的同事段軍義,我們互相學習,一起解決了很多麻煩的問題。感謝出版社的策劃編輯陳曉猛先生,他為本書的寫作提供了很多建設性意見,並且耐心地編校了本書,讓本書得以順利出版。
感謝我的妻子和三歲的女兒,我愛你們!
張超