安装 Elasticsearch (本地及 Docker)-Elastic Stack 实战手册-阿里云开发者社区

开发者社区> Elasticsearch 技术团队> 正文
登录阅读全文

安装 Elasticsearch (本地及 Docker)-Elastic Stack 实战手册

简介: 本章介绍 Elasticsearch (简称 ES )的安装和部署

970X90.png

· 更多精彩内容,请下载阅读全本《Elastic Stack实战手册》

· 加入创作人行列,一起交流碰撞,参与技术圈年度盛事吧

创作人:陈晨
审稿人:刘帅

本章介绍 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. 修改文件:/etc/security/limits.conf
  2. 添加/修改两组:
    • 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 包安装

下载链接(后面以 ES_DOWNLOAD_URL 指代):

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

下载并安装:

  1. 切换到 root 账户(否则无法进行安装)sudo -i
  2. mkdir -p /usr/local/elasticsearch
  3. cd /usr/local/elasticsearch
  4. wget -c ${ES_DOWNLOAD_URL}
  5. 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. 没有报错表明节点启动完成

ES 启动状态校验

  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 root@192.168.10.221:/tmp
  4. 登陆目标机器 ssh root@192.168.10.221
  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"  } -> 节点启动完成

ES 启动状态校验

同上

节点停机

  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_lockNAtrue
/etc/sysctl.conf虚拟内存区域vm.max_map_count65530> 262144
/etc/security/limits.conf文件可打开句柄soft/hard nofile65536655350
/etc/security/limits.conf内存锁定soft/hard memlockNAunlimited
/etc/security/limits.conf虚拟内存soft/hard asNAunlimited
/etc/security/limits.conf最大进程数soft/hard nprocNA10240
/etc/security/limits.conf最大文件空间soft/hard fsizeNAunlimited

小结

本节列举了通过多种方式对 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. 修改配置文件 /etc/security/limits.conf
  2. soft memlock 65535 和 hard memlock 65535 调大
  3. 如: soft memlock unlimited 和 hard memlock unlimited
  4. 如果使用rpm包安装,则需要单独对 elasticsearch 账号进行授权,elasticsearch soft memlock unlimited 和 elasticsearch hard memlock unlimited

java.lang.RuntimeException: can not run elasticsearch as root,使用 root 账号启动

在默认情况下,ES 是禁止使用 root 用户启动的

修复方式:

  1. 切换成其他用户进行启动
  2. su elasticsearch

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
  3. 把镜像导出为文件 docker save -o elasticsearch-7.10.1-image.tar docker.io/elasticsearch:7.10.1
  4. 把导出的文件拷贝到目标机器 scp elasticsearch-7.10.1-image.tar root@192.168.10.221:/tmp
  5. 登陆目标机器 ssh root@192.168.10.221
  6. 导入目标镜像 docker load < elasticsearch-7.10.1-image.tar

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: