天天看點

安裝 Elasticsearch (本地及 Docker)-Elastic Stack 實戰手冊

安裝 Elasticsearch (本地及 Docker)-Elastic Stack 實戰手冊
https://developer.aliyun.com/topic/download?id=1295 · 更多精彩内容,請下載下傳閱讀全本《Elastic Stack實戰手冊》 https://developer.aliyun.com/topic/download?id=1295 https://developer.aliyun.com/topic/es100 · 加入創作人行列,一起交流碰撞,參與技術圈年度盛事吧 https://developer.aliyun.com/topic/es100

創作人:陳晨

審稿人:劉帥

本章介紹 Elasticsearch (簡稱 ES )的安裝和部署,将會從以下幾個方面進行闡述:

  1. 環境準備
  2. 系統級别參數配置
  3. 下載下傳、安裝及啟動
  4. 常見問題及解決方案

ES 和其他的服務一樣,也是部署在伺服器上進行使用的系統,為了能夠讓它更好的支援我們的實際使用,ES 節點/叢集的部署環境就顯得尤為重要。本節将從系統環境的選擇,必須基礎應用的安裝等方面進行闡述。

環境選擇政策

作業系統

由于絕大部分 ES 叢集的部署環境都是基于公有雲 Linux 的,是以本文主要以 CentOS7 為基礎進行闡述,同時也會針對 Windows 和 MacOS 環境的安裝部署進行簡要描述。

選擇 CentOS 7 作為基礎系統有以下一些考慮:

  • ES 雖然是基于JVM 上運作的 Java 項目,但它在啟動、運作時會對一些環境參數,如虛拟記憶體數、檔案句柄等有所要求
  • 國内的 ES 使用和部署中,以 CentOS 和 Debian 為主,存在少量的 Ubuntu 和 極少量的 Windows 的伺服器

官方團隊對 64 位系統進行了穩定性測試和系統性相容,其中除了以下一些版本以外都可以較好的支援:

  • CentOS 家族(6、7、8)中,CentOS6 不支援 7.9.2 版本捆綁的 JDK15+
  • Debian 家族(7~10)中, Debian 7 從 5.x 版本開始不支援
  • Ubuntu 家族(14、16、18)中,Ubuntu 14.04 從 7.x 版本開始不支援,但 Ubuntu 16,18 都支援 7.x 。
  • Windows 家族(Windows server 2012/R2、2016、2019)中,隻有 Windows server 2019 對 ES 7.7 之前的版本相容性有限。

再結合通用雲廠商和自建伺服器的作業系統選型中,CentOS7 得到了較好的支援和維護,是以此處我們選擇以 CentOS7 作為首選作業系統

記憶體、CPU

ES 節點啟動的預設需求為1C2G (1 核 CPU,2GB 記憶體)

通過調整 $ES_HOME/config/jvm.options 檔案中的堆棧配置,也可以讓 ES 執行個體在 1C1G 甚至更小資源的伺服器上啟動。

注意:更小的可用資源意味着更差的性能和節點穩定性,甚至節點啟動失敗。

實際生産中,更大的記憶體意味着更高的資料處理能力,更多的 CPU 核數可以支援更多的内部線程,但是無可避免的,更多的資源也意味着更高的系統開銷。一般情況,記憶體和 CPU 的配比大緻為 1:2 到 1:4 用以支援絕大部分資料存取、聚合等操作的使用,但是實際的記憶體、CPU 的用量和配比還需要用真實資料模拟真實生産環境的壓測結果為準

一般的記憶體、CPU 配置政策大緻為以下幾種

  • master 節點需要适當大小的記憶體
  • coordination 節點需要較大的記憶體和 CPU
  • ingest 節點需要較大的 CPU
  • data 節點需要較大的記憶體和硬碟

實際生産中,需要通過壓測來确定最佳的記憶體、CPU 配比,一般情況伺服器的記憶體除了系統占用的固定記憶體之外,會建議設定為伺服器可用記憶體的一半。

除了 ES 執行個體之外,ES 所維護的 Lucene 也是 Java 庫,也需要占用相應的記憶體。此時,ES 的最大/小堆棧記憶體建議不超過 31G,否則會因為指針壓縮的原因白白浪費記憶體資源,甚至可能出現資料存取更慢的問題。如果目标伺服器的可用記憶體超過 64G 的話,可以考慮通過端口的配置部署多個 ES 執行個體。

磁盤

  1. 沒做特殊配置的話,ES 會在寫入及不斷的查詢過程中,将資料集中存在最新修改和召回的資料緩存在節點 /叢集的各級記憶體(緩存)中。同時将絕大部分資料存在磁盤中的各種索引檔案中,僅在記憶體中保留一部分索引檔案的索引以加速資料的讀寫
  2. 不同于記憶體中的檔案,ES 放置在磁盤中的檔案的讀寫是随機的不是順序的,是以更快的随機讀寫速度将使 ES 提供更快的資料存取速度。
  3. 在線上搜尋等高頻存取的場景中,更建議使用固态硬碟以支援資料的高速讀寫
  4. 在離線的日志存儲等低頻讀取的場景中,則可以考慮用機械硬碟來節約成本

JDK

  1. ES 作為一個 Java 應用,也需要運作在與之相比對的 JVM上
  2. 相對于低版本的 ES,高版本的 ES 部署包會自帶 JDK,是以隻需要保證部署 ES 的系統可以支援對應的 JDK 就好
  3. 目前 ES 7.10 所對應的 JDK 是 JDK11 至 15,是以部署的系統隻要能支援 JDK11 以上的 JDK 版本都可以用來做部署
  4. ES 的部署建議盡量使用 ES 自帶的 OpenJDK,因為 Elastic 團隊會在每個版本中對對應的 OpenJDK 版本進行适配和調教,貿然使用其他版本的 JDK 可能會帶來不可預見的問題

實際系統配置

修改源并安裝必要工具

sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
        -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
        -i.bak \
        /etc/yum.repos.d/CentOS-Base.repo &&  \
        yum makecache && \
        yum update -y && \
        yum install -y epel-release && \
        yum install -y curl wget htop unzip && \
        yum install -y docker docker-compose
           

開啟 docker 服務

  1. systemctl start docker
  2. systemctl enable docker

小結

本節對 ES 節點/叢集部署所需環境對選擇政策、必備軟體等方面進行了闡述。

ES 作為一個複雜的系統,對于伺服器資源的要求相較于一般的服務要更嚴格,這樣也能夠保證 ,ES 節點可以更好的發揮其作用。本節将從各種系統級别的參數要求及修改意義方面進行闡述。

