安装

https://www.elastic.co/cn/downloads/elasticsearch

1
2
3
4
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.0.0-linux-x86_64.tar.gz
tar -zxvf elasticsearch-8.0.0-linux-x86_64.tar.gz -C /app/service/elk
mv elasticsearch-8.0.0 elasticsearch
mkdir -pv /app/data/elasticsearch && mkdir -pv /app/logs/elasticsearch

配置

按需进行修改:vi /app/service/elk/config/elasticsearch.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cluster.name: elk
node.name: elk-01
path.data: /app/data/elasticsearch
path.logs: /app/logs/elasticsearch
##锁定物理内存地址,避免 es 使用 swap 使 IOPS 变高
#bootstrap.memory_lock: true
#bootstrap.memory_lock: false
#上述为 false 需要追加配置
#bootstrap.system_call_filter: false
network.host: 0.0.0.0
http.port: 9200
xpack.security.enabled: false
#单点部署
discovery.type: single-node
#集群部署
#node.master: true
#node.data: true
#discovery.zen.minimum_master_nodes: 1
#discovery.zen.ping_timeout: 3s
#discovery.zen.ping.unicast.hosts: ["ip1:9300","ip2:9300","ip3:9300"]
#初始时 Master 节点选取
#cluster.initial_master_nodes: ["elk-01"]
#开启跨域请求
http.cors.enabled: true
http.cors.allow-origin: "*"

管理

内置账号

ES 内部是有认证的,默认关闭,配置文件添加以下字段开启

1
2
3
4
5
#启用安全
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.authc.api_key.enabled: true
xpack.security.authc.accept_default_password: false

启用 elasticsearch 内置用户并设置初始密码(6 位)

  • elastic:超级管理员,拥有所有权限
  • kibana:用于 ES 与 Kibana 之间的通信
  • kibana_system:用于 ES 与 Kibana 之间的通信,获取相关信息用于 web 展示
  • apm_system
  • logstash_system:用于 logstash 服务获取 elasticsearch 的监控数据
  • beats_system
  • remote_monitoring_user

启用 ES 的安全功能后,访问 ES 就需要输入用户名和密码:

1
/app/service/elk/elasticsearch/bin/elasticsearch-setup-passwords auto | interactive

设置密码:

1
/app/service/elk/elasticsearch/bin/elasticsearch -E node.name=node1 -E cluster.name=es -E path.data=node1 -d

修改用户密码
1
curl -XPOST -H 'Content-type: application/json' -u elastic:JhuDa6IFOOtRMOVTI3gu 'http://127.0.0.1:9200/_xpack/security/user/elastic/_password?pretty' -d '{"password": "123456"}'

运行内存

设定 JVM 内存,两个值一样大,且不要超过物理内存的 50%,根据实际情况设置

1
2
3
vi /app/service/elk/elasticsearch/config/jvm.options
-Xms1g
-Xmx1g

启动命令

当前使用版本 Elasticsearch 需要使用 JDK 11 以上运行,使用自带的即可,编辑启动命令

1
2
3
4
5
6
7
8
9
10
11
vi /app/service/elk/elasticsearch/bin/elasticsearch

#使用内置的 JDK11,放在文件第二行
export JAVA_HOME=/app/service/elk/jdk
export PATH=$JAVA_HOME/bin:$PATH
#添加判断
if [ -x "$JAVA_HOME/bin/java" ]; then
JAVA="/app/service/elk/jdk/bin/java"
else
JAVA=`which java`
fi

elasticSearch 只能使用普通用户

1
2
3
4
5
6
su app
#启动 Elasticsearch
/app/service/elk/elasticsearch/bin/elasticsearch -d
#关闭 Elasticsearch
/app/service/elk/elasticsearch/jdk/bin/jps
kill -9 进程号

PS.max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

1
2
3
4
5
6
7
8
9
#临时修改
sysctl -w vm.max_map_count=262144
sysctl -a | grep vm.max_map_count
#永久修改
vi /etc/sysctl.conf
vm.max_map_count=262144
sysctl -p
reboot
#重新启动生效

交互

1
2
3
4
5
6
7
8
#查看集群状态
curl http://ip:9200/_cat/health?v
#查看日志索引
curl http://ip:9200/_cat/indices
#删除索引日志
curl -XDELETE http://:9200/<索引名称>
#查看日志内容
curl -XGET http://:9200/<索引名称>/_search

清理索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#/bin/bash

# 清理几天前的索引
dayn=2
# ES IP & port
esip=127.0.0.1
esport=9200
#匹配日期正则表达式,日期格式为:YYYY.mm.dd
regular="[0-9]{4}(.[0-9]{2}){2}"

#指定日期
date1=`date -d "$dayn day ago" +%Y-%m-%d`
#当前日期
time=`date "+%Y-%m-%d %H:%M:%S"`
echo "${time}:开始清理 $date1(${dayn}天)之前的 ES 索引"

res=`curl -XGET "http://${esip}:${esport}/_cat/indices/?v"|grep -E $regular|awk '{print $3}'`

t1=`date -d "$date1" +%s`
for var in $res;
do
#如果索引中的日期格式已经是 YYYY-mm-dd 格式,就不用使用 sed 替换了,本例索引中日期格式为:YYYY.mm.dd
date2=`echo $var| tr -cd $regular|sed 's/\./-/g'`
t2=`date -d "$date2" +%s`
if [ $t1 -gt $t2 ]; then
#echo "$date1 > $date2"
echo "${time}: 清理 $var 索引"
#curl --user account:pwd -XDELETE "http://${esip}:${esport}/$var"
curl -XDELETE "http://${esip}:${esport}/$var"
fi
done