Elasticsearch | 笔记

2022-04-01 16:59:42 浏览数 (1)

引言

Docker Compose 启动 ES, Kibana

参考:

  • Install Elasticsearch with Docker | Elasticsearch Guide [7.13] | Elastic
  • Docker部署ElasticSearch以及使用 - 风不辞 - 博客园
  • Install Kibana with Docker | Kibana Guide [7.13] | Elastic

单节点

1.创建挂载的目录

代码语言:javascript复制
mkdir -p mydata/elasticsearch/config

mkdir -p mydata/elasticsearch/data

2.准备挂载的配置文件

代码语言:javascript复制
mydata/elasticsearch/config/elasticsearch.yml
mydata/kibana/config/kibana.yml

补充:

其实在 官方Docker es 镜像的配置文件 ( elasticsearch.yml ),就是下方内容:

代码语言:javascript复制
cluster.name: "docker-cluster"
network.host: 0.0.0.0
  • elasticsearch.yml: 挂载的配置文件,
  • data: 挂载的数据,
  • plugins: es的插件,如ik,

而数据挂载需要权限,需要设置 data 文件的权限为可读可写,需要下边的指令。

代码语言:javascript复制
chmod -R 777 <要修改的路径>

所需映射的文件 data 及 logs 目录 用户所有者为elasticsearch 所在组root, 而 docker 挂载到本机的目录所有者是 root 所在组 root,容器内部想写文件则会权限不足

如果在 docker-compose.yml 中解决权限问题,则使用:

代码语言:javascript复制
environment:
  - TAKE_FILE_OWNERSHIP=true

discovery.type=single-node 设置为单节点 特别注意: ES_JAVA_OPTS="-Xms256m -Xmx256m" 测试环境下,设置ES的初始内存和最大内存,否则导致过大启动不了ES docker-compose.yml

代码语言:javascript复制
version: '3.4'


services:
  es.service:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2
    container_name: es-container
    ports:
      - "9200:9200"
      - "9300:9300"
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      #- TAKE_FILE_OWNERSHIP=true
    volumes:
      - "./mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml"
      - "./mydata/elasticsearch/data:/usr/share/elasticsearch/data"
      - "./mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins"
    networks:
      - es-net

  kibana.service:
    image: docker.elastic.co/kibana/kibana:7.13.2
    container_name: kibana-container
    ports:
      - "5601:5601"
    restart: always
    depends_on:
      - es.service
    environment:
      - TZ=Asia/Shanghai
      - ELASTICSEARCH_HOSTS=http://es-container:9200
    volumes:
      - "./mydata/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml"
    networks:
      - es-net

networks:
  es-net:
    driver: bridge

注意:

代码语言:javascript复制
ELASTICSEARCH_HOSTS=http://es-container:9200

不是 http://127.0.0.1:9200 ,因为是两个容器通信,已经设置在同一网络,然而对于其中一个容器而言,ip并不是 127.0.0.1,Docker容器默认使用 container-name 映射到自己容器的ip,所以可以这么写

注意: 在 docker-compose.yml 中, volumes 中 宿主机使用相对路径时,必须以 ./ 开头,表示当前路径,不能用 data/eee 这样来表示相对路径, 但直接运行 docker run 时就可以这样写相对路径

启动

代码语言:javascript复制
docker-compose up -d

测试

es

http://127.0.0.1:9200

kibana

http://127.0.0.1:5601

索引与映射

Elasticsearch 索引

在 Elasticsearch 中, 添加或更新文档时 最重要的动作: 将它们编入 倒排索引,未被编入倒排索引的 文档将不能被检索。 也就是说,Elasticsearch 中所有数据的检索都必须要通过倒排索引来检索,离开了 倒排索引文档就相当于不存在。 所以从检索的角度来看,文档以倒排索引的形式表现其存在性。 正是基 于这个原因,Elasticsearch 没有引入库的概念, 而是将文档的容器直接称为索引(Index)。而这里的索引就是倒排索引,或者更准确的说是一组倒排索引。 概念上: 将索引理解为文档在物理上的区分

​ 在概念上可以将索引理解为文档在物理上的区分。同一索引中的文档具有相同的索引策略,或者说 它们被编入到同一组索引中。从检索的角度来说,用户在检索文档时也要指定从哪一个索引中检索文 档。所以从存储和检索两个角度来看,以素引区分文档实在是再合适不过了。用户预先创建索引可以指明文档存储时怎么分词,如何创建索引等重要配置信息,这对于替身检索速度显然是有益的。

Elasticsearch 映射

在 Elasticsearch 中, 数据存储和检索的基本单元时文档。 Elasticsearch 的文档使用 JSON 格式, 所以 Elasticsearch 存储的文档是一种 半结构化数据,可以 预先定义好属性和数据类型

