ElasticSearch集羣搭建圖文解析

/ 前言 /

       ElasticSearch作爲一個分佈式搜索引擎有着廣泛的應用場景, 而搜索服務在在一個項目中的權重還是比較高的, 所以我們要想辦法去提高搜索服務的可用性, 這就是ElasticSearch集羣的作用, 爲搜索服務提供高可用的特性

        何爲高可用呢, 其實就是字面意思, 假設我們的搜索服務可以一直不停的提供服務, 那麼高可用性就是100%, 如果一週之內停機了30分鐘, 那可用性就是99.7%

        本文主要包含以下內容

ElasticSearch的信息存儲機制
ElasticSearch的節點類型
ElasticSearch啓動常見異常及解決方案
如何搭建ElasticSearch集羣
如何關閉ElasticSearch服務(附Shell腳本)

/ 1 / 瞭解ElasticSearch

1 . 1 ElasticSearch版本的事情

這裏我們重點關注7.x版本, 這個版本有倆個事情需要知道

  • 內置JDK(根據ES版本內置不同版本的JDK), 如7.7內置的就是JDK13
  • Security功能免費使用, 但是高級安全功能任然需要付費
1 . 2 集羣如何保證數據不會丟失(信息存儲機制)

我們知道宕機是無法避免的, 我們只能減小因宕機而造成的損失, 那麼ElasticSearch集羣是如何避免的呢?

我們需要先了解倆個概念, 分片(Shard)和副本(Replica)

  • 分片(Shard) : 我們知道ElasticSearch中會存在多個數據庫, 每個數據庫會生成5(默認)個分片, 數據存儲在分片中, ElasticSearch會將分片均勻的分佈在進羣中, 避免一臺主機宕機後數據無法訪問
  • 副本(Replica) : 每個分片同時會生成一個副本, 副本的內容同分片一致, 分片和副本幾乎不會被分配在同一臺主機, 這樣做是爲了防止分片所在的主機和數據庫所在的主機同時宕機後導致這部分數據無法訪問

       總結來說就是ElasticSearch會爲當前的數據庫默認生成5個分片和5個副本, 副本是分片中數據的備份, ElasticSearch會將其儘可能的均勻分佈開來, 分片和對應的副本儘量不會分配到同一臺主機, 這樣就可以保證即使有一臺主機突然宕機了我還可以用過分片或者副本將數據還原

1 . 3 集羣中的節點
  • 主節點(Master): 這個概念大家應該不陌生了, 它就相當於管理者, 負責管理集羣, 分片和副本的分配也是它負責的, 沒了管理者的後果是什麼啊, 那就是分裂山頭, 各自爲王, 你不搭理我我不搭理你, 所以主節點非常重要, 一般都會有替補, 因爲我們上面已經說過了, 宕機是不可避免的, 我們能做的只有儘量避免因宕機而造成的損失
  • 數據節點(Data) : 存儲數據的節點, 負責數據的增刪改查, 對內存及磁盤要求較高, 一般數據節點在集羣中的佔比最高
  • 路由/負載節點(client) : 負責搜索請求的分發, 協調節點將請求轉發到保存數據的數據節點, 並將結果返回給路由節點, 減緩數據節點的壓力, 一般在大型集羣中可以看到 . 如果當前節點既不是主節點也不是數據節點, 那麼就會成爲路由節點
  • 部落節點(tribe) : 在7.x中被刪除, 負責協調多個ES集羣, 充當聯絡官, 會將所有集羣合併爲全局集羣, 可以對全局集羣中單獨的節點執行本地讀寫操作, 但是無法操作全局集羣中重複的索引
  • 提取節點(Ingest) : 負責對文檔進行預處理操作, 例如進行數據轉換, 將String轉換爲日期或是將整數/浮點數轉換爲字符串 . 默認情況下, 所有節點都支持提取功能

如何進行節點的配置

  • 一個節點 : 當前節點既是主節點也是數據節點
  • 3 - 5個節點 : 通常爲所有節點都是數據存儲節點, 並全部設置爲主節點, 讓集羣自動選舉. 也可以根據數據量和請求流量來進行拆分爲單獨的主節點及數據節點. 並且爲了防止發生腦裂, 主節點數量必須>=((節點數量/2) + 1)
  • 6 - n : 拆分獨立的主節點、數據節點、路由節點, 並且要保證主節點的數量, 防止發生腦裂

/ 2 / 搭建ElasticSearch集羣

2 . 1 搭建前準備
  • 準備主機

    192.168.0.1
    192.168.0.2
    192.168.0.3
    192.168.0.4
    192.168.0.5
    
  • 主機之間相互可以ping通

  • 建議關閉所有主機的防火牆, 或者打開9200及9300的端口

  • ElasticSearch7.x以下版本需要準備JDK, 並且版本必須跟ElasticSearch對應

2 . 2 安裝ElasticSearch

ElasticSearch官方下載地址

  • 下載安裝包

    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-linux-x86_64.tar.gz
    
  • 解壓安裝包

    # /opt是你指定的安裝目錄
    tar -xf elasticsearch-7.7.0-linux-x86_64.tar.gz -C /opt
    
  • 建立軟鏈接

    # /elasticsearch是指定的軟連接目錄,可以爲空,在建立軟連接是自動創建
    ln -s /opt/elasticsearch-7.7.0   /opt/elasticsearch
    

    軟連接建立失敗的話elasticsearch文件夾是紅色, 建立成功是藍色的

2 . 3 修改配置文件

elasticsearch.yml

# 集羣名稱
cluster.name: es-cluster
  
# 節點名稱,注意:同一集羣內節點名稱不能相同
node.name: "node-1"
  
