Docker 部署 Elasticsearch 5.6.10 集群

Docker 部署 Elasticsearch 5.6.10 集群

Cocytus Elias 64 2023-02-28

镜像构建

首先需要根据实际情况来构建镜像,如果不需要安装插件或做其他调整可以略过此步骤。

ES 比较常用的分词插件 analysis-ik 需要在镜像构建过程中安装下,不然每次重启 ES 镜像都需要重装。

FROM docker.elastic.co/elasticsearch/elasticsearch:5.6.10

ENV VERSION=5.6.10
RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v${VERSION}/elasticsearch-analysis-ik-$VERSION.zip

CMD ["/bin/bash", "bin/es-docker"]
EXPOSE 9200 9300

直接 docker build --platform linux/amd64 --tag custom-elasticsearch:5.6.10 . 构建镜像。

集群配置

除了镜像构建之外,还需要集群配置。

# 配置 ES 的集群名称, ES 会自动发现在同一网段下的 ES ,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
cluster.name: test

# 节点名称。
node.name: master-test-1

# 该节点是否有资格被选举成为node。
node.master: true

# 该节点是否存储索引数据。
node.data: true

# ES是搜索引擎,会创建文档,建立索引,此路径是索引的存放目录。
# 如果我们的日志数据较为庞大,那么索引所占用的磁盘空间也是不可小觑的。
# 这个路径建议是专门的存储系统,如果不是存储系统,最好也要有冗余能力的磁盘。
# 此目录还要对elasticsearch的运行用户有写入权限。
# path可以指定多个存储位置,分散存储,有助于性能提升,以至于怎么分散存储请看详解https://www.dockerc.com/elk-theory-elasticsearch/。
path.data: /usr/share/elasticsearch/data

# 日志存放路径。
# elasticsearch专门的日志存储位置,生产环境中建议elasticsearch配置文件与elasticsearch日志分开存储。
path.logs: /usr/share/elasticsearch/logs

# 关闭内存锁定,提高性能。
# 在ES运行起来后锁定ES所能使用的堆内存大小,锁定内存大小一般为可用内存的一半左右;锁定内存后就不会使用交换分区。
# 如果不打开此项,当系统物理内存空间不足,ES将使用交换分区,ES如果使用交换分区,那么ES的性能将会变得很差。
bootstrap.memory_lock: false
bootstrap.system_call_filter: false

# ES api 服务启动地址,支持IPv4及IPv6,默认绑定127.0.0.1;es的HTTP端口和集群通信端口就会监听在此地址上。
network.host: 0.0.0.0

# ES http 端口,主要用于外部数据交互。
http.port: 9200

# ES tcp 端口,主要用户集群内部数据交互,默认是9300。
transport.tcp.port: 9300

# 集群中节点的地址列表,可以通过这些节点来自动发现新加入集群的节点。这里是五个节点的示例,不需要填写自己的地址。
discovery.zen.ping.unicast.hosts: ["ESHOST2","ESHOST3","ESHOST4","ESHOST5"]

# 集群内超时时间设定。
discovery.initial_state_timeout: 120s

discovery.zen.ping_timeout: 10s

discovery.zen.commit_timeout: 60s

discovery.zen.publish_timeout: 60s

# 为了避免脑裂,集群的最少节点数量为 /2+n,n >= 1,即可用节点必须至少比一半的节点数量大一个,建议集群配置为奇数节点。
discovery.zen.minimum_master_nodes: 3

# 集群内健康检测超时时间,默认是3秒。
discovery.zen.fd.ping_timeout: 60s

# 集群内健康检测异常最大次数,如果连续 6 次都无法成功建立链接,代表节点挂掉了,默认为3次。
discovery.zen.fd.ping_retries: 6

# 集群内心跳间隔时间,默认为1秒。
discovery.zen.fd.ping_interval: 15s

# 集群内同时启动的数据任务个数,默认是2个。
cluster.routing.allocation.cluster_concurrent_rebalance: 16

# 添加或删除节点及负载均衡时并发恢复的线程个数,默认4个。
cluster.routing.allocation.node_concurrent_recoveries: 16

# 初始化数据恢复时,并发恢复线程的个数,默认4个。
cluster.routing.allocation.node_initial_primaries_recoveries: 16

# xpack 设置。
# 关闭机器学习。
xpack.ml.enabled: false
# 关闭常规监控。
xpack.monitoring.enabled: false
# 关闭节点上的 Watcher。
xpack.watcher.enabled: false
# 关闭节点上的安全功能,如果对外暴露则建议开启。
xpack.security.enabled: false
# 禁用内置令牌服务。
xpack.security.http.ssl.enabled: false
# 禁用传输网络层上的 TLS/SSL。
xpack.security.transport.ssl.enabled: false

# 线程设置。
# 批量写入的线程数设置。
thread_pool.bulk.queue_size: 10000
# 索引建立的线程数设置。
thread_pool.index.queue_size: 1000

集群创建

镜像构建好并且写好配置文件后,可以直接启动 ES 服务。

集群创建有以下几个注意事项:

  1. 单节点内存最好大于 4G
  2. JVM 内存建议设置为总内存的一半,比如容器内存是 32G,那 JVM 就设置为 16G,并且 JVM 的最大最小内存设置为一样的。
  3. 启动 ES 服务时,直接使用 环境变量设置 JVM 即可,比如: ES_JAVA_OPTS:-Xms16g -Xmx16g
  4. 单节点 JVM 内存不要超过 30G30G 以后性能不会再提升反而会下降。
  5. 集群节点端口暴露时记得 9200 暴露出来。如果不暴露 9300 端口,集群内部都不能互相访问的话, 9300 端口也需要暴露
  6. CPU 和 内存 需要搭配好,CPU 决定读取数据的调优上限,内存 决定写入数据的调优上限。

索引模版

集群创建完成之后,就可以设置索引模版了,索引模版主要是方便统一定制索引,也可以用来在大数据量情况下提高写入性能,。集群节点只支持 http 进行设置,参考 Create or update index template API

示例如下:

curl -X PUT "localhost:9200/_template/common?pretty" -H 'Content-Type: application/json' -d'
{
  "template": "*", # 匹配的索引名称,只有索引名匹配上了,才会按此模版创建索引。* 代表所有所有都按照此规则。
  "settings": {
    "index.translog.durability" : "async", # 异步落地 Translog,但是不论是都设置,都会每sync_interval 时间,判断如果 flush_threshold_ops、flush_threshold_size、flush_threshold_period 就直接进行写入。
    "index.translog.sync_interval" : "60s", # 异步落地的间隔时间。
    "index.refresh_interval" : "60s" # 刷新间隔时间。
  }
}
'