系統級别參數配置政策

ES 内部會啟動包括而不僅限于 query 線程池、資料寫入線程池、資料 refresh 線程池、segment merge 線程池等等。在啟動時 ES 會要求系統中單個程序可用線程數超過 65535。

在 Linux 裡萬物皆檔案,線程也可以看作一種特殊的檔案。在啟動時 ES 會要求系統中可打開的檔案句柄數超過 65535。

在運作時,ES 會建議避免在運作過程中因為系統的緩存交換而産生的性能損耗。大部分作業系統有可能會将系統緩存中的資料交換到硬碟中。在 ES 節點部署的時候建議禁止這一交換行為。

在運作時,ES 會占用大量的記憶體進行一系列的資料處理。建議開啟記憶體鎖定的配置,将它所占用的記憶體進行鎖定。

配置流程(太長不看版)

修改系統級别限制

sed -e '/^vm.max_map_count/d' \
        -i.bak \
        /etc/sysctl.conf; \
    sed -e '$a vm.max_map_count=655360' \
        -i.bak \
        /etc/sysctl.conf; \
    sed -e '/^* soft nofile/d' \
        -e '/^* hard nofile/d' \
        -e '/^elasticsearch soft nofile/d' \
        -e '/^elasticsearch hard nofile/d' \
        -e '/^* soft memlock/d' \
        -e '/^* hard memlock/d' \
        -e '/^elasticsearch soft memlock/d' \
        -e '/^elasticsearch hard memlock/d' \
        -i.bak \
        /etc/security/limits.conf; \
    sed -e '$a * soft nofile 655350' \
        -e '$a * hard nofile 655350' \
        -e '$a elasticsearch soft nofile 655350' \
        -e '$a elasticsearch hard nofile 655350' \
        -e '$a * soft memlock unlimited' \
        -e '$a * hard memlock unlimited' \
        -e '$a elasticsearch soft memlock unlimited' \
        -e '$a elasticsearch hard memlock unlimited' \
        -i.bak \
        /etc/security/limits.conf; \
    swapoff -a;           

使所有修改生效 reboot

  1. 指令 sysctl -p 可以使 sysctl.conf 的配置生效
  2. 重新開機 reboot 或者重新登陸 Ctrl + D 可以使 limits.conf 中的配置生效

建立 ES 所用賬号并切換 useradd -m elasticsearch; su elasticsearch;

配置流程(詳解版)

調整機器中每個程序可以擁有的 VMA(虛拟記憶體區域)的數量

  1. 修改檔案:/etc/sysctl.conf
  2. 添加/修改一行:vm.max_map_count=655360
  3. 否則可能會遇到報錯:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

調整機器中每個程序可打開的檔案句柄數量

  1. 修改檔案:/etc/security/limits.conf
  2. 添加/修改兩組:(* 作用于所有使用者,主要用于伺服器直接部署 ES;elasticsearch作用于 elasticsearch 使用者,蛀牙用于伺服器 rpm 包部署)
    • soft nofile 65535 => * soft nofile 655350
    • hard nofile 65535 => * hard nofile 655350
  • elasticsearch soft nofile 65535 => elasticsearch soft nofile 655350
  • elasticsearch hard nofile 65535 => elasticsearch hard nofile 655350
    • 否則可能遇到報錯:max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]

開啟記憶體鎖定配置

  1. 添加/修改兩組:
    • soft memlock 65535 => * soft memlock unlimited
    • hard memlock 65535 => * hard memlock unlimited
  • elasticsearch soft memlock 65535 => elasticsearch soft memlock unlimited
  • elasticsearch hard memlock 65535 => elasticsearch hard memlock unlimited
    • 否則可能在開啟了記憶體鎖定時(bootstrap.memory_lock: true)遇到報錯:memory locking requested for elasticsearch process but memory is not locked

關閉記憶體交換區

$. swapoff -a
           

建立 ES 使用賬号

  1. ES 在啟動時預設不允許使用 root 賬戶,是以需要預先建立 ES 自己的賬戶
  • useradd -m elasticsearch

然後通過指令切換到 elasticsearch 賬戶中進行後續操作

  1. su elasticsearch

本節對 ES 節點/叢集部署所需環境參數及其意義進行了闡述,同時提供了最簡初始化腳本和完整版初始化流程供參考。

安裝實戰

本節将對幾個主流的 ES 安裝部署的方式進行闡述,并會對節點的安裝、部署、啟動、停機等流程進行較長的描述。

tar 包安裝

下載下傳連結(後面以 ES_DOWNLOAD_URL 指代):

  1. https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz

下載下傳并解壓:

  1. mkdir -p /usr/local/elasticsearch
  2. cd /usr/local/elasticsearch
  3. wget -c ${ES_DOWNLOAD_URL}
  4. tar vxf elasticsearch-7.10.0-linux-x86_64.tar.gz

解壓出來的檔案:

[elasticsearch@esteam7001 elasticsearch]# ls -ltr elasticsearch-7.10.0
    總用量 584
    -rw-r--r--  1 elasticsearch elasticsearch   7313 11月 10 05:28 README.asciidoc -> 項目說明文檔
    -rw-r--r--  1 elasticsearch elasticsearch  13675 11月 10 05:28 LICENSE.txt -> 協定
    drwxr-xr-x  2 elasticsearch elasticsearch   4096 11月 10 05:32 plugins -> 插件檔案夾,目前為空,自定義插件會放置在這裡
    drwxr-xr-x  2 elasticsearch elasticsearch   4096 11月 10 05:32 logs -> 日志檔案夾
    -rw-r--r--  1 elasticsearch elasticsearch 544318 11月 10 05:32 NOTICE.txt -> 一些協定的說明以及違反後果的警告
    drwxr-xr-x  3 elasticsearch elasticsearch   4096 11月 10 05:34 lib -> 基礎依賴庫
    drwxr-xr-x  2 elasticsearch elasticsearch   4096 11月 10 05:34 bin -> ES内置的指令行工具,包括啟動、密碼生成等
    drwxr-xr-x  9 elasticsearch elasticsearch   4096 11月 10 05:34 jdk -> ES自帶的jdk
    drwxr-xr-x 53 elasticsearch elasticsearch   4096 11月 10 05:34 modules -> ES内置的各種功能子產品,包括Xpack等
    drwxr-xr-x  3 elasticsearch elasticsearch   4096 4月  15 19:02 config -> ES的配置目錄           

最簡啟動

  1. 确認自己處于 非 root 使用者,否則後續啟動會報錯
  2. cd elasticsearch-7.10.0
  3. ./bin/elasticsearch
  4. 如果要背景啟動,隻需在啟動指令後面加上 -d
  • ./bin/elasticsearch -d
  • 完整路徑 ./usr/local/elasticsearch/elasticsearch-7.10.0/bin/elasticsearch -d
  1. 在出現類似這些日志的時候,代表節點啟動完成
[2021-04-15T19:57:24,720][INFO ][o.e.c.c.CoordinationState] [esteam7002] cluster UUID set to [rZ5dFfDWTTO3AUimscISOg] -> 聲明叢集ID
[2021-04-15T19:57:24,931][INFO ][o.e.c.s.ClusterApplierService] [esteam7002] master node changed {previous [], current [{esteam7002}{FBzZRCUQR1K0o8JEVpyfqg}{ikWQPL1TSAav5SSA0eqyZg}{127.0.0.1}{127.0.0.1:9300}{cdhilmrstw}{ml.machine_memory=1927176192, xpack.installed=true, transform.node=true, ml.max_open_jobs=20}]}, term: 1, version: 1, reason: Publication{term=1, version=1}
[2021-04-15T19:57:25,059][INFO ][o.e.h.AbstractHttpServerTransport] [esteam7002] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200} -> 開始監聽目前位址+端口
[2021-04-15T19:57:25,059][INFO ][o.e.n.Node               ] [esteam7002] started -> 節點啟動完成           

ES 啟動狀态校驗

  1. You Know, for Search
[root@esteam7002 ~]# curl localhost:9200
{
    "name" : "esteam7002",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "rZ5dFfDWTTO3AUimscISOg",
    "version" : {
        "number" : "7.10.0",
        "build_flavor" : "default",
        "build_type" : "tar",
        "build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96",
        "build_date" : "2020-11-09T21:30:33.964949Z",
        "build_snapshot" : false,
        "lucene_version" : "8.7.0",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
    },
    "tagline" : "You Know, for Search"
}           

叢集狀态

[root@esteam7002 ~]# curl localhost:9200/_cat/health
1618488038 12:00:38 elasticsearch green 1 1 0 0 0 0 0 0 - 100.0%           

節點停機

  1. ps -ef | grep elasticsearch | grep -v grep | awk '{ print$2 }' | xargs kill -15
  2. 沒有背景啟動的話,直接 ctrl + c 會輸出類似以下的日志
[2021-04-15T20:05:47,962][INFO ][o.e.x.m.p.NativeController] [esteam7002] Native controller process has stopped - no new native processes can be started
[2021-04-15T20:05:47,964][INFO ][o.e.n.Node               ] [esteam7002] stopping ...
[2021-04-15T20:05:47,968][INFO ][o.e.x.w.WatcherService   ] [esteam7002] stopping watch service, reason [shutdown initiated]
[2021-04-15T20:05:47,969][INFO ][o.e.x.w.WatcherLifeCycleService] [esteam7002] watcher has stopped and shutdown
[2021-04-15T20:05:48,218][INFO ][o.e.n.Node               ] [esteam7002] stopped
[2021-04-15T20:05:48,218][INFO ][o.e.n.Node               ] [esteam7002] closing ...
[2021-04-15T20:05:48,234][INFO ][o.e.n.Node               ] [esteam7002] closed           

rpm 包安裝

  1. https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-x86_64.rpm

下載下傳并安裝:

  1. 切換到 root 賬戶(否則無法進行安裝)sudo -i
  2. rpm -ivh elasticsearch-7.10.0-x86_64.rpm

安裝成功日志

  1. 日志會根據目前作業系統的語言而顯示不同的語言提示,本示例系統為中文
[root@esteam7002 elasticsearch]# rpm -ivh elasticsearch-7.10.0-x86_64.rpm
警告:elasticsearch-7.10.0-x86_64.rpm: 頭V4 RSA/SHA512 Signature, 密鑰 ID d88e42b4: NOKEY
準備中...                          ################################# [100%]
正在更新/安裝...
1:elasticsearch-0:7.10.0-1         ################################# [100%]
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
sudo systemctl start elasticsearch.service
Created elasticsearch keystore in /etc/elasticsearch/elasticsearch.keystore
           
  1. 确認自己處于 root 使用者,否則指令需要加 sudo 字首
  2. 通過指令 systemctl start elasticsearch 啟動
  3. 沒有報錯表明節點啟動完成
  1. 同上節
  1. 通過指令 systemctl stop elasticsearch 停止服務
  2. 沒有報錯表明節點停機完成

Docker 安裝

下載下傳對應鏡像

docker pull elasticsearch:7.10.1

(可選)如果目标機器無法上網,可以嘗試通過其他機器下載下傳并導入鏡像

  1. 在主控端下載下傳鏡像 docker pull elasticsearch:7.10.1
  2. 把鏡像導出為檔案 docker save -o elasticsearch-7.10.1-image.tar docker.io/elasticsearch:7.10.1
  3. 把導出的檔案拷貝到目标機器 scp elasticsearch-7.10.1-image.tar [email protected]:/tmp
  4. 登陸目标機器 ssh [email protected]
  5. 導入目标鏡像 docker load < elasticsearch-7.10.1-image.tar

鏡像校驗

docker images

[root@esteam7002 elasticsearch]# docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
docker.io/elasticsearch   7.10.1              558380375f1a        4 months ago        774 MB           

指令:

docker run -it \
   --rm \
   -p 9200:9200 \
   -p 9300:9300 \
   -e "discovery.type=single-node" \
   --name elasticsearch \
   elasticsearch:7.10.1 \
   bin/elasticsearch           

如果需要開啟包括禁止交換區、檔案句柄限制等設定:

  1. 記憶體鎖定:--ulimit memlock=-1:-1
  2. 打開檔案上限:--ulimit nofile=655350:655350
  3. 關閉交換區:-e "bootstrap.memory_lock=true"
  4. 背景運作:-d
  5. 完整指令:
