elastic教程

这里记录 elastic 的使用.

shell

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://mirrors.aliyun.com/elasticstack/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
apt update -y
apt install elasticsearch

# 配置文件
vim /etc/elasticsearch/elasticsearch.yml
#单节点添加
network.host: 0.0.0.0
discovery.type: single-node

# 配置 /etc/sysctl.conf
vm.max_map_count = 262144
sysctl -p

# 启动并验证
systemctl enable elasticsearch --now
curl -X GET "localhost:9200/_cat/health?v"

集群部署只是在 elasticsearch.yml 的配置上有区别. 启动以后会自动服务发现/加入集群/rebalance 数据.

shell

vim /etc/elasticsearch/elasticsearch.yml

# 集群名称,所有节点保持一致,同一网段会自动发现
cluster.name: es-cluster
# 节点名称,一般为主机名 node-1、node-2、node-3
node.name: node-1
# 节点角色,master表示管理节点,data表示数据节点
node.roles: [master,data]
# 数据存放路径
path.data: /data/elasticsearch/data
# 日志存放路径
path.logs: /data/elasticsearch/logs
# 绑定监听IP
network.host: 0.0.0.0
# 设置端口
http.port: 9200
# 跨域相关设置
http.cors.enabled: true
http.cors.allow-credentials: true
http.cors.allow-origin: "*"
# 节点发现. 每个节点的ip
discovery.seed_hosts: ["10.1.43.74:9300","10.1.43.75:9300","10.1.43.76:9300"]
# 集群初始化Master节点,会在第一次选举中进行计算.. 可以作为master的节点
cluster.initial_master_nodes: ["10.1.43.74:9300","10.1.43.75:9300","10.1.43.76:9300"]
# 启用节点上Elastic Search的xpack安全功能
xpack.security.enabled: false
# discovery.type默认是多节点
# discovery.type: multi-node

Systemd 守护进程

toml

[Unit]
Description=es服务
Documentation=elastic文档
# 启动区间30s内,尝试启动3次
StartLimitIntervalSec=30
StartLimitBurst=3

[Service]
User=es
Environment=ES_JAVA_OPTS="-Xms4g -Xmx4g"
WorkingDirectory=/home/es/elasticsearch-7.17.3
ExecStart=/home/es/elasticsearch-7.17.3/bin/elasticsearch
# 总是间隔30s重启,配合StartLimitIntervalSec实现无限重启
RestartSec=30s 
Restart=always
# 相关资源都发送term后,后发送kill
KillMode=mixed
# 最大文件打开数不限制
LimitNOFILE=infinity
# 子线程数量不限制
TasksMax=infinity


[Install]
WantedBy=multi-user.target
Alias=es.service

supervisor 守护进程

toml

[program:es]
command = /home/es/elasticsearch-7.17.3/bin/elasticsearch

environment=ES_JAVA_OPTS="-Xms4g -Xmx4g"

user = es

# 自动重启
autorestart = true
# 启动失败的尝试次数
startretries = 3
# 进程20s没有退出,则判断启动成功
startsecs = 20

# 标准输出的文件路径
stdout_logfile =  /data/logs/es-stdout.log
# 日志文件最大大小
stdout_logfile_maxbytes=20MB
# 日志文件保持数量 默认为10 设置为0 表示不限制
stdout_logfile_backups = 5


# 标准输出的文件路径
stderr_logfile =  /data/logs/es-stderr.log
# 日志文件最大大小
stderr_logfile_maxbytes=20MB
# 日志文件保持数量 默认为10 设置为0 表示不限制
stderr_logfile_backups = 5

shell

cd /usr/share/elasticsearch/
# 自动生成密码
sudo bin/elasticsearch-setup-passwords auto
# 自定义密码
sudo bin/elasticsearch-setup-passwords interactive

创建一个备份仓库:

shell

# 创建一个backup仓库
# 配置了本地路径, 压缩, 1g分片, 备份和恢复速度限制(避免影响系统)
curl -XPOST '{ip}:9200/_snapshot/backup' -H  'Content-Type: application/json' -d 
'{ "type": "fs",  "settings": { "location": "/data/task/elk/elasticsearch-7.6.2/back", "compress": true, "chunk_size": "1g", "max_snapshot_bytes_per_sec": "50m", "max_restore_bytes_per_sec": "50m"}}'

备份:

shell

# 创建一个名为rx_20220823的快照
curl -XPUT '{ip}:9200/_snapshot/backup/rx_20220823?wait_for_completion=true'

# 备份指定的索引 relalist_expert_group_member,relalist_expert_group_summary
curl -XPUT '{ip}:9200/_snapshot/backup/rx_20220823?wait_for_completion=true' -H 'Content-Type: application/json' -d '{"indices": "relalist_expert_group_member,relalist_expert_group_summary"}'

恢复

shell

curl -XPOST '{ip}:9200/_snapshot/backup/rx_20220823/_restore' -H 'Content-Type: application/json' -d'{ "ignore_unavailable": true, "include_global_state": false }'

参考 Elasticsearch 集群故障排查及修复指南-腾讯云开发者社区-腾讯云

查看集群状态

shell

curl -XGET 'http://{Elasticsearch_IP}:9200/_cluster/state?pretty'

查看有问题的索引

shell

GET _cat/indices?v&health=red
GET _cat/indices?v&health=yellow
GET _cat/indices?v&health=green

查看问题原因, 分析

shell

GET /_cat/shards?v&h=n,index,shard,prirep,state,sto,sc,unassigned.reason,unassigned.details&s=sto,index

# 关注state, unassigned.reason 字段

如果是 allocation 分片问题. 进一步分析 my_index_003.

shell

GET /_cluster/allocation/explain
{
  "index": "my_index_003",
  "shard": 0,
  "primary": false
}

# explanation会有具体的原因
  • 写入前副本为 0
  • refresh_interval 设置为 -1,禁用刷新机制
  • bulk 批量写入
  • 恢复副本数和刷新间隔
  • 尽量使用自动生成的 id
  • 避免 *? 查询. 通配符查询会很慢
  • terms查询 是多个词条的查询. 减少这种查询
  • 基于时间创建索引
  • 不断调整分片的分布
    • 默认主键分片
    • 可以设置字段范围分片
    • 字段 hash 分片

infini-console 可以帮助我们管理多个 es 集群, 查询修改等操作.

现在最新是 1.29.7 版本, 初始化的时候会创建下划线开头的索引, 导致创建失败, 所以下面会写一个能用的初始化步骤.

  • 创建目录和网络

shell

# 1. 创建项目根目录
mkdir -p ~/infini_compose_lab
cd ~/infini_compose_lab

# 2. 为 Console 和 Easysearch 创建持久化子目录
# 这些目录将用于存储配置、数据和日志
mkdir -p console/config console/data console/logs
mkdir -p easysearch/config easysearch/data easysearch/logs
  • 提取初始化文件

shell

# 确保在 ~/infini_compose_lab 目录下

# console
docker pull infinilabs/console:1.29.6
docker run --rm \
-v $PWD/console/config:/temp_host_config \
infinilabs/console:1.29.6 \
sh -c "cp -a /config/. /temp_host_config/ && chmod -R ugo+rw /temp_host_config/"

# easysearch
chmod -R 777 easysearch
# 获取easycache的内用户的id号
docker run --rm infinilabs/easysearch:1.13.0 id
# 输出 uid=602 gid=602 groups=602
chown -R 602:602 ./easysearch
# 确保在 ~/infini_compose_lab 目录下
docker pull infinilabs/easysearch:1.13.0
docker run --rm \
-e EASYSEARCH_INITIAL_ADMIN_PASSWORD="INFINILabs01" \
-v $PWD/easysearch/config:/temp_host_config \
infinilabs/easysearch:1.13.0 \
sh -c "cp -a /app/easysearch/config/. /temp_host_config/ && chmod -R ugo+rw /temp_host_config/"
  • 创建 docker-compose.yml 文件

yml

services:
  easysearch: 
    image: infinilabs/easysearch:1.13.0
    container_name: infini-easysearch
    environment:
      - cluster.name=infini_compose_cluster
      - node.name=node-01
      - cluster.initial_master_nodes=node-01
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - EASYSEARCH_INITIAL_ADMIN_PASSWORD=INFINILabs01
    ports:
      - "9200:9200"
      - "9300:9300"
    volumes:
      - ./easysearch/config:/app/easysearch/config
      - ./easysearch/data:/app/easysearch/data
      - ./easysearch/logs:/app/easysearch/logs
    ulimits:
      memlock: {soft: -1, hard: -1}
      nofile: {soft: 65536, hard: 65536}
    networks:
      - infini_app_net

  console:
    image: infinilabs/console:1.29.6
    container_name: infini-console
    ports:
      - "9000:9000"
    volumes:
      - ./console/config:/config
      - ./console/data:/data
      - ./console/logs:/log
    networks:
      - infini_app_net

networks:
  infini_app_net:
    driver: bridge
  • 修改 sysctl 内核参数. 在 /etc/sysctl.conf 配置 vm.max_map_count=262144. sysctl -p 生效

初始化

  1. 启动后, 访问 127.0.0.1:9000 端口.
  2. 初始化操作: 输入 easysearch:9200 , 开启 tls 选项, 身份验证 admin/INFINILabs01