Skip to content

Elasticsearch_基础内容

基础内容介绍

Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本 身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

ES也使用Java开发并使用 Lucene 作为其核心来实 现所有索引和搜索的功能,它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得 简单。

Elasticsearch比传统关系型数据库如下:

> Relational DB ‐> Databases ‐> Tables ‐> Rows ‐> Columns  
> Elasticsearch ‐> Indices ‐> Types ‐> Documents ‐> Fields

Docker 方式安装 es

参考下这个: https://blog.csdn.net/m0_62289824/article/details/137676075

创建一个新的Docker网络

#拉取镜像
docker pull elasticsearch:8.6.0

#创建专用网络(可选)
docker network create es-net

#创建挂载点目录
mkdir -p /usr/local/es/data /usr/local/es/config /usr/local/es/plugins
chmod 777  /usr/local/es/data
chmod 777  /usr/local/es/config
chmod 777  /usr/local/es/plugins

这里使用专用网络是为了:将 Elasticsearch 和相关服务(如Kibana、Logstash)放在同一网络,与外部或其他服务隔离,减少暴露风险。

本地拉取网络有点问题,选择了默认最近的

docker pull docker.io/library/elasticsearch

下面的命令部分内容改为:elasticsearch:latest

创建容器

docker run -d \
--restart=always \
--name es \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
--privileged \
-v /usr/local/es/data:/usr/share/elasticsearch/data \
-v /usr/local/es/plugins:/usr/share/elasticsearch/plugins \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:8.6.0

编写elasticsearch.yml

#进入容器
docker exec -it es /bin/bash
#跳转到 config 目录
cd config

#关闭 密码安全验证
echo 'xpack.security.enabled: false' >> elasticsearch.yml

#重启 es 容器
docker restart es

这里我实际使用的版本是 docker.elastic.co/elasticsearch/elasticsearch:8.1.0 ,然后不能进行追加操作,需要进入到 vi 模式,手动编辑一下,关闭密码安全验证

测试是否部署成功:访问虚拟机地址+端口号,前面配置Elasticsearch 的端口号为:9200

出现了一下报错: Caused by: com.fasterxml.jackson.core.JsonParseException: Duplicate field 'xpack.security.enabled'

touch /usr/local/es/config/elasticsearch.yml
chmod 666 /usr/local/es/config/elasticsearch.yml

编辑一下文件

cluster.name: "my-es-cluster"
network.host: 0.0.0.0
xpack.security.enabled: false

删除容器并启动一下

docker run -d \
  --restart=always \
  --name es \
  --network es-net \
  -p 9200:9200 \
  -p 9300:9300 \
  --privileged \
  -v /usr/local/es/data:/usr/share/elasticsearch/data \
  -v /usr/local/es/plugins:/usr/share/elasticsearch/plugins \
  -v /usr/local/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
  elasticsearch:8.6.0

基于Docker安装Kibana

注意版本,和 es 保持对应 docker pull docker.elastic.co/kibana/kibana:8.1.0, 看你实际情况

继续上面

docker pull kibana:8.6.0
#创建挂载点目录
mkdir -p /usr/local/kibana/config /usr/local/kibana/data
chmod 777 /usr/local/kibana/data
chmod 777 /usr/local/kibana/config

部署容器

docker run -d \
--restart=always \
--name kibana \
--network es-net \
-p 5601:5601 \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
kibana:8.6.0

测试 Kibana 是否安装成功

访问虚拟机地址+端口号,前面配置Kibana 的端口号为:5601

整合 IK 分词器

先下载一下: https://github.com/infinilabs/analysis-ik/releases/tag/v8.1.0

配置参考; https://www.cnblogs.com/ccubee/p/14254101.html

新建文件夹

mkdir -p /data/elk/es/ik

#解压
unzip elasticsearch-analysis-ik-8.1.0.zip

将 IK 分词器复制到 docker 内部

docker cp /data/elk/es/ik es2:/usr/share/elasticsearch/plugins/ik/
  • docker cp 复制文件到docker内部
  • /data/elk/es/ik ik分词器路径
  • es2 es容器名称
  • /usr/share/elasticsearch/plugins/ik/ docker内es插件路径

复制完毕重启es docker restart es2(容器名称或者容器id)

测试

GET _analyze
{
  "analyzer": "ik_smart",
  "text":"今天天气不错"
}

es 整合 ELK

还没操作,有点问题,后面看一下

参考: https://www.yuque.com/macrozheng/mall-learning/yu3lh69e1gu0ppiq

