镜像构建
首先需要根据实际情况来构建镜像,如果不需要安装插件或做其他调整可以略过此步骤。
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
服务。
集群创建有以下几个注意事项:
- 单节点内存最好大于
4G
。 JVM
内存建议设置为总内存的一半,比如容器内存是32G
,那JVM
就设置为16G
,并且JVM
的最大最小内存设置为一样的。- 启动
ES
服务时,直接使用 环境变量设置JVM
即可,比如:ES_JAVA_OPTS:-Xms16g -Xmx16g
。 - 单节点
JVM
内存不要超过30G
,30G
以后性能不会再提升反而会下降。 - 集群节点端口暴露时记得
9200
暴露出来。如果不暴露9300
端口,集群内部都不能互相访问的话,9300
端口也需要暴露 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" # 刷新间隔时间。
}
}
'