Elasticsearch | 笔记

引言

Docker Compose 启动 ES, Kibana

参考:

单节点

1.创建挂载的目录

1
2
3
mkdir -p mydata/elasticsearch/config

mkdir -p mydata/elasticsearch/data

2.准备挂载的配置文件

1
2
mydata/elasticsearch/config/elasticsearch.yml
mydata/kibana/config/kibana.yml

补充:

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

elasticsearch.yml
1
2
cluster.name: "docker-cluster"
network.host: 0.0.0.0
  • elasticsearch.yml: 挂载的配置文件,

  • data: 挂载的数据,

  • plugins: es的插件,如ik,

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

1
chmod -R 777 <要修改的路径>

所需映射的文件 data 及 logs 目录 用户所有者为elasticsearch 所在组root,

而 docker 挂载到本机的目录所有者是 root 所在组 root,容器内部想写文件则会权限不足

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

1
2
environment:
- TAKE_FILE_OWNERSHIP=true

discovery.type=single-node 设置为单节点

特别注意:

ES_JAVA_OPTS="-Xms256m -Xmx256m"

测试环境下,设置ES的初始内存和最大内存,否则导致过大启动不了ES

docker-compose.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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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

注意:

1
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 时就可以这样写相对路径

启动

1
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

1
Unhandled exception: Filesharing has been cancelled

解决:

设置 Docker ,应用并重启

参考:

权限不足

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

docker-compose.yml

1
2
environment:
- TAKE_FILE_OWNERSHIP=true

注意:

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

参考:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
❯ 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:

解决:

docker-compose.yml
1
2
3
4
5
environment:
- TZ=Asia/Shanghai
- discovery.type=single-node
#- ES_JAVA_OPTS="-Xms64m -Xmx128m" # 错误
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 正确

参考

感谢帮助!