# 當前節點是否是主節點
node.master: true
  
# 當前節點是否是數據節點
node.data: true
  
# 是否禁用提取節點
node.ingest: false
  
# 一臺主機能運行的節點最大數量
node.max_local_storage_nodes: 1
  
# 集羣中符合主節點條件的節點數量, 數量爲(節點數量 / 2 + 1)
discovery.zen.minimum_master_nodes: 2
  
# 集羣自舉配置, 只在首次啓動集羣時游泳, 集羣初始化時會讀取該參數去尋找符合主節點條件的節點的主機名或 IP 地址
cluster.initial_master_nodes: ["node-1","node-2"]
#cluster.initial_master_nodes: ["192.168.0.1","192.168.232.137"]

# 綁定的ip地址,當前主機的ip地址
network.bind_host: 192.168.0.1
  
# 節點交互的端口,注意該端口僅負責節點之間交互,無法直接訪問
transport.tcp.port: 9300
  
# 對外服務的端口,可以根據該端口查看當前節點狀態和集羣狀態
http.port: 9200
  
# 是否允許跨域
http.cors.enabled: true
  
# 允許跨域的地址
http.cors.allow-origin: "http://192.168.0.1:8080"
  
# 集羣中其它節點與當前節點通信的ip地址,可以設置爲當前主機ip,也可根據實際情況設置
network.publish_host: 192.168.0.1
  
# 設置爲當前主機ip不允許外網訪問,想要允許外網訪問可以設置爲0.0.0.0
network.host: 192.168.0.1
  
# 所有的主節點列表, 用於被集羣發現
discovery.zen.ping.unicast.hosts: ["192.168.0.1:9300","192.168.0.2:9300"]

不同的主機修改node.namenetwork.hostnetwork.bind_host即可

2 . 4 啓動ElasticSearch

ElasticSearch從5.0版本開始就不允許再使用root用戶啓動服務了, 所以我們需要爲單獨創建一個用戶用來啓動ES

# 創建用戶,除了root用戶外,其餘用戶都可以存放在/home下
useradd -d /home/es es

# 賦予用戶權限
chmod -R es /opt/elasticsearch

啓動ElasticSearch

cd elasticsearch
# 切換爲ES啓動用戶
su es
# 日誌打印在終端中
./bin/elasticsearch

# 後臺啓動
./bin/elasticsearch -d

# 後臺啓動並將日誌打印到文件中
nohup ./bin/elasticsearch -d &

啓動時會輸出一條日誌, 無需理會

OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.

驗證是否啓動

curl 192.168.0.1:9200
{
  "name" : "node-1",
  "cluster_name" : "es-cluster",
  "cluster_uuid" : "ijsTRA5iSPiS84B91-skwQ",
  "version" : {
    "number" : "7.4.2",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
    "build_date" : "2019-10-28T20:40:44.881551Z",
    "build_snapshot" : false,
    "lucene_version" : "8.2.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

當返回數據中cluster_uuid有值就代表着集羣已經啓動了

ElasticSearch常見啓動異常及解決方案請看我的另一篇博文

ElasticSearch常見啓動異常及解決方案

查看集羣狀態,數據太多了我們就只展示一部分

curl 192.168.0.1:9200/_cluster/state?pretty

{
  "cluster_name" : "es-cluster",
  "cluster_uuid" : "ijsTRA5iSPiS84B91-skwQ",
  "version" : 23,
  "state_uuid" : "BBECx15qS5iEV8TQ36Lb4Q",
  # 主節點的uuid,我們可以看到當前主節點是node-2
  "master_node" : "jj2lwwPTT_-RC6Hj6Hv5Ww",
  "blocks" : { },
  # 集羣的全部節點
  "nodes" : {
    "jj2lwwPTT_-RC6Hj6Hv5Ww" : {
      "name" : "node-2",
      "ephemeral_id" : "F_pgnQRYS_2W7CR3f-L0BQ",
      "transport_address" : "192.168.232.137:9310",
      "attributes" : {
        "ml.machine_memory" : "1019826176",
        "ml.max_open_jobs" : "20",
        "xpack.installed" : "true"
      }
    },
    "KfUN9MUtTGCM8qMpsWX-Zw" : {
      "name" : "node-1",
      "ephemeral_id" : "mjcI-PyqRnukT15-KfxVLg",
      "transport_address" : "192.168.232.136:9310",
      "attributes" : {
        "ml.machine_memory" : "1019826176",
        "ml.max_open_jobs" : "20",
        "xpack.installed" : "true"
      }
    }
  },
  "metadata" : {
    "cluster_uuid" : "ijsTRA5iSPiS84B91-skwQ",
    "cluster_coordination" : {
      "term" : 2,
      "last_committed_config" : [
        "jj2lwwPTT_-RC6Hj6Hv5Ww"
      ],
      "last_accepted_config" : [
        "jj2lwwPTT_-RC6Hj6Hv5Ww"
      ],
      "voting_config_exclusions" : [ ]
    },
    ...
  }
  ...
}

/ 3 / 關閉ElasticSearch

ElasticSearch的關閉只能通過kill命令來殺掉ES的進程

ps -ef|grep elasticsearch
kill -9 12311

爲大家提供一個Shell腳本來實現關閉ES

PID=$(ps -ef|grep elasticsearch|grep -v grep|awk '{print $2}')
if [ -z $PID ]; then
        echo "process elasticsearch not exist"
        exit
else
        echo "process id: $PID"
        kill -9 ${PID}
        echo "process elasticsearch killed"
fi

[es@node-1 opt]$ sh kill.sh
process id: 9292
process elasticsearch killed

參考文章 :

ElasticSearch官方文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章