文档中用的是 下载Elasticsearch7.17.3 版本,实际自己用的是 8.1.0;先继续用一下,不行的话换一个端口映射服务安装或者切换服务。

配置参考;

拉取

docker pull logstash:8.1.0

docker pull docker.elastic.co/logstash/logstash:8.1.0

目录挂载

mkdir -p /home/data/logstash/config
mkdir -p /home/data/logstash/pipeline
mkdir -p /home/data/logstash/data
mkdir -p /home/data/logstash/pipeline/mappings

编辑文件

vi /home/data/logstash/config/logstash.yml

http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.username: "logstash"
xpack.monitoring.elasticsearch.password: "密码"
xpack.monitoring.elasticsearch.hosts: [ "http://es-ip:9200" ]

vi /home/data/logstash/pipeline/logstash.conf

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"  # 允许任意主机发送日志
    port => 5044 # logstash暴露的端口
    codec => json_lines    # 数据格式
  }
}

filter {
    ruby {
        # 将时间转成毫秒的时间戳
        code => "event.set('createTime',(event.get('@timestamp').to_f.round(3)*1000).to_i)"
    }
    ruby {
        # 设置一个自定义字段'timestamp'[这个字段可自定义],将logstash自动生成的时间戳中的值加8小时,赋给这个字段
    code => "
          event.set('timestamp', event.get('@timestamp').time.localtime + 8*3600)
          event.set('threadName', event.get('thread_name'))
          event.set('levelValue', event.get('level_value'))
          event.set('loggerName', event.get('logger_name'))
          event.set('callerClassName', event.get('caller_class_name'))
          event.set('callerFileName', event.get('caller_file_name'))
          event.set('callerLineNumber', event.get('caller_line_number'))
          event.set('callerMethodName', event.get('caller_method_name'))
          event.set('stackTrace', event.get('stack_trace'))
        "
    }
    ruby {
        # 将自定义时间字段中的值重新赋给@timestamp
        # code => "event.set('@timestamp',event.get('timestamp'))"
    }
    mutate {
        # 删除自定义字段
        remove_field => ["timestamp","thread_name","level_value","logger_name","HOSTNAME","caller_class_name","caller_file_name","caller_line_number","caller_method_name","stack_trace"]
    }
}

output {
  elasticsearch {
      hosts  => ["http://es-ip:9200"]   # ElasticSearch 的地址和端口
      user   => "elastic"
      password => "es密码"
      index  => "application-logs-%{[appName]}-%{[springProfile]}-%{+YYY-MM}"         # 指定索引名
      # document_type => "_doc"
      codec  => json
      # 是否使用模板创建索引,在模板中可提前定义索引的字段类型
      manage_template => true
      # 索引模板文件
      template => "/usr/share/logstash/pipeline/mappings/application-log-mapping.json"
      template_name => "application-log"
      # 在logstash重启后,是否使用模板文件覆盖es中已存在的索引模板
      template_overwrite => true
  }
  #stdout {
  #  codec => rubydebug
  #}
  file {
    path => "/usr/share/logstash/pipeline/logs/%{+YYYY-MM-dd}-%{appName}-%{springProfile}.log"
  }
}

vi /home/data/logstash/pipeline/mappings/application-log-mapping.json

# 这里被坑了一天,7.X后的es,type 不是再是 string 而是 type="keyword" 或 type="text"
{
  "index_patterns": ["application-log*"],
  "order": 1,
  "mappings" : {
    "dynamic_templates" : [{
      "message_field" : {
        "match" : "message",
        "match_mapping_type" : "string",
        "mapping" : {
          "type" : "keyword",
          "index" : true
        }
      }
    }, {
      "string_fields" : {
        "match" : "*",
        "match_mapping_type" : "string",
        "mapping" : {
          "type" : "keyword",
          "index" : true
        }
      }
    }],
    "properties" : {
      "@timestamp": { "type": "date" },
      "@version": { "type": "keyword", "index": true },
      "message": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

运行logstash

docker run -d --name logstash --net elk-network \
  --privileged=true \
  -p 5044:5044 \
  -v /home/data/logstash/data/:/usr/share/logstash/data \
  -v /home/data/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
  -v /home/data/logstash/pipeline/:/usr/share/logstash/pipeline \
  logstash:7.17.18

相关问题:

 # 如果运行中,查看日志有创建动态mapping报错,那在kibana里面执行一下手动创建mapping,看下报什么错
PUT _template/application-logs
{
      mapping
}

参考