本文主要记录了如何在单机下通过docker-compsoe
搭建Elasticsearch
集群和相关插件。包含了:es集群(6.7.0)
+ik分词器
+kibana可视化工具
+head插件
。
更多文章欢迎访问我的个人博客–>幻境云图
Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
同时它也是ELK
系统中的一员,ELK
是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch
、Logstash
和 Kibana
。
需要jdk1.8及以上。
基于docker-compsoe
编排,所以需要docker
+docker-compose
一定要先创建目录
一定要先创建目录
一定要先创建目录
虽然在没有目录的情况下启动会自动创建对应目录但是真正写入数据时会出现权限问题。
目录结构如下
/usr/local/docker
├── es
│ ├── /data # 数据文件
│ │ ├─/node1
│ │ ├─/node2
│ │ ├─/node3
│ ├── /logs # 日志文件
│ │ ├─/node1
│ │ ├─/node2
│ │ ├─/node3
│ ├── /conf # 配置文件 暂时没用到 大多数都是用的默认配置
│ │ ├─/node1
│ │ ├─/node2
│ │ ├─/node3
│ ├── /plugins # 插件 这个就不用分节点存了。。
│ │ ├─/elasticsearch-analysis-ik-6.7.0 #暂时只用到了分词器
└── docker-compose.yml # docker-compose配置文件
对应目录创建命令
mkdir -p es/{data,logs,conf}/{node1,node2,node3} es/plugins
调整用户内存
否则启动时可能会出现用户拥有的内存权限太小,至少需要262144的问题
$ sysctl -w vm.max_map_count=262144
version: '2'
services:
elasticsearch1:
image: elasticsearch:6.7.0
container_name: es1
environment:
- cluster.name=docker-cluster
- node.name=es1
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/node1:/usr/share/elasticsearch/data
- ./logs/node1:/user/share/elasticsearch/logs
- ./plugins:/usr/share/elasticsearch/plugins
ports:
- 9200:9200
- 9300:9300
networks:
- esnet
elasticsearch2:
image: elasticsearch:6.7.0
container_name: es2
environment:
- cluster.name=docker-cluster
- node.name=es2
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.zen.ping.unicast.hosts=es1,es2,es3"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/node2:/usr/share/elasticsearch/data
- ./logs/node2:/user/share/elasticsearch/logs
- ./plugins:/usr/share/elasticsearch/plugins
ports:
- 9201:9200
- 9301:9300
networks:
- esnet
elasticsearch3:
image: elasticsearch:6.7.0
container_name: es3
environment:
- cluster.name=docker-cluster
- node.name=es3
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "discovery.zen.ping.unicast.hosts=es1,es2,es3"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/node3:/usr/share/elasticsearch/data
- ./logs/node3:/user/share/elasticsearch/logs
- ./plugins:/usr/share/elasticsearch/plugins
ports:
- 9202:9200
- 9302:9300
networks:
- esnet
kibana:
image: 'kibana:6.7.0'
container_name: kibana
environment:
SERVER_NAME: kibana.local
ELASTICSEARCH_URL: http://es1:9200
I18N_LOCALE: zh-CN
ports:
- '5601:5601'
networks:
- esnet
headPlugin:
image: 'mobz/elasticsearch-head:5'
container_name: head
ports:
- '9100:9100'
networks:
- esnet
volumes:
esdata1:
driver: local
esdata2:
driver: local
esdata3:
driver: local
networks:
esnet:
docker-compose.yml
文件的一些简单说明。
version: '2'
docker-compose
的版本
services:
elasticsearch1:
其中的elasticsearch1
就是启动的服务的名字 可以随意填写 主要是方便自己看,知道这段代码启动的是一个什么东西。
image: elasticsearch:6.7.0
指定使用哪个镜像
ES不同版本间还是有一定差距的 最后明确指定版本号
container_name: es1
容器名字,同时在同一个docker-network
中可以使用容器名字当做ip
用
environment:
- cluster.name=docker-cluster
- node.name=es1
- bootstrap.memory_lock=true
- http.cors.enabled=true
- http.cors.allow-origin=*
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
environment 用于指定环境参数 这里没有用配置文件 就把要修改的几个值写这儿了
- cluster.name=docker-cluster
指定ES集群名字,不指定时系统默认为elasticsearch
。启动ES时,集群名字相同的会自动加入组成一个集群。
- node.name=es1
es节点名字
- bootstrap.memory_lock=true
启动后是否锁定内存,提高ES的性能。
- http.cors.enabled=true
- http.cors.allow-origin=*
设置运行跨域,主要用户head插件访问,否则head插件访问不了
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
指定JVM参数。机器配置低就稍微调小一点,一般512够用了。
- "discovery.zen.ping.unicast.hosts=es1,es2,es3"
设置集群内节点的主机,设置一台的话这台默认成为master节点,写多个的话自动选取。
- "discovery.zen.ping.unicast.hosts=es1,es2,es3"
# es1,es2,es3为容器名,同一docker网络内可以使用container_name代替 也可以写成ip:port
ulimits:
memlock:
soft: -1
hard: -1
解除内存限制相关设置,不设置可能会出现以下问题
[unknown] Unable to lock JVM Memory: error=12, reason=Cannot allocate memory
[unknown] This can result in part of the JVM being swapped out.
[unknown] Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536
[unknown] These can be adjusted by modifying /etc/security/limits.conf, for example: allow user ‘elasticsearch’ mlockallelasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
[[unknown] If you are logged in interactively, you will have to re-login for the new limits to take effect.
volumes:
- ./data/node1:/usr/share/elasticsearch/data
- ./logs/node1:/user/share/elasticsearch/logs
- ./plugins:/usr/share/elasticsearch/plugins
挂载数据卷。暂时使用了data
、logs
、plugins
这几个,需要的话可以把config
加上
- ./config/node1/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
ports:
- 9202:9200
- 9302:9300
指定端口号,由于是在一台机器上跑的,所以把端口号改一下,es的9200
分别映射到宿主机的9200、9201、9202
,
9300
则分别映射到9300、9301、9302
。
其中9200是es的http访问端口
9300是用于同步数据的tcp端口
networks:
- esnet
配置docker网络
在docker-compose.yml
文件所在目录执行
docker-compose up
不出意外的话应该可以直接启动。
需要后台运行则增加-d
参数
docker-compose up -d
ES:
192.168.0.2:9200
kibana:
192.168.0.2:5601
head:
192.168.0.2:9100
查看集群状态:
http://192.168.0.2:9200/_cat/health?v
记得改成对应的IP
启动前没有创建对应文件夹导致。
[0.001s][error][logging] Error opening log file 'logs/gc.log': Permission denied
添加权限即可
# 给data和logs目录775权限
sudo chmod -R 775 /data
# 修改文件归属者
sudo chown -R 1000:1000 /data
创建节点环境失败
Caused by: java.lang.IllegalStateException: Failed to create node environment
也是挂载目录权限问题
chmod 777 挂载目录路径
例如:chmod 777 es/data/
最开始添加ik分词器的时候数据卷是这样写的
- ./plugins/elasticsearch-analysis-ik-6.7.0:/usr/share/elasticsearch/plugins
启动时报错如下
es3 Caused by: java.nio.file.FileSystemException: /usr/share/elasticsearch/plugins/plugin-descriptor.properties/plugin-descriptor.properties: Not a directory
解决办法
最后发现是目录位置写错了,只需要指定plugins目录就行了
- ./plugins:/usr/share/elasticsearch/plugins
改成这样即可,ES启动时会自动加载plugins
目录下的插件,应该是把里面的每一个文件夹都当做一个插件的。
Kibana的设置es地址的字段好像有两个。ELASTICSEARCH_URL
和ELASTICSEARCH_HOSTS
。
如果连不上es就换另外一个。
https://www.jianshu.com/p/fdfead5acc23
https://blog.csdn.net/weixin_45140326/article/details/98185314