docker run -it \
   -d \
   --rm \
   --ulimit memlock=-1:-1 \
   --ulimit nofile=655350:655350 \
   -e "bootstrap.memory_lock=true" \
   -p 9200:9200 \
   -p 9300:9300 \
   -e "discovery.type=single-node" \
   --name elasticsearch \
   elasticsearch:7.10.1 \
   bin/elasticsearch
           
  1. 通過指令檢視日志 docker logs -f elasticsearch
  2. 出現以下日志内容代表啟動成功
{"type": "server", "timestamp": "2021-04-19T09:58:55,399Z", "level": "INFO", "component": "o.e.n.Node", "cluster.name": "docker-cluster", "node.name": "adbdcd016771", "message": "initialized" } -> 節點初始化開始
{"type": "server", "timestamp": "2021-04-19T09:58:55,400Z", "level": "INFO", "component": "o.e.n.Node", "cluster.name": "docker-cluster", "node.name": "adbdcd016771", "message": "starting ..." }
{"type": "server", "timestamp": "2021-04-19T09:58:55,657Z", "level": "INFO", "component": "o.e.t.TransportService", "cluster.name": "docker-cluster", "node.name": "adbdcd016771", "message": "publish_address {172.17.0.2:9300}, bound_addresses {[::]:9300}" } -> 節點叢集内部資料傳輸接口開啟
{"type": "server", "timestamp": "2021-04-19T09:58:56,259Z", "level": "INFO", "component": "o.e.c.c.Coordinator", "cluster.name": "docker-cluster", "node.name": "adbdcd016771", "message": "setting initial configuration to VotingConfiguration{ScWOitRNSime0vB24lcmcA}" } -> 初始化投票配置
{"type": "server", "timestamp": "2021-04-19T09:58:56,605Z", "level": "INFO", "component": "o.e.c.s.MasterService", "cluster.name": "docker-cluster", "node.name": "adbdcd016771", "message": "elected-as-master ([1] nodes joined)[{adbdcd016771}{ScWOitRNSime0vB24lcmcA}{pKCm7iZTR3eihceRySdZvA}{172.17.0.2}{172.17.0.2:9300}{cdhilmrstw}{ml.machine_memory=1927176192, xpack.installed=true, transform.node=true, ml.max_open_jobs=20} elect leader, _BECOME_MASTER_TASK_, _FINISH_ELECTION_], term: 1, version: 1, delta: master node changed {previous [], current [{adbdcd016771}{ScWOitRNSime0vB24lcmcA}{pKCm7iZTR3eihceRySdZvA}{172.17.0.2}{172.17.0.2:9300}{cdhilmrstw}{ml.machine_memory=1927176192, xpack.installed=true, transform.node=true, ml.max_open_jobs=20}]}" } -> 同叢集節點發現
{"type": "server", "timestamp": "2021-04-19T09:58:56,838Z", "level": "INFO", "component": "o.e.c.c.CoordinationState", "cluster.name": "docker-cluster", "node.name": "adbdcd016771", "message": "cluster UUID set to [Of1IoqfaRMis216Bmgd5CQ]" } -> 叢集Id初始化
{"type": "server", "timestamp": "2021-04-19T09:58:56,940Z", "level": "INFO", "component": "o.e.c.s.ClusterApplierService", "cluster.name": "docker-cluster", "node.name": "adbdcd016771", "message": "master node changed {previous [], current [{adbdcd016771}{ScWOitRNSime0vB24lcmcA}{pKCm7iZTR3eihceRySdZvA}{172.17.0.2}{172.17.0.2:9300}{cdhilmrstw}{ml.machine_memory=1927176192, xpack.installed=true, transform.node=true, ml.max_open_jobs=20}]}, term: 1, version: 1, reason: Publication{term=1, version=1}" } -> 叢集選主完成
{"type": "server", "timestamp": "2021-04-19T09:58:57,039Z", "level": "INFO", "component": "o.e.h.AbstractHttpServerTransport", "cluster.name": "docker-cluster", "node.name": "adbdcd016771", "message": "publish_address {172.17.0.2:9200}, bound_addresses {[::]:9200}", "cluster.uuid": "Of1IoqfaRMis216Bmgd5CQ", "node.id": "ScWOitRNSime0vB24lcmcA"  } -> 節點restful監聽接口開啟
{"type": "server", "timestamp": "2021-04-19T09:58:57,040Z", "level": "INFO", "component": "o.e.n.Node", "cluster.name": "docker-cluster", "node.name": "adbdcd016771", "message": "started", "cluster.uuid": "Of1IoqfaRMis216Bmgd5CQ", "node.id": "ScWOitRNSime0vB24lcmcA"  } -> 節點初始完成
           

ES啟動狀态校驗

同上

通過指令 docker ps -as 找到對應的 docker container

[root@esteam7002 elasticsearch]# docker ps -as
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                                            NAMES               SIZE
adbdcd016771        elasticsearch:7.10.1   "/tini -- /usr/loc..."   2 hours ago         Up 2 hours          0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch       132 kB (virtual 774 MB)           

關掉對應的 container

docker stop elasticsearch

[root@esteam7002 elasticsearch]# docker stop elasticsearch
elasticsearch           

Docker-compose 安裝

  1. 下載下傳鏡像、校驗等同 docker 安裝 小結,本節略
  2. 建立配置檔案 vi docker-compose.yml
# 聲明docker-compose版本,Mac等環境可以使用3,但是在一些Linux環境中隻支援到2
version: "2.2"

# 聲明節點使用的網絡空間
networks:
   bigdata:
      driver: bridge

# 聲明節點使用的,從主控端挂載進去的資料目錄
volumes:
   es-data-01:
      driver: local

# 聲明ES節點
services:
   # docker container
   es-node-01:
      # 使用的鏡像及版本
      image: elasticsearch:7.10.1
      # container 是否自動重新開機
      restart: always
      # container 名稱
      container_name: es-node-01
      # 環境參數
      environment:
         - node.name=es-node-01
         - cluster.name=docker-cluster
         - cluster.initial_master_nodes=es-node-01
         - discovery.seed_hosts=es-node-01
         - bootstrap.memory_lock=true
         - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      # 系統級别限制屬性
      ulimits:
         memlock:
            soft: -1
            hard: -1
      # 主控端挂載到container裡的目錄
      volumes:
         - es-data-01:/usr/share/elasticsearch/data
      # 開放端口映射
      ports:
         - 9200:9200
         - 9300:9300
      # 使用docker網絡名稱
      networks:
         - bigdata
           

docker-compose up --build(如果要背景運作可以加參數 -d,如果目錄裡有多個配置檔案可以通過 -f 參數指定目标配置檔案)

  1. 背景運作指令:docker-compose up -d --build
  2. 指定配置檔案指令:docker-compose -f docker-compose.yml up -d --build

輸出以下日志代表啟動成功

