Elastic Search - 安装
Elastic Search - 安装

部署 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=1073741824

# Project namespace (defaults to the current folder name if not set)
COMPOSE_PROJECT_NAME=es

创建 docker-compose.yml 文件

version: '3'
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
    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
重启 ES 容器
docker restart es01
验证插件是否成功安装
docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-plugin list

优化 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

此篇文章的评论功能已经停用。