部署 ES 8.11.4
创建目录 es
mkdir -p /mnt/es
mkdir -p /mnt/es/plugins
mkdir -p /mnt/es/data
mkdir -p /mnt/es/logs
mkdir -p /mnt/es/kib/data
创建 .env
文件
.env
文件内容如下
# Password for the 'elastic' user (at least 6 characters)
# 注意不要全数字
ELASTIC_PASSWORD=changeme
# Password for the 'kibana_system' user (at least 6 characters)
# 注意不要全数字,否则KIBANA可能验证出错
KIBANA_PASSWORD=changeme
# Version of Elastic products
STACK_VERSION=8.11.4
# Set the cluster name
CLUSTER_NAME=es-docker-cluster
# Set to 'basic' or 'trial' to automatically start the 30-day trial
LICENSE=basic
# Increase or decrease based on the available host memory (in bytes)
MEM_LIMIT=2g
# Project namespace (defaults to the current folder name if not set)
COMPOSE_PROJECT_NAME=es
创建 docker-compose.yml
文件
Docker Compose 版本 2.x
不采用 Swarm
模式,支持 mem_limit
限制内容
Docker Compose 版本 3.x
采用 Swarm
模式,需要将资源限制放在 deploy
部分,不采用 Swarm
模式,仍然支持 mem_limit
限制内容
参考示例
version: "3.8"
services:
elasticsearch:
image: elasticsearch:8.11.4
deploy:
resources:
limits:
memory: 2g
2.x 完整配置 示例
version: '2'
services:
elasticsearch:
image: elasticsearch:8.11.4
restart: always
container_name: es01
environment:
- node.name=es01
- cluster.name=${CLUSTER_NAME}
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- xpack.security.enabled=true
- xpack.security.authc.api_key.enabled=true
- xpack.security.transport.ssl.enabled=false
- xpack.security.http.ssl.enabled=false
- xpack.license.self_generated.type=${LICENSE}
- http.host=0.0.0.0
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es_data:/usr/share/elasticsearch/data
- es_logs:/usr/share/elasticsearch/logs
- es_plugins:/usr/share/elasticsearch/plugins
mem_limit: ${MEM_LIMIT}
ports:
- 9200:9200
networks:
- elastic
kibana:
image: kibana:8.11.4
container_name: kib01
depends_on:
- elasticsearch
environment:
- ELASTICSEARCH_HOSTS=http://es01:9200
- ELASTICSEARCH_USERNAME=kibana_system
- ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
- I18N_LOCALE=zh-CN
volumes:
- kib_data:/usr/share/kibana/data
ports:
- 5601:5601
networks:
- elastic
volumes:
es_data:
driver: local
driver_opts:
type: none
o: bind
device: /mnt/es/data
es_logs:
driver: local
driver_opts:
type: none
o: bind
device: /mnt/es/logs
es_plugins:
driver: local
driver_opts:
type: none
o: bind
device: /mnt/es/plugins
kib_data:
driver: local
driver_opts:
type: none
o: bind
device: /mnt/es/kib/data
networks:
elastic:
driver: bridge
运行
docker-compose up -d
验证
通过 内置用户 elastic
用户名+密码方式 先验证 集群
状态
curl --location 'http://localhost:9200/_cluster/health?pretty' \
--header 'Authorization: Basic xxxxx'
kibana_system
为内置账户,通过如下命令 查询基本信息
curl --location 'localhost:9200/_security/user/kibana_system' \
--header 'Authorization: Basic xxxxx='
kibana_system
为内置账户,没有默认密码,需要修改,否则 Kibana
无法使用
【1】如果你是第一次设置密码,可以使用如下工具:
bin/elasticsearch-setup-passwords interactive
【2】进入容器,通过命令修改密码
bin/elasticsearch-reset-password -u kibana_system
推荐【3】
【3】通过API修改密码
curl --location --request PUT 'localhost:9200/_security/user/kibana_system/_password' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic xxxxxx' \
--data '{
"password": "xxxxx"
}'
通过 Kibana
地址 localhost:5601
,先使用 高级用户 elastic
登录,后续可以创建用户、角色、API Key等;进行权限控制
停止
docker-compose down
中文分词
安装 IK中文分词 插件
网络安装
# 进入容器
docker exec -it es01 /bin/bash
# 安装 IK 分词器
bin/elasticsearch-plugin install https://github.com/infinilabs/analysis-ik/releases/download/v8.11.4/elasticsearch-analysis-ik-8.11.4.zip
离线安装
下载 IK 分词 到 es
目录
复制文件 到 容器的 tmp
目录
docker cp ./elasticsearch-analysis-ik-8.11.4.zip es01:/tmp/
进入容器并安装插件
# 进入容器
docker exec -it es01 /bin/bash
# 安装 IK 分词器
bin/elasticsearch-plugin install file:///tmp/elasticsearch-analysis-ik-8.11.4.zip
复制IK配置
由于 elasticsearch-plugin
方式安装IK插件,仅安装了Jar包,相关Config没有安装,需要Copy到相关目录,否则可能出现如下错误
Cannot invoke \"org.wltea.analyzer.dic.DictSegment.match(char[], int, int)\" because \"org.wltea.analyzer.dic.Dictionary.singleton._StopWords\" is null
sudo apt install unzip
unzip elasticsearch-analysis-ik-8.11.4.zip -d /mnt/es/plugins/analysis-ik
重启 ES
容器
docker restart es01
验证插件是否成功安装
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-plugin list
验证IK分词
curl --location 'localhost:9200/_analyze' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic xxxxxx' \
--data '{
"analyzer": "ik_max_word",
"text": "我是中国人"
}'
优化 ES
调整 JVM 内存
在 docker-compose.yml
中设置 ES_JAVA_OPTS
环境变量
environment:
- "ES_JAVA_OPTS=-Xms4g -Xmx4g"
增加线程池大小
可以在 elasticsearch.yml
文件中调整线程池设置,如 thread_pool.search.size
增加文件描述符限制
临时调整
# 查看 当前 shell 会话的资源限制
ulimit -a
# 设置用户可以打开的最大文件数
sudo ulimit -n 65536
永久生效
编辑 /etc/security/limits.conf
文件, 可以添加以下内容
其中,*
表示对 所有用户
生效,soft
表示 软限制
,hard
表示 硬限制
* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
调整内核参数
临时调整
# 查看 进程可拥有的最大内存映射区,默认值通常是 65530
sysctl vm.max_map_count
# 或者查看
# cat /proc/sys/vm/max_map_count
# 对于运行 Elasticsearch 等需要大量内存映射的应用程序,建议将其设置为至少 262144
sudo sysctl -w vm.max_map_count=262144
永久生效
可以将其添加到 /etc/sysctl.conf 文件中
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
关键配置描述
xpack.security.authc.api_key.enabled=true
Elasticsearch 的一个配置选项,用于启用 API Key
认证功能,避免在代码中硬编码用户名和密码
可以通过 Kibana 或者直接在 Elasticsearch 中使用 API 生成 API Key
curl -u elastic -X POST "localhost:9200/_security/api_key" -H "Content-Type: application/json" -d '{
"name": "my-api-key",
"expiration": "1d",
"role_descriptors": {
"my_custom_role": {
"cluster": ["all"],
"index": [
{
"names": ["*"],
"privileges": ["read"]
}
]
}
}
}'
生成的 API Key 可以在后续请求中通过 HTTP 头部传递进行认证
curl -H "Authorization: ApiKey YOUR_API_KEY" -X GET "localhost:9200/_cluster/health"
xpack.security.transport.ssl.enabled=true
用于启用 节点之间
的 传输层
加密, 确保集群内的节点之间的通信是加密的,从而防止数据在传输过程中被截获或篡改
xpack.security.http.ssl.enabled=true
用于启用 HTTP
层的加密
确保通过 REST API
进行的 HTTP 请求和响应是加密的,从而保护数据在客户端和 Elasticsearch 服务器之间的传输安全
最后修改于 2024-08-27
此篇文章的评论功能已经停用。