[root@esteam7002 elasticsearch]# docker-compose up --build
Creating network "elasticsearch_default" with the default driver -> 初次啟動建立專用網絡
Creating volume "elasticsearch_data01" with local driver -> 初次啟動建立專用存儲
Creating es-node-01 ... done -> 建立ES節點
Attaching to es-node-01
es-node-01    | {"type": "server", "timestamp": "2021-04-19T13:28:05,581Z", "level": "INFO", "component": "o.e.n.Node", "cluster.name": "es-docker-cluster", "node.name": "es-node-01", "message": "version[7.10.1], pid[6], build[default/docker/1c34507e66d7db1211f66f3513706fdf548736aa/2020-12-05T01:00:33.671820Z], OS[Linux/3.10.0-1160.24.1.el7.x86_64/amd64], JVM[AdoptOpenJDK/OpenJDK 64-Bit Server VM/15.0.1/15.0.1+9]" } -> 節點啟動系統環境資訊
es-node-01    | {"type": "server", "timestamp": "2021-04-19T13:28:05,584Z", "level": "INFO", "component": "o.e.n.Node", "cluster.name": "es-docker-cluster", "node.name": "es-node-01", "message": "JVM home [/usr/share/elasticsearch/jdk], using bundled JDK [true]" } -> 節點JVM使用資訊

…… 中間省略

es-node-01    | {"type": "server", "timestamp": "2021-04-19T13:29:15,770Z", "level": "INFO", "component": "o.e.n.Node", "cluster.name": "es-docker-cluster", "node.name": "es-node-01", "message": "initialized" } -> 節點資訊初始化
es-node-01    | {"type": "server", "timestamp": "2021-04-19T13:29:15,773Z", "level": "INFO", "component": "o.e.n.Node", "cluster.name": "es-docker-cluster", "node.name": "es-node-01", "message": "starting ..." } -> 節點啟動開始
es-node-01    | {"type": "server", "timestamp": "2021-04-19T13:29:15,949Z", "level": "INFO", "component": "o.e.t.TransportService", "cluster.name": "es-docker-cluster", "node.name": "es-node-01", "message": "publish_address {172.18.0.2:9300}, bound_addresses {[::]:9300}" } -> 節點叢集内部資料傳輸接口開啟
es-node-01    | {"type": "server", "timestamp": "2021-04-19T13:29:16,441Z", "level": "INFO", "component": "o.e.c.c.Coordinator", "cluster.name": "es-docker-cluster", "node.name": "es-node-01", "message": "setting initial configuration to VotingConfiguration{s-6A5vqlQuKoZlyn-TKdnA}" } -> 初始化投票配置
es-node-01    | {"type": "server", "timestamp": "2021-04-19T13:29:16,834Z", "level": "INFO", "component": "o.e.c.s.MasterService", "cluster.name": "es-docker-cluster", "node.name": "es-node-01", "message": "elected-as-master ([1] nodes joined)[{es-node-01}{s-6A5vqlQuKoZlyn-TKdnA}{HD5TOEsDTUGWPFoR1pYUDg}{172.18.0.2}{172.18.0.2:9300}{cdhilmrstw}{ml.machine_memory=1927176192, xpack.installed=true, transform.node=true, ml.max_open_jobs=20} elect leader, _BECOME_MASTER_TASK_, _FINISH_ELECTION_], term: 1, version: 1, delta: master node changed {previous [], current [{es-node-01}{s-6A5vqlQuKoZlyn-TKdnA}{HD5TOEsDTUGWPFoR1pYUDg}{172.18.0.2}{172.18.0.2:9300}{cdhilmrstw}{ml.machine_memory=1927176192, xpack.installed=true, transform.node=true, ml.max_open_jobs=20}]}" } -> 同叢集發現節點資訊
es-node-01    | {"type": "server", "timestamp": "2021-04-19T13:29:17,047Z", "level": "INFO", "component": "o.e.c.c.CoordinationState", "cluster.name": "es-docker-cluster", "node.name": "es-node-01", "message": "cluster UUID set to [QDGTOlDiTm-9JkJrpg9q2Q]" } -> 叢集id初始化
es-node-01    | {"type": "server", "timestamp": "2021-04-19T13:29:17,241Z", "level": "INFO", "component": "o.e.c.s.ClusterApplierService", "cluster.name": "es-docker-cluster", "node.name": "es-node-01", "message": "master node changed {previous [], current [{es-node-01}{s-6A5vqlQuKoZlyn-TKdnA}{HD5TOEsDTUGWPFoR1pYUDg}{172.18.0.2}{172.18.0.2:9300}{cdhilmrstw}{ml.machine_memory=1927176192, xpack.installed=true, transform.node=true, ml.max_open_jobs=20}]}, term: 1, version: 1, reason: Publication{term=1, version=1}" } -> 叢集選主完成
es-node-01    | {"type": "server", "timestamp": "2021-04-19T13:29:17,315Z", "level": "INFO", "component": "o.e.h.AbstractHttpServerTransport", "cluster.name": "es-docker-cluster", "node.name": "es-node-01", "message": "publish_address {172.18.0.2:9200}, bound_addresses {[::]:9200}", "cluster.uuid": "QDGTOlDiTm-9JkJrpg9q2Q", "node.id": "s-6A5vqlQuKoZlyn-TKdnA"  } -> 節點restful監聽接口開啟
es-node-01    | {"type": "server", "timestamp": "2021-04-19T13:29:17,316Z", "level": "INFO", "component": "o.e.n.Node", "cluster.name": "es-docker-cluster", "node.name": "es-node-01", "message": "started", "cluster.uuid": "QDGTOlDiTm-9JkJrpg9q2Q", "node.id": "s-6A5vqlQuKoZlyn-TKdnA"  } -> 節點啟動完成
           
  1. docker-compose down(docker-compose -f docker-compose.yml down)
  2. 當出現以下日志表明節點停機成功
[root@esteam7002 elasticsearch]# docker-compose -f docker-compose.yml down
Stopping es-node-01 ... done
Removing es-node-01 ... done
Removing network elasticsearch_default           

MacOS 環境

MacOS 系統其實是一個類 Unix 系統,是以大部分的指令、環境屬性等都和 Unix 系統類似。

tar 包安裝和上文提到的,在 Linux 系統中基于 tar 包安裝的過程大緻一樣。

  1. 需要注意的是,MacOS 作為一個較為特殊的作業系統,也會有一個專門針對 MacOS 系統編譯出來的安裝包
  2. 路徑上的主要差別為 Linux 系統的安裝包被标記了 linux,MacOS 的安裝包被标記了 darwin
  3. https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-darwin-x86_64.tar.gz

