当前位置:   article > 正文

基于docker-compose搭建Elasticsearch集群_ulimits: memlock: soft: -1 hard: -1

ulimits: memlock: soft: -1 hard: -1

Elasticsearch

本文主要记录了如何在单机下通过docker-compsoe搭建Elasticsearch集群和相关插件。包含了:es集群(6.7.0)+ik分词器+kibana可视化工具+head插件

更多文章欢迎访问我的个人博客–>幻境云图

1. 概述

Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

同时它也是ELK系统中的一员,ELK是三个开源项目的首字母缩写,这三个项目分别是:ElasticsearchLogstashKibana

2. 环境准备

1. jdk

需要jdk1.8及以上。

2. docker-compose

基于docker-compsoe编排,所以需要docker+docker-compose

3. 创建目录

一定要先创建目录

一定要先创建目录

一定要先创建目录

虽然在没有目录的情况下启动会自动创建对应目录但是真正写入数据时会出现权限问题

目录结构如下

/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配置文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

对应目录创建命令

mkdir -p es/{data,logs,conf}/{node1,node2,node3} es/plugins
  • 1

4. 系统变量调整

调整用户内存

否则启动时可能会出现用户拥有的内存权限太小,至少需要262144的问题

$ sysctl -w vm.max_map_count=262144
  • 1

3. docker-compose.yml

1. docker-compose.yml

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:

  • 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
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105

2. 配置说明

docker-compose.yml文件的一些简单说明。

version: '2' 
  • 1

docker-compose的版本

services:
 elasticsearch1:
  • 1
  • 2

其中的elasticsearch1就是启动的服务的名字 可以随意填写 主要是方便自己看,知道这段代码启动的是一个什么东西。

 image: elasticsearch:6.7.0
  • 1

指定使用哪个镜像

ES不同版本间还是有一定差距的 最后明确指定版本号

container_name: es1
  • 1

容器名字,同时在同一个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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

environment 用于指定环境参数 这里没有用配置文件 就把要修改的几个值写这儿了

- cluster.name=docker-cluster
  • 1

指定ES集群名字,不指定时系统默认为elasticsearch。启动ES时,集群名字相同的会自动加入组成一个集群。

- node.name=es1
  • 1

es节点名字

- bootstrap.memory_lock=true
  • 1

启动后是否锁定内存,提高ES的性能。

     - http.cors.enabled=true
     - http.cors.allow-origin=*
  • 1
  • 2

设置运行跨域,主要用户head插件访问,否则head插件访问不了

- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  • 1

指定JVM参数。机器配置低就稍微调小一点,一般512够用了。

- "discovery.zen.ping.unicast.hosts=es1,es2,es3"
  • 1

设置集群内节点的主机,设置一台的话这台默认成为master节点,写多个的话自动选取。

- "discovery.zen.ping.unicast.hosts=es1,es2,es3"
# es1,es2,es3为容器名,同一docker网络内可以使用container_name代替 也可以写成ip:port
  • 1
  • 2
   ulimits:
     memlock:
       soft: -1
       hard: -1
  • 1
  • 2
  • 3
  • 4

解除内存限制相关设置,不设置可能会出现以下问题

[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’ mlockall

elasticsearch 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
  • 1
  • 2
  • 3
  • 4

挂载数据卷。暂时使用了datalogsplugins这几个,需要的话可以把config加上

- ./config/node1/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

   ports:
      - 9202:9200
      - 9302:9300
  • 1
  • 2
  • 3

指定端口号,由于是在一台机器上跑的,所以把端口号改一下,es的9200分别映射到宿主机的9200、9201、9202,

9300则分别映射到9300、9301、9302

其中9200是es的http访问端口

9300是用于同步数据的tcp端口

   networks:
     - esnet
  • 1
  • 2

配置docker网络

3. 启动

docker-compose.yml文件所在目录执行

docker-compose up
  • 1

不出意外的话应该可以直接启动。

需要后台运行则增加-d参数

docker-compose up -d
  • 1

4. 访问地址

ES:

192.168.0.2:9200
  • 1

kibana:

192.168.0.2:5601
  • 1

head:

 192.168.0.2:9100
  • 1

查看集群状态:

http://192.168.0.2:9200/_cat/health?v
  • 1

记得改成对应的IP

4. FAQ

1. 权限问题

问题1

启动前没有创建对应文件夹导致。

 [0.001s][error][logging] Error opening log file 'logs/gc.log': Permission denied 
  • 1

添加权限即可

# 给data和logs目录775权限
sudo chmod -R 775 /data
# 修改文件归属者
sudo chown -R 1000:1000 /data
  • 1
  • 2
  • 3
  • 4
问题2

创建节点环境失败

Caused by: java.lang.IllegalStateException: Failed to create node environment
  • 1

也是挂载目录权限问题

chmod 777 挂载目录路径

例如:chmod 777 es/data/
  • 1
  • 2
  • 3

2. 插件问题

最开始添加ik分词器的时候数据卷是这样写的

 - ./plugins/elasticsearch-analysis-ik-6.7.0:/usr/share/elasticsearch/plugins
  • 1

启动时报错如下

es3   Caused by: java.nio.file.FileSystemException: /usr/share/elasticsearch/plugins/plugin-descriptor.properties/plugin-descriptor.properties: Not a directory
  • 1

解决办法

最后发现是目录位置写错了,只需要指定plugins目录就行了

 - ./plugins:/usr/share/elasticsearch/plugins
  • 1

改成这样即可,ES启动时会自动加载plugins目录下的插件,应该是把里面的每一个文件夹都当做一个插件的。

3. Kibana连不上

Kibana的设置es地址的字段好像有两个。ELASTICSEARCH_URLELASTICSEARCH_HOSTS

如果连不上es就换另外一个。

5. 参考

https://www.jianshu.com/p/fdfead5acc23

https://blog.csdn.net/weixin_45140326/article/details/98185314

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/74263
推荐阅读
相关标签
  

闽ICP备14008679号