Elasticsearch 分片集羣原理、搭建、與SpringBoot整合

單機es能夠用,沒毛病,可是有一點咱們須要去注意,就是高可用是須要關注的,通常咱們能夠把es搭建成集羣,2臺以上就能成爲es集羣了。集羣不只能夠實現高可用,也能實現海量數據存儲的橫向擴展。

新的閱讀體驗地址: http://www.zhouhong.icu/post/138

1、Elasticsearch分片機制:

  • 每一個索引能夠被分片,每一個主分片都包含索引的數據。
  • 副本分片是主分片的備份,主掛了,備份仍是能夠訪問,這就須要用到集羣了。
  • 同一個分片的主與副本是不會放在同一個服務器裏的,由於一旦宕機,這個分片就沒了。

以下圖:左邊每一個索引主備分片都會分配在三臺服務器上的不一樣節點上面,右圖粗方框表示主分片,細節點表示備節點。java

2、搭建Elasticsearch集羣

一、前置操做
  • ​ES中以前的data目錄,必定要清空,這裏麪包含了原先的索引庫數據。
  • 使用三臺服務器:
  • 192.168.1.184(主), 192.168.1.185(從), 192.168.1.186(從)
  • 關於Elasticsearch單機的簡介、安裝配置請轉到:http://www.zhouhong.icu/post/128
二、配置集羣
  • 修改每臺服務器上ES的elasticsearch.yml這個配置文件以下,每臺服務器node.name不同分別爲es-node一、es-node二、es-node3.

# 配置集羣名稱,保證每一個節點的名稱相同,如此就能都處於一個集羣以內了
cluster.name: es-cluster
# 每個節點的名稱,必須不同
node.name: es-node1
# http端口(使用默認便可)
http.port: 9200
# 主節點,做用主要是用於來管理整個集羣,負責建立或刪除索引,管理其餘非master節點(至關於企業老總)
node.master: true
# 數據節點,用於對文檔數據的增刪改查
node.data: true
# 集羣列表
discovery.seed_hosts: ["192.168.1.184", "192.168.1.185", "192.168.1.186"]
# 啓動的時候使用一個master節點,未指定ES會進行選舉
cluster.initial_master_nodes: ["es-node1"]
三、最後能夠經過以下命令查看配置文件的內容:(過濾掉「#」後面的註釋)

more elasticsearch.yml | grep ^[^#]
四、切換到esuser後啓動,訪問集羣各個節點,查看信息:
  • http://192.168.1.184:9200/
  • http://192.168.1.185:9200/
  • http://192.168.1.186:9200/

主節點宕機以後會從生下的兩個從節點選舉新的主節點,主節點恢復後成爲從節點。

3、Elasticsearch集羣腦裂現象

一、什麼是腦裂
  • 若是發生網絡中斷或者服務器宕機,那麼集羣會有可能被劃分爲兩個部分,各自有本身的master來管理,那麼這就是腦裂。

二、腦裂解決方案
  • master主節點要通過多個master節點共同選舉後才能成爲新的主節點。就跟班級裏選班長同樣,並非你1我的能決定的,須要班裏半數以上的人決定。
  • 解決實現原理:半數以上的節點贊成選舉,節點方可成爲新的master。

discovery.zen.minimum_master_nodes=(N/2)+1
  • N爲集羣的中master節點的數量,也就是那些 node.master=true 設置的那些服務器節點總數。
三、ES 7.X
  • 在最新版7.x中,minimum_master_node這個參數已經被移除了,這一塊內容徹底由es自身去管理,這樣就避免了腦裂的問題,選舉也會很是快。‘’

4、Elasticsearch集羣的文檔讀寫原理

  • 文檔寫原理:p1,p2,p0是主節點,r0,r1,r2是副本節點
  • 若是客戶端選擇了中間節點進行寫數據,那這個節點就會變成協調節點,接受用戶請求,會對文檔進行路由,計算這個文檔會寫入到哪一個主分片中,有主分片把數據同步到副本分片,都寫入完成以後,在跳回到協調節點,由協調節點相應請求。

  • 文檔讀原理:p1,p2,p0是主節點,r0,r1,r2是副本節點
  • 若是客戶端請求到了第一個節點,那第一個節點也會變成協調節點,而後根據文檔的數據進行路由,而後從主分片或者副本分片輪詢讀數據。無論從主分片仍是副本分片讀取數據,最後都會跳回到協調節點,由協調節點相應客戶端

5、Elasticsearch集羣與SpringBoot整合

一、建立工程,引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
二、配置yml文件:客戶端鏈接的是 9300
spring:
  data:
    elasticsearch:
      cluster-name: es-cluster
      cluster-nodes: 192.168.1.184:9300,192.168.1.185:9300,192.168.1.186:9300
版本協調:
目前springboot-data-elasticsearch中的es版本貼合爲es-6.4.3,如此一來版本須要統一,把es進行降級。等springboot升級es版本後能夠在對接最新版的。
三、解決啓動時 Netty issue fix 問題
在啓動類同一級目錄下建立 ESConfig.java 配置類

@Configuration
public class ESConfig {
    /**
     * 解決netty引發的issue
     */
    @PostConstruct
    void init() {
        System.setProperty("es.set.netty.runtime.available.processors", "false");
    }
}
相關文章
相關標籤/搜索