brew 安裝

通過指令 brew tap elastic/tap 将 Elastic 原廠的倉庫位址加入 homebrew 的配置

brew tap elastic/tap
Updating Homebrew...
==> Tapping elastic/tap
Cloning into '/usr/local/Homebrew/Library/Taps/elastic/homebrew-tap'...
remote: Enumerating objects: 890, done.
remote: Counting objects: 100% (131/131), done.
remote: Compressing objects: 100% (104/104), done.
remote: Total 890 (delta 80), reused 57 (delta 26), pack-reused 759
Receiving objects: 100% (890/890), 206.46 KiB | 310.00 KiB/s, done.
Resolving deltas: 100% (666/666), done.
Tapped 17 formulae (51 files, 327.7KB).
           

通過指令

brew install elastic/tap/elasticsearch-full

進行安裝

➜ ~ brew install elastic/tap/elasticsearch-full
==> Installing elasticsearch-full from elastic/tap
==> Downloading https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.1-darwin-x86_64.tar.gz?tap=elas
######################################################################## 100.0%
Warning: Tried to install empty array to /usr/local/etc/elasticsearch/jvm.options.d
==> codesign -f -s - /usr/local/Cellar/elasticsearch-full/7.12.1/libexec/modules/x-pack-ml/platform/darwin-x86_64/contr
==> find /usr/local/Cellar/elasticsearch-full/7.12.1/libexec/jdk.app/Contents/Home/bin -type f -exec codesign -f -s - {
==> Caveats
Data:    /usr/local/var/lib/elasticsearch/elasticsearch_chenchen/ -> 資料目錄
Logs:    /usr/local/var/log/elasticsearch/elasticsearch_chenchen.log -> 普通日志檔案
Plugins: /usr/local/var/elasticsearch/plugins/ -> 插件目錄
Config:  /usr/local/etc/elasticsearch/ -> 配置檔案目錄

To have launchd start elastic/tap/elasticsearch-full now and restart at login:
brew services start elastic/tap/elasticsearch-full
Or, if you don't want/need a background service you can just run:
elasticsearch
==> Summary
🍺  /usr/local/Cellar/elasticsearch-full/7.12.1: 961 files, 503MB, built in 9 seconds
           

主要檔案路徑,也可以通過指令 brew info elasticsearch-full 檢視(内容和安裝日志類似)

➜ ~ brew info elasticsearch-full
elastic/tap/elasticsearch-full: stable 7.12.1
Distributed search & analytics engine
https://www.elastic.co/products/elasticsearch
Conflicts with:
elasticsearch
/usr/local/Cellar/elasticsearch-full/7.12.1 (960 files, 503MB) *
Built from source on 2021-05-14 at 23:45:38
From: https://github.com/elastic/homebrew-tap/blob/HEAD/Formula/elasticsearch-full.rb
==> Caveats
Data:    /usr/local/var/lib/elasticsearch/elasticsearch_chenchen/
Logs:    /usr/local/var/log/elasticsearch/elasticsearch_chenchen.log
Plugins: /usr/local/var/elasticsearch/plugins/
Config:  /usr/local/etc/elasticsearch/

To have launchd start elastic/tap/elasticsearch-full now and restart at login:
brew services start elastic/tap/elasticsearch-full
Or, if you don't want/need a background service you can just run:
elasticsearch
           

注意,通過正常方式安裝 brew install elasticsearch 會安裝 7.10.2,通過指令 brew info elasticsearch 也可以得到相應的資訊,但是這個版本的 ES 存在一些啟動上的問題

是以還是建議通過原廠建議的 brew info elasticsearch-full 指令進行安裝和測試,目前通過這個指令會安裝 7.12 版本,和本文中其它的版本不太一緻

這些路徑可能會因為系統的不同而有些許不同,也可能會有 /Users/steven/working/sourcecode/homebrew/etc/elasticsearch/ 格式的情況

服務啟動

  • 直接前台啟動指令 elasticsearch
  • 背景啟動并随系統啟動 brew services start elasticsearch

節點狀态校驗

服務停機

  • 前台啟動時直接退出目前 terminal 視窗或者 control + c 結束程序
  • 背景啟動時通過指令 brew services stop elasticsearch

服務解除安裝(删除)

  • brew uninstall elasticsearch-full

Windows 環境

Windows 的作業系統相對自成體系,是以在 Windows 平台中的安裝可能會有些許不同。

zip 包安裝

不同于 linux 系統,Windows 系統用 zip 包進行壓縮包安裝

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-windows-x86_64.zip

主要的安裝流程和 tar 包 安裝類似,隻是需要運作的是 $ES_HOME\bin\elasticsearch.bat 檔案而非 linux 系統中的 $ES_HOME/bin/elasticsearch

如果要在啟動指令中添加參數(如指定節點名等),需要通過 cmd 工具或者其它的指令行工具進行操作

cd $ES_HOME\bin\
.\bin\elasticsearch.bat -Enode.name=my_node           

msi 包安裝

Windows 平台有自己的自引導安裝包格式 msi 包(類似于前文的 rpm包),可以将 ES 安裝成 Windows 的系統服務

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2.msi

msi 包安裝是有 GUI 界面的,隻需要輕按兩下打開并一步步進行配置就好,本文不再贅述,需注意以下幾點:

不做修改的話,ES 的主要目錄(data、config、log等)都會放在 %ALLUSERSPROFILE%\Elastic\Elasticsearch\ 目錄下(多半是在 C:\),當 C:\ 盤是系統安裝盤又沒有非常大空間的時候,建議将 ES 的安裝路徑換到其它盤符下

安裝過程中會有包括節點/叢集資訊、開放端口、記憶體使用等設定,配置思路和基于 linux 系統的一緻

安裝為系統級服務時,需要在安裝時開啟相應的指令參數

  • INSTALLASSERVICE:安裝為系統服務
  • STARTAFTERINSTALL:安裝後啟動
  • STARTWHENWINDOWSSTARTS:随系統啟動而啟動
  • 完整指令:start /wait msiexec.exe /i elasticsearch-7.10.2.msi /qn INSTALLASSERVICE=true STARTAFTERINSTALL=true STARTWHENWINDOWSSTARTS=true
  • 安裝完之後即可在系統服務中開啟/關閉 ES 了

開發模式 VS 生産模式

本節中的 ES 是最簡安裝、啟動,是以是以單節點(single-node)的方式啟動。單節點啟動預設是開發模式,會忽略絕大部分的啟動校驗。在不确定生産模式的強制校驗項有哪些時,建議所有的部署節點的初始化流程都按上文中的配置流程逐一進行配置。

生産模式啟動強制校驗項:

配置檔案 說明 配置項 預設值 期望值
conf/jvm.options 最大/小堆記憶體 -Xmx -Xms -Xmx1g -Xms1g 部署節點可用記憶體的一半
elasticsearch.yml 記憶體鎖定 bootstrap.memory_lock NA true
/etc/sysctl.conf 虛拟記憶體區域 vm.max_map_count 65530 > 262144
/etc/security/limits.conf 檔案可打開句柄 soft/hard nofile 65536 655350
soft/hard memlock unlimited
虛拟記憶體 soft/hard as
最大程序數 soft/hard nproc 10240
最大檔案空間 soft/hard fsize

本節列舉了通過多種方式對 ES 節點進行最簡安裝、部署、停機等操作,希望讀者可以找到适合自己的方式進行操作。

叢集的組建

單個的 ES 節點可以支援普通的測試,但是對于生産的使用,特别是對資料安全性、可靠性、性能等次元有要求的使用中,應考慮使用 ES 叢集支援生産的使用。本節将根據安裝方式的不同,分别對叢集的組建配置等進行闡述。

叢集組建流程

ES 節點在啟動時,會根據叢集的資訊以及自己的身份(配置在 $ES_HOME/config/elasticsearch.yml 裡)嘗試加入叢集,其主要參數為。

  1. cluster.name 叢集名稱,節點會在同一網段中嘗試找到和自己同一個叢集的其他節點組建/加入現有叢集。
  2. node.name 節點自身的标記,叢集内唯一。
  3. node.master、node.data、node.ingest 節點身份,節點啟動時會根據這個參數來進行注冊。
  4. network.host 節點監聽 IP 位址,一般建議本機 IP。
  5. http.port 節點監聽端口,預設9200
    • 不額外設定的話,叢集節點間通信的端口會預設為 9300
    • 也可以通過參數 transport.port 來特殊指定為其它的端口
  6. cluster.initial_master_nodes 叢集第一次初始化時的候選 master 節點清單。
  7. discovery.seed_hosts 叢集節點發現會嘗試通路的節點清單。
  8. ES 叢集在啟動/加入會根據節點的屬性(master、master-eligible、data……)進行選主和狀态同步,(注:叢集選主流程将在後續章節進行詳細闡述,本章隻進行簡要描述)
  • 叢集初始化的時候(7.x),master候選人(master)會嘗試通路同一網段中同一個叢集的所有節點。
  • 如果是新叢集啟動,配置在cluster.initial_master_nodes裡的節點會優先成為 master 候選節點。
  • 這些候選節點會發出投票及拉票請求給所有具有投票資格的節點(master、data、voting_only…)。
  • 在擷取足夠多的票數之後,master 節點當選,否則 master 候選節點會在等待一段時間之後重新發起投票。請注意,為了防止叢集腦裂的發生,這裡這裡建議在 cluster.initial_master_nodes 參數中設定奇數個(隻需1~3個節點,不一定需要所有 master 候選節點)即可。
  • master 會通過兩段送出的方式将叢集的資訊、組織架構、模闆等資訊釋出給叢集中的所有節點。
  • 當所有節點都成功同步叢集狀态之後,叢集啟動宣告完成。

tar 和 rpm 包安裝方式

登陸每個 ES 節點,并修改配置檔案并和其他節點組成叢集。

  • tar 包安裝的配置檔案 vi /usr/local/elasticsearch/config/elasticsearch.yml
  • rpm 包安裝的配置檔案 vi /etc/elasticsearch/elasticsearch.yml

這裡的 network.host 也可以配置為 _site_友善在節點批量初始化時進行配置。

# IP: 192.168.10.221
cluster.name: es-cluster
node.name: node-221
network.host: 192.168.10.221
http.port: 9200
discovery.seed_hosts: ["192.168.10.221", "192.168.10.222"]
cluster.initial_master_nodes: ["192.168.10.221"]           
# IP: 192.168.10.222
cluster.name: es-cluster
node.name: node-222
network.host: 192.168.10.222
http.port: 9200
discovery.seed_hosts: ["192.168.10.221", "192.168.10.222"]
cluster.initial_master_nodes: ["192.168.10.221"]
           

節點啟動

systemctl start elasticsearch

Docker 啟動的配置方式

純靠 docker run 指令方式啟動 ES 叢集會比較麻煩,建議通過 docker-compose 方式啟動。

示例 docker-compose.yml 檔案。

version: "2.2"

networks:
   bigdata:
      driver: bridge

volumes:
   es-data-01:
      driver: local
   es-data-02:
      driver: local

services:
   es-node-01:
      image: elasticsearch:7.10.1
      restart: always
      container_name: es-node-01
      environment:
         - node.name=es-node-01
         - cluster.name=docker-cluster
         - cluster.initial_master_nodes=es-node-01
         - discovery.seed_hosts=es-node-01,es-node-02
         - bootstrap.memory_lock=true
         - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      ulimits:
         memlock:
           soft: -1
           hard: -1
      volumes:
         - es-data-01:/usr/share/elasticsearch/data
      ports:
         - 9200:9200
         - 9300:9300
      networks:
         - bigdata

   es-node-02:
      image: elasticsearch:7.10.1
      restart: always
      container_name: es-node-02
      environment:
         - node.name=es-node-02
         - cluster.name=docker-cluster
         - cluster.initial_master_nodes=es-node-01
         - discovery.seed_hosts=es-node-01,es-node-02
         - bootstrap.memory_lock=true
         - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      ulimits:
         memlock:
           soft: -1
           hard: -1
      volumes:
         - es-data-02:/usr/share/elasticsearch/data
      networks:
         - bigdata
           

或者也可以在主控端維護每個節點自己的 elasticsearch.yml 檔案,并通過 -v $PATH/to/elasticsearch.yml:/usr/local/elasticsearch/config/elasticsearch.yml 的方式把這些配置檔案映射到 docker container 裡面進行使用。

這裡需要注意在一個主控端上,可以開放監聽同一個端口的 container 隻能有一個,是以如果需要整個叢集裡所有的節點都能監聽/支援通路的話,需要把他們的 9200/9300 端口映射成主控端裡不同的端口,或者在 docker 環境中啟動一個類似 NGINX 的網關來代理所有的節點。

本節對 ES 叢集組建流程進行了簡要描述,并列舉了通過多種方式對 ES 進行叢集化配置。

本節将針對 ES 節點安裝部署過程中經常遇到的一些問題進行分析,并提供一些簡單的解決方案以供參考。

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144],最大虛拟記憶體限制

