引言
Docker Compose 启动 ES, Kibana
参考:
- Install Elasticsearch with Docker | Elasticsearch Guide [7.13] | Elastic
- Docker部署ElasticSearch以及使用 - 风不辞 - 博客园
- Install Kibana with Docker | Kibana Guide [7.13] | Elastic
单节点
代码语言:javascript复制1.创建挂载的目录
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
),就是下方内容:
cluster.name: "docker-cluster"
network.host: 0.0.0.0
- elasticsearch.yml: 挂载的配置文件,
- data: 挂载的数据,
- plugins: es的插件,如ik,
代码语言:javascript复制而数据挂载需要权限,需要设置 data 文件的权限为可读可写,需要下边的指令。
chmod -R 777 <要修改的路径>
所需映射的文件 data 及 logs 目录 用户所有者为elasticsearch 所在组root, 而 docker 挂载到本机的目录所有者是 root 所在组 root,容器内部想写文件则会权限不足
如果在 docker-compose.yml 中解决权限问题,则使用:
代码语言:javascript复制environment:
- TAKE_FILE_OWNERSHIP=true
代码语言:javascript复制discovery.type=single-node 设置为单节点 特别注意: ES_JAVA_OPTS="-Xms256m -Xmx256m" 测试环境下,设置ES的初始内存和最大内存,否则导致过大启动不了ES docker-compose.yml
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 许可协议。转载请注明出处!