文档字段

文档字段可以分为两类:一类是元字段(Meta- field),另一类是用户定义的业务字段。

字段数据类型

Elasticsearch 支持的数据类型包括字符串、数值、日期、布尔、二进制、范围等核心数据类型, 还支持数组、对象等衍生类型,也支持嵌套、关联、地理信息等特殊类型。 衍生类型和特殊类型基本都是从核心类型派生而来

字符串类型

字符串类型包括 text 和 keyword 两种类型,两者的区别在于 text 类型在存储前会做词项分析, 而 keyword 类型则不会。所以 text 类型的字段可以通过 analyzer 参数设置该字段的分析器, 而 keyword 类型字段则没有这个参数。

数值类型

数值类型对应一个具体的数字值,例如1024、3.14等。 Elasticsearch 支持包括整型、浮点类型在内 的8种数值类型,它们的主要区别体现的数值精确度上,具体见表。

日期类型

Elasticsearch 有两种日期类型,分别是 date 和 date_nanos。

布尔类型

字节类型

范围类型

数组

对象

与数组类似,Elasticsearch 中没有定义 object 这种数据类型,它是在添加文档时使用 "{ }" 的格式 来确认字段类型为对象。

多数据类型

集群信息

集群健康

集群健康(Cluster Health)通过如下 api GET _cluster/health 可以查看集群健康状况,包括以下 三种:

  • green :健康状态,指所有主副分片都正常分配
  • yellow :指所有主分片都正常分配,但是有副本分片未正常分配
  • red :有主分片未分配

分片与复制

分片与集群

解决大数据存储的通用方案称为分片(Shard), 它的核心思想是将数据分解成大小合适的片段, 然后再将它们存储到集群中不同的节点上。 ElasticSearch 引入分片概念,主要是为了解决数据扩容的问题。 每一个分片仅存储部分数据,并不 是完整的数据。 分片数在索引创建时指定且后不允许再更改,7.x 版本开始,分片数默认为 1 个。 分片 有主分片和副本分片之分,以实现数据的高可用。 副本分片的数据由主分片同步,可以有多个,从而提高读取的吞吐量。

Q&A

补充

docker-compose up 无法启动 es-container

代码语言:javascript复制
Unhandled exception: Filesharing has been cancelled

解决:

设置 Docker ,应用并重启

参考:

  • 一文解决,docker: Error response from daemon ...Unhandle exception:Filesharing has been cancelled.._遇见1995-CSDN博客

权限不足

权限不足,容器无权写入宿主机 data 目录,解决,es-container 添加环境变量

docker-compose.yml

代码语言:javascript复制
environment:
  - TAKE_FILE_OWNERSHIP=true

注意: 实际在 Windows 中的 Docker 没有使用这个还是成功了,没有报 Java 访问文件权限不够 错误

参考:

  • Docker Compose部署ELK和Kibana趟过的坑 - 知乎

Error: Could not find or load main class "-Xms64m

代码语言:javascript复制
❯ docker-compose logs
Attaching to kibana-container, es-container
es-container      | Error: Could not find or load main class "-Xms64m
es-container      | Caused by: java.lang.ClassNotFoundException: "-Xms64m
es-container      | Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]
es-container      | output:
es-container      |
es-container      | error:
es-container      | Error: Could not find or load main class "-Xms64m
es-container      | Caused by: java.lang.ClassNotFoundException: "-Xms64m
es-container      |     at org.elasticsearch.tools.launchers.JvmOption.flagsFinal(JvmOption.java:119)
es-container      |     at org.elasticsearch.tools.launchers.JvmOption.findFinalOptions(JvmOption.java:81)
es-container      |     at org.elasticsearch.tools.launchers.JvmErgonomics.choose(JvmErgonomics.java:38)
es-container      |     at org.elasticsearch.tools.launchers.JvmOptionsParser.jvmOptions(JvmOptionsParser.java:135)
es-container      |     at org.elasticsearch.tools.launchers.JvmOptionsParser.main(JvmOptionsParser.java:86)
es-container      | Error: Could not find or load main class "-Xms64m
es-container      | Caused by: java.lang.ClassNotFoundException: "-Xms64m
es-container      | Exception in thread "main" java.lang.RuntimeException: starting java failed with [1]
es-container      | output:

解决:

代码语言:javascript复制
environment:
  - TZ=Asia/Shanghai
  - discovery.type=single-node
  #- ES_JAVA_OPTS="-Xms64m -Xmx128m" # 错误
  - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 正确

参考

感谢帮助!

  • 本文作者: yiyun
  • 本文链接: https://cloud.tencent.com/developer/article/1970868
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

0 人点赞