ES 在運作時會強依賴虛拟記憶體,在達不到 ES 要求限制時,ES 節點啟動時會報錯并啟動失敗

修複方式:

  1. 在配置檔案 /etc/sysctl.conf 中添加一行 vm.max_map_count=655360
  2. 運作指令 sudo sysctl -p 使配置生效

max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536],最大可持有檔案句柄限制

ES 在運作時會開啟大量的線程(建立大量線程檔案),在達不到ES 要求限制時,ES 啟動時會報錯并啟動失敗

  1. 修改配置檔案 /etc/security/limits.conf
  2. 将 soft nofile 65535 和 hard nofile 65535 調大
  3. 如: soft nofile 655350 和 hard nofile 655350
  4. 如果使用rpm包安裝,則需要單獨對 elasticsearch 賬号進行授權,elasticsearch soft nofile 655350 和 elasticsearch hard nofile 655350

memory locking requested for elasticsearch process but memory is not locked,記憶體鎖定失敗

系統會預設關閉記憶體鎖定,但是為了 ES 的使用性能,我們一般建議開啟記憶體鎖定(bootstrap.memory_lock: true)

  1. 将 soft memlock 65535 和 hard memlock 65535 調大
  2. 如: soft memlock unlimited 和 hard memlock unlimited
  3. 如果使用rpm包安裝,則需要單獨對 elasticsearch 賬号進行授權,elasticsearch soft memlock unlimited 和 elasticsearch hard memlock unlimited

