ELK系列二:Elasticsearch的架構原理和配置優化

一、Elasticsearch的數據組織架構



1.一、Elasticsearch結構概念


  • 集羣(cluster):擁有相同cluster-name的elasticsearch結點的集合(每一個結點其實就是一個elasticsearch進程實例)。
  • 節點(node):集羣中的一個 Elasticearch 實例。
  • 索引(index):至關於關係型數據庫中database的概念,好比2018.01.01日誌的IDS日誌單獨造成一個索引,IDS-2018.01.01,這是一個邏輯的概念。
  • 分片(shared):
    • 主分片(primary shared):索引的子集,索引能夠切分紅多個分片,分佈到不一樣的集羣節點上。
    • 副本(replica shared):一個主分片能夠有一個或多個副本分片做爲備份。
  • 類型(type),至關於關係型數據庫中table的概念。好比IDS-2018.01.01中的warnning.log
  • 文檔(document),至關於一條數據的原始數據的集合,通常就是一條JSON。
  • 字段(field),JSON中的某個字段值。 <strong>從索引到後面都是組織數據的結構概念,分片(不管主副)能夠自由分佈在集羣中的不一樣結點上,也不關係結點的主副概念(master-cluster和slave-cluster)。</strong>

1.二、建立索引時,如何分配主從分片等的配置


<strong>通常使用elasticsearch-head建立分片時,默認分片數五、副本數1(意思是每一個分片一個副本),分片數建立後不可修改,副本數可修改,數量按須要配置。注意:一個shared的主分片和副本不能放在同一個結點上,不然結點故障的容錯機制(數據冗餘備份)將失去效果。</strong> node

1.三、分片的路由計算


<strong>公式以下:</strong>數據庫

shared = hash(_id) %number_of_primary_shareds

通常狀況下是對_id字段進行hash處理後對主分片數目求餘獲得該條數據具體應該寫入那個分片。緩存

1.四、主副分片保障數據一致性


<strong>默認狀況下,數據寫入主分片後,會給全部副本發送方消息,當有一個副本也成功寫入數據後,及返回數據寫入成功。如須要修改能夠以下修改配置</strong>網絡

?consistency=all

1.五、分片的分配


通常是Elasticsearch自動進行,一些參數能夠控制該過程的架構

cluster.routing.allocation.enable #能夠分配那些分片,默認是all,none是完全拒絕,其餘選項有primaries和new_primaries。
cluster.routing.allocation.allow_rebalance #默認是indices_all_active,就是等待全部分片啓動後,開始負載均衡,否則啓動過程當中浪費太多流量。
cluster.routing.allocation.cluster_concurrent_rebalance #默認是兩個,含義是併發負載均衡任務數量,當結點數目增長,且負載壓力不大的條件下,可適當增長。
cluster.routing.allocation.node_initial_primaries_recoveries #結點重啓時,容許同時恢復的主分片數,默認是4個,若是結點是多磁盤,且I/O壓力不大時,能夠適當增長。
cluster.routing.allocation.node_concurrent_recoveries #除主分片重啓恢復意外的狀況下,能夠同時運行的數據恢復業務,默認是2個。
indices.recovery.concurrent_stream #網絡複製恢復分片時候的流數,默認是3個。
indices.recovery.max_bytes_per_sec #結點恢復時候的速率,默認40MB,建議加大。

1.六、自動發現配置


  • 組播方式 223.2.2.4 54328 發送clustername信息
  • 單播方式

1.七、其餘配置項


?timeout=30s #默認60s,含義是Elasticsearch等待異常結點是否能夠恢復的等待時間。

二、Elasticsearch的數據寫入和檢索以及數據防丟失機制



2.一、數據寫入流程


<strong> 內存buffer->segment->磁盤 </strong> segment能夠理解爲一個倒排索引的子集,舉例以下:併發

doc1:"tom","jill"
doc2:"tom"

倒排索引以下表負載均衡

字段/文檔 doc1 doc2
tom x x
jill x

2.二、segment的機制


  • 寫盤機制:一個segment刷到緩存中,Lucene能夠去檢索,等到segment真的寫到磁盤去了,commit文件更新,commit能夠理解爲segment的目錄表,刷新(refresh)時間默認是1s,基本屬於準實時檢索。
  • 歸併機制:segment太多,不利於系統和性能,會歸併。

2.三、寫盤和歸併的配置


#修改refresh時間 ,設置成-1,則中止refresh
curl -XPOST http://127.0.0.1:9200/IDS-2018.01.01/_settings -d '{"refreah_interval":"10s"}' 
#修改歸併配置
curl -XPOST http://127.0.0.1:9200/IDS-2018.01.01/_settings -d '{"persistent":{"key-name":"value"}}' 
#歸併配置選項
indices.store.throttle.max_bytes_per_sec #歸併線程限速配置,默認20M,建議遷移到100M或更高。
index.merge.policy.floor_segment #默認2M,小於這個大小的segment,優先歸併。
index.merge.policy.max_merge_at_once #默認一次最多歸併10個segment。
index.merge.policy.max_merge_at_once_explicit #默認optimize時候,一次最多歸併20個segment。
index.merge.policy.max_merge_segment #默認5GB。歸併後的segment的大最大大小。

2.四、translog磁盤同步

磁盤寫入等待緩存一塊兒寫,記錄數據信息,若是出現異常,會按照這個文件恢復數據,可是這個數據5s寫一次,因此仍是有可能丟失5s的數據。若是須要,能夠調小這個時間間隔:curl

index.gateway.local.sync

默認30分鐘、或者滿512M纔會清空。(或者確實寫入磁盤,commit文件確認了,translog纔會清空flush,)elasticsearch

相關文章
相關標籤/搜索