ElasticSearch的Gateway及存儲原理

ES裏有一個叫作gateway的東西,今天抽空理一下,前面翻譯ES的一篇博文叫作「搜索引擎與時間機器」,既然裏面談到了時間機器,就免不了須要穿越時空的的門咯,I guess,也許gateway這名字就是這麼來的,其實在ES裏面,gateway的主要職責是用來對數據進行長持久化(持久化了以後加上版本信息,不就能夠自由的往還於過去將來之間了嗎?),另外,整個集羣重啓以後能夠經過gateway從新恢復數據。

因爲ElasticSearch是專爲分佈式環境而設計的,因此怎麼去對全部節點的索引信息進行持久化是個問題,除了索引信息以外,還有ClusterState(集羣信息),mapping,索引碎片信息,以及transaction log等信息也是須要進行持久化的,0.11以後的版本新加了LocalGateway(而且是默認配置),加上以前的fs(使用共享文件系統)、hdfs(hadoop 分佈式文件系統)、cloud(ec2之類的雲存儲),0.11以前默認的是None,也就是不進行持久化,這樣的話若是服務器都掛了,就會形成數據丟失,local gateway這種模式顧名思義就是節點各自保存其狀態,節點直接從本地存儲來恢復節點狀態和索引信息,localgateway有以下幾個選項:
node

gateway.recover_after_nodes: 1 (or gateway.recovery_after_master_nodes)
 
gateway.recover_after_time: 5m (m分鐘、s秒)
 
gateway.expected_nodes: 2

當你的節點出現故障或者集羣重啓的時候,這些配置很重要,你應該儘可能保證有了足夠多的節點來執行故障恢復,確保獲得最終的集羣狀態,可能存放最新版本的狀態信息的節點還未起來,不然可能會丟失數據。json

至於索引碎片的恢復則只需用達到足夠恢復的數目便可,若是你沒有設置備份,或者恰好某個碎片恰恰都丟了,那估計只能是沒戲咯,服務器

另外,在個人測試中,2臺機器,其中一臺網絡不穩定,常常斷開,(ip衝突形成),形成集羣中的節點各類爲戰,這裏有一些參數可配:網絡

discovery.zen.fd.connect_on_network_disconnect : true
 
discovery.zen.initial_ping_timeout : 10s
 
discovery.zen.fd.ping_interval : 2s
 
discovery.zen.fd.ping_retries  : 10

若是使用是共享文件系統的gateway,默認是每隔10s將數據異步的複製到共享的文件系統中(這是ES裏一個叫gateway snapshot的概念),想一想若是集羣很大,共享文件系統就須要保存很大的數據量,而且維護以及設備自己成本都很高,而使用local方式則能夠作到各個節點自治,確實很方便啊。app

有關存儲異步

說了這麼半天,還有一個問題就是es工做的存儲目錄,具體來講就是es服務的索引工做目錄,gateway只是作持久化和恢復,不會直接使用,因此還有一個工做目錄是用來查詢操做的,具體來講就是經過Store模塊來完成的(es的每一個功能都是一個模塊,結構很是好),es的存儲設置是per index級別的,因此你能夠爲每一個index指定它存儲的位置,既然持久化的工做已經完畢了,本地操做的索引通常只放在兩個地方:內存和本地文件系統,主要是性能上考慮的,若是內存很大,那就所有放內存咯,值得一提的是,在ES裏,全部存放work目錄下(或內存)的東西假定能被丟失的和臨時性的,另外你有多個副本存放在不一樣的節點上,每一個索引又拆成了多個碎片位於不一樣的節點上,假設一臺節點上的數據丟了,那也只是整個索引少了其中的一個碎片的一個副本而已,而且es會立刻進行碎片的從新分配(allocate),確保數據的完整。jvm

還有一個重要特色就是es能夠直接使用jvmheap以外的內存。
下面是一個配置inex使用內存來進行存儲的例子(更多配置細節):elasticsearch

index :
    store:
        fs:
            memory:
                enabled: true

還有一個就是關於索引碎片數和副本數的配置問題,你不可以對已經存在的索引修改碎片數,也就是有了數據以後就不能修改了,由於目前es只是簡單的哈希取模[hash(_id) MOD number_of_shards],若是之後支持一致性哈希,那就很好了,不過副本數目是能夠隨時動態更改的,若是你要對全局進行設置,參照以下:分佈式

gateway:
    type: local
index:
    gateawy:
        snapshot_interval: 30s
    number_of_shards: 3
    number_of_replicas: 2
path:
    logs: /path/to/logs

新建立一個索引並設置:
PUT http://localhost:9200/myindex/oop

{
 "index" : {
 "number_of_replicas" :3,
"number_of_shards" :7
 }
 }

動態設置索引副本數量:
PUT: http://localhost:9200/myindex/_settings

{
 "index" : {
 "numberOfReplicas" :2
 }
 }
相關文章
相關標籤/搜索