java.lang.RuntimeException: can not run elasticsearch as root,使用 root 賬号啟動

在預設情況下,ES 是禁止使用 root 使用者啟動的

  1. 切換成其他使用者進行啟動

Error: Unable to find a match: docker-compose,找不到 docker-compose 對應安裝包

可能 yum 倉庫中沒有最新安裝包資訊或者精簡版系統中沒有對應的軟體資訊

把源檔案中應用市場的位址替換成中科大

sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
         -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' \
         -i.bak \
         /etc/yum.repos.d/CentOS-Base.repo
           
  1. 先安裝 epel-release (拓展應用市場)
  2. 再進行後續安裝

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?docker 程序沒啟動

docker 安裝之後不會自動啟動,在未設定之前,伺服器重新開機之後 docker 多半也不會自動重新開機

  1. 啟動docker 程序 systemctl start docker
  2. 設定docker 随系統啟動 systemctl enable docker

Get

https://registry-1.docker.io/v2/

: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers),通路 docker 倉庫失敗

在某些節點中可能無法直接通路外網進行 docker 鏡像的下載下傳

  1. 開啟外網通路
  2. (或者)在其他能夠通路外網的節點中下載下傳對應鏡像 docker pull elasticsearch:7.10.1

Error response from daemon: manifest for elasticsearch:7.9.11 not found: manifest unknown: manifest unknown,找不到目标鏡像,可能在 docker 倉庫中找不到指定版本的鏡像,登陸鏡像倉庫搜尋合适版本(

http://dockerhub.com/

)(或者)通過指令搜尋合适的鏡像 docker search elasticsearch

ERROR: for es-node-01 Cannot start service es-node-01: driver failed programming external connectivity on endpoint es-node-01 (b483765a492a31517b047aae6e0b74c8c507851f7fd25850c87b504037262087): Bind for 0.0.0.0:9200 failed: port is already allocated

9200 端口已被占用,可能目前節點已經有其他服務綁定了9200 端口,或者在 docker-compose 檔案中設定了多個節點将9200端口映射到主控端上

通過 netstat -anp | grep 9200 指令尋找綁定9200 端口的程序

[root@esteam7002 elasticsearch-7.10.0]# netstat -anp | grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      2130/docker-proxy-c
[root@esteam7002 elasticsearch-7.10.0]# netstat -anp | grep 9200
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      2607/java
tcp6       0      0 ::1:9200                :::*                    LISTEN      2607/java
tcp6       0      0 ::1:45994               ::1:9200                TIME_WAIT   -
           

根據程序詳細資訊來決定是加入現有叢集、節點重新開機或更換其他端口 ps -ef | grep 2607

[root@esteam7002 elasticsearch-7.10.0]# ps -ef | grep 2607
elastic+  2607     1 29 17:08 pts/1    00:00:26 /usr/local/elasticsearch/elasticsearch-7.10.0/jdk/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -XX:+ShowCodeDetailsInExceptionMessages -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dio.netty.allocator.numDirectArenas=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.locale.providers=SPI,COMPAT -Xms512m -Xmx512m -XX:+UseG1GC -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -Djava.io.tmpdir=/tmp/elasticsearch-8284412088063757117 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m -XX:MaxDirectMemorySize=268435456 -Des.path.home=/usr/local/elasticsearch/elasticsearch-7.10.0 -Des.path.conf=/usr/local/elasticsearch/elasticsearch-7.10.0/config -Des.distribution.flavor=default -Des.distribution.type=tar -Des.bundled_jdk=true -cp /usr/local/elasticsearch/elasticsearch-7.10.0/lib/* org.elasticsearch.bootstrap.Elasticsearch -d
elastic+  2626  2607  0 17:08 pts/1    00:00:00 /usr/local/elasticsearch/elasticsearch-7.10.0/modules/x-pack-ml/platform/linux-x86_64/bin/controller
root      2688   703  0 17:10 pts/1    00:00:00 grep --color=auto 2607
           

ES 啟動卡住,或者進行到一半就停止

可能是系統可用記憶體過少或者配置的ES 最大/最小記憶體過大。ES 在啟動時會直接嘗試申請 config/jvm.options 中申請的記憶體空間

  1. 重新規劃每個服務/程式的記憶體使用
  2. 調整 ES 的記憶體

創作人簡介:

陳晨,十餘年 IT 老兵,從售前做到運維,從後端做到 HR 和獵頭,Hands on 過幾乎

IT 生命周期的整個過程,不說樣樣精通,隻希望能和不同崗位的同學盡可能站在一個

Baseline 上進行溝通和交流。希望能通過自己的一點努力,給更多的同學帶來一些積極

的影響,足矣。

部落格:

https://blog.csdn.net/weixin_40601534