官方安装教程:https://www.elastic.co/guide/en/elasticsearch/reference/8.14/docker.html#_linux
调整vm.max_map_count
CentOS 7.9中,默认的vm.max_map_count值是65536。这个值表示一个进程可以拥有的虚拟内存区域(VMA, Virtual Memory Area)的最大数量。虚拟内存区域是连续的虚拟地址空间区域,在进程的生命周期中,每当程序尝试在内存中映射文件、链接到共享内存段或分配堆空间时,这些区域将被创建。
如何查看和修改vm.max_map_count值
- 查看当前值可以使用以下命令来查看当前的vm.max_map_count值:
sysctl -a | grep vm.max_map_count
- 临时修改如果需要临时修改vm.max_map_count值(重启后失效),可以使用以下命令:
sysctl -w vm.max_map_count=新值
例如,将vm.max_map_count设置为262144:
sysctl -w vm.max_map_count=262144
- 永久修改如果需要永久修改vm.max_map_count值,可以将新值添加到
/etc/sysctl.conf
文件的末尾,然后执行sysctl -p
命令使修改生效。例如:
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p
注意事项
- 调优vm.max_map_count值时需要谨慎,过高的值可能会导致资源浪费,而过低的值则可能限制进程的正常运行。
- 在进行任何系统级别的修改之前,建议备份相关配置文件和进行充分的测试。
- 对于Elasticsearch等需要大量内存映射区域的应用,可能需要增加vm.max_map_count的值以避免出现“max virtual memory areas vm.max_map_count too low”的错误。
以上信息基于CentOS 7.x的通用设置,对于CentOS 7.9版本同样适用。然而,具体的默认值可能会因系统更新或特定的系统配置而有所变化,因此建议通过实际查看系统配置来确认当前的vm.max_map_count值。
创建文件夹
创建相关文件夹,用于后续容器挂载
mkdir -p /mnt/data/elasticsearch/{data,config,plugins,logs}
创建配置文件,并写入必须配置
echo "network.host: 0.0.0.0" >> /mnt/data/elasticsearch/config/elasticsearch.yml
授权data和log文件夹
chmod -R g+rwx /mnt/data/elasticsearch/{data,logs}
chgrp -R 0 /mnt/data/elasticsearch/{data,logs}
chown R 1000:1000 /mnt/data/elasticsearch/logs
# 或者直接给777
chmod -R 777 /mnt/data/elasticsearch/
创建网络
为了后边kibana互联方便,创建一个网络:
docker network create es-net
相关指令
# 创建网络
docker network create es-net
# 查看本机的网络
docker network ls
# 删除一个网络
docker network rm es-net
拉取镜像
# 这里使用的8.14.3版本,官方镜像地址
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.14.3
启动容器
docker run --name tuhu_es \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-e ELASTIC_PASSWORD=123456 \
-e "xpack.security.http.ssl.enabled=false" \
-e "xpack.license.self_generated.type=basic" \
-v /mnt/data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mnt/data/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mnt/data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /mnt/data/elasticsearch/logs:/usr/share/elasticsearch/logs \
--restart=always \
-d docker.elastic.co/elasticsearch/elasticsearch:8.14.3
–network es-net 这表示容器将连接到名为“es-net”的Docker网络。这允许你与其他也在该网络上的容器进行通信。
-p 9200:9200 -p 9300:9300 这两个端口映射使得宿主机的9200和9300端口分别映射到容器的9200和9300端口。其中,9200是Elasticsearch的HTTP接口,而9300是用于节点间通信的TCP传输端口。
-e “discovery.type=single-node” 设置为单节点
-e ELASTIC_PASSWORD=123456 默认密码,用户名为elastic
-e “xpack.security.http.ssl.enabled=false” 关闭ssl验证
-e “xpack.license.self_generated.type=basic” 基础版本
特别注意:
-e ES_JAVA_OPTS=“-Xms512m -Xmx512m” 测试环境下,设置ES的初始内存和最大内存,否则可能导致过大启动不了ES,但官方最新版建议生产环境不加这个参数,es会根据服务器配置自动调整。
可能出现的问题
权限问题
Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]
output:
[0.001s][error][logging] Error opening log file 'logs/gc.log': Permission denied
[0.001s][error][logging] Initialization of output 'file=logs/gc.log' using options 'filecount=32,filesize=64m' failed.
error:
Invalid -Xlog option '-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,level,pid,tags:filecount=32,filesize=64m', see error log for details.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
at org.elasticsearch.server.cli.JvmOption.flagsFinal(JvmOption.java:120)
at org.elasticsearch.server.cli.JvmOption.findFinalOptions(JvmOption.java:87)
at org.elasticsearch.server.cli.MachineDependentHeap.determineHeapSettings(MachineDependentHeap.java:59)
at org.elasticsearch.server.cli.JvmOptionsParser.jvmOptions(JvmOptionsParser.java:141)
at org.elasticsearch.server.cli.JvmOptionsParser.determineJvmOptions(JvmOptionsParser.java:92)
at org.elasticsearch.server.cli.ServerCli.startServer(ServerCli.java:248)
at org.elasticsearch.server.cli.ServerCli.execute(ServerCli.java:100)
at org.elasticsearch.common.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:54)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:85)
at org.elasticsearch.cli.Command.main(Command.java:50)
at org.elasticsearch.launcher.CliToolLauncher.main(CliToolLauncher.java:64)
这里是因为挂载除了目录,但所有者创建者等权限问题导致无法启动,解决方法:
chmod -R 777 /mnt/data/elasticsearch/
直接777 算了,要不然就一点儿点儿根据情况调整权限。
内存不足
Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]
output:
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 33285996544 bytes. Error detail: committing reserved memory.
# An error report file with more information is saved as:
# logs/hs_err_pid53.log
error:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000001001000000, 33285996544, 0) failed; error='Not enough space' (errno=12)
at org.elasticsearch.server.cli.JvmOption.flagsFinal(JvmOption.java:120)
at org.elasticsearch.server.cli.JvmOption.findFinalOptions(JvmOption.java:87)
at org.elasticsearch.server.cli.JvmErgonomics.choose(JvmErgonomics.java:42)
at org.elasticsearch.server.cli.JvmOptionsParser.jvmOptions(JvmOptionsParser.java:142)
at org.elasticsearch.server.cli.JvmOptionsParser.determineJvmOptions(JvmOptionsParser.java:92)
at org.elasticsearch.server.cli.ServerCli.startServer(ServerCli.java:248)
at org.elasticsearch.server.cli.ServerCli.execute(ServerCli.java:100)
at org.elasticsearch.common.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:54)
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:85)
at org.elasticsearch.cli.Command.main(Command.java:50)
at org.elasticsearch.launcher.CliToolLauncher.main(CliToolLauncher.java:64)
服务器内存不足导致无法启动jvm,加上如下参数控制内存大小:
-e ES_JAVA_OPTS="-Xms512m -Xmx512m"
测试
启动成功后访问http://ip:9200/,输入用户名密码,显示如下页面
启动Kibana
设置kibana_system密码
创建一个用于启动kibana的用户:
# configure the Kibana password in the ES container
curl -u elastic:123456 \
-X POST \
http://localhost:9200/_security/user/kibana_system/_password \
-d '{"password":"'"123456"'"}' \
-H 'Content-Type: application/json'
创建挂载目录
创建挂载目录
mkdir /mnt/data/kibana
mkdir /mnt/data/kibana/{config,data}
授权data文件夹 chmod -R 777 /mnt/data/kibana/data
在config中创建配置文件 vim kibana.yml
,内容如下
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://es:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
# 设置为中文
i18n.locale: "zh-CN"
启动kibana容器
docker run指令,若未拉取过镜像,第一次会先拉取对应镜像
docker run -p 5601:5601 \
-d --name tuhu_kibana \
--network es-net \
-e ELASTICSEARCH_URL=http://es:9200 \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
-e ELASTICSEARCH_USERNAME=kibana_system \
-e ELASTICSEARCH_PASSWORD=123456 \
-e "xpack.security.enabled=false"\
-e "xpack.license.self_generated.type=basic" \
-v /mnt/data/kibana/config:/usr/share/kibana/config \
-v /mnt/data/kibana/data:/usr/share/kibana/data \
--restart=always \
docker.elastic.co/kibana/kibana:8.14.3
验证
打开http://ip:5601/ ,打开kibana输入用户名elastic,密码123456
安装分词插件
指令安装
进入es容器内执行:
bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/8.14.3
相关指令:
#查看已安装插件
bin/elasticsearch-plugin list
#安装插件
bin/elasticsearch-plugin install analysis-ik
#删除插件
bin/elasticsearch-plugin remove analysis-ik
离线安装
下载分词插件 https://release.infinilabs.com/analysis-ik/stable/
下载对应版本的插件后,得到 elasticsearch-analysis-ik-8.14.3.zip
将解压后的文件放入 /mnt/data/elasticsearch/plugins 目录,即docker挂载的插件目录,如下:
重启es docker restart es
验证分词器
#ES的默认分词设置是standard,会单字拆分
POST _analyze
{
"analyzer":"standard",
"text":"中华人民共和国"
}
#ik_smart:会做最粗粒度的拆分
POST _analyze
{
"analyzer": "ik_smart",
"text": "中华人民共和国"
}
#ik_max_word:会将文本做最细粒度的拆分
POST _analyze
{
"analyzer":"ik_max_word",
"text":"中华人民共和国"
}
es默认的分词器会单字拆分如下:
ik_smart:会做最粗粒度的拆分,如下
ik_max_word:会将文本做最细粒度的拆分,如下