引言
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.创建挂载的目录
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 文件的权限为可读可写,需要下边的指令。
所需映射的文件 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 时就可以这样写相对路径
启动
测试
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 ,应用并重启
参考:
一文解决,docker: Error response from daemon ...Unhandle exception:Filesharing has been cancelled.._遇见1995-CSDN博客
权限不足
权限不足,容器无权写入宿主机 data 目录,解决,es-container 添加环境变量
docker-compose.yml
1 2 environment: - TAKE_FILE_OWNERSHIP=true
注意:
实际在 Windows 中的 Docker 没有使用这个还是成功了,没有报 Java 访问文件权限不够 错误
参考:
Docker Compose部署ELK和Kibana趟过的坑 - 知乎
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" # 正确
参考
感谢帮助!