您的位置:首页 > 运维架构 > Docker

docker Elasticsearch单机部署与集群部署

2020-04-10 07:55 363 查看

镜像拉取

[code]docker pull docker.elastic.co/elasticsearch/elasticsearch:6.8.4

开发者模式启动elasticsearch

[code]docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d docker.elastic.co/elasticsearch/elasticsearch:6.8.4

指定参数运行

[code]docker run -p 9200:9200 -p 9300:9300 --ulimit nofile=65535:65535 --ulimit memlock=-1:-1 -e "bootstrap.memory_lock=true" -e ES_JAVA_OPTS="-Xms1g -Xmx1g" -v /data1/docker_elk/elasticsearch/data/:/usr/share/elasticsearch/data -v /data1/docker_elk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data1/docker_elk/elasticsearch/logs/:/usr/share/elasticsearch/logs -d docker.elastic.co/elasticsearch/elasticsearch:6.8.4
  • -p :映射端口
  • --ulimit : 设置系统参数
  • -e bootstrap.memory_lock=true : 锁定内存
  • -e ES_JAVA_OPTS="-Xms1g -Xmx1g" : 设置占用JVM内存
  • -v :挂载目录,这里挂载2个目录和一个配置文件
  • -d : 后台启动

编辑elasticsearch.yml

[code]cluster.name: "docker-cluster"
network.host: 0.0.0.0

#设置支持http跨域请求操作
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type

# 为elasticsearch增加自动创建索引功能
action.auto_create_index: .security,.security-6,.monitoring*,.watches,.triggered_watches,.watcher-history*,app-a-*,app-b-*,.ml*,logstash-*

执行sh脚本

[code]
#!/bin/bash
data="/data1/docker_elk/elasticsearch/data/"
logs="/data1/docker_elk/elasticsearch/logs/"
# 授权目录,必须授权,要不启动报错
chmod 777 $data
chmod 777 $logs

docker_name=elasticsearch

docker stop $docker_name
docker rm $docker_name

docker run --name=$docker_name -p 9200:9200 -p 9300:9300 --ulimit nofile=65535:65535 --ulimit memlock=-1:-1 -e "bootstrap.memory_lock=true" -e ES_JAVA_OPTS="-Xms1g -Xmx1g" -v $data:/usr/share/elasticsearch/data -v /data1/docker_elk/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v $logs:/usr/share/elasticsearch/logs -d docker.elastic.co/elasticsearch/elasticsearch:6.8.4

安装ElasticSearch-Header

拉取镜像

[code]docker pull mobz/elasticsearch-head:5

运行容器

[code]root_dir=/data1/docker_elk/filebeat

docker_name=logstash

docker stop $docker_name
docker rm $docker_name

docker run -d --name=elasticsearch_header -p 9100:9100 mobz/elasticsearch-head:5

集群部署

节点类型

  • 候选主节点(Master-eligible node)

一个节点启动后,就会使用Zen Discovery机制去寻找集群中的其他节点,并与之建立连接。集群中会从候选主节点中选举出一个主节点,主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作。Elasticsearch中的主节点的工作量相对较轻,用户的请求可以发往任何一个节点,由该节点负责分发和返回结果,而不需要经过主节点转发。

正常情况下,集群中的所有节点,应该对主节点的选择是一致的,即一个集群中只有一个选举出来的主节点。然而,在某些情况下,比如网络通信出现问题、主节点因为负载过大停止响应等等,就会导致重新选举主节点,此时可能会出现集群中有多个主节点的现象,即节点对集群状态的认知不一致,称之为脑裂现象。为了尽量避免此种情况的出现,可以通过discovery.zen.minimum_master_nodes来设置最少可工作的候选主节点个数,建议设置为(候选主节点数 / 2) + 1, 比如,当有三个候选主节点时,该配置项的值为(3/2)+1=2,也就是保证集群中有半数以上的候选主节点。

node.master = true 
node.data = true

  • 数据节点(Data node)

数据节点负责数据的存储和相关具体操作,比如CRUD、搜索、聚合。所以,数据节点对机器配置要求比较高,首先需要有足够的磁盘空间来存储数据,其次数据操作对系统CPU、Memory和IO的性能消耗都很大。通常随着集群的扩大,需要增加更多的数据节点来提高可用性。

前面提到默认情况下节点既可以做候选主节点也可以做数据节点,但是数据节点的负载较重,所以需要考虑将二者分离开,设置专用的数据节点,避免因数据节点负载重导致主节点不响应。

node.master = false 
node.data = true

  • 客户端节点(Client node)

按照官方的介绍,客户端节点就是既不做候选主节点也不做数据节点的节点,只负责请求的分发、汇总等等,也就是下面要说到的协调节点的角色。这样的工作,其实任何一个节点都可以完成,单独增加这样的节点更多是为了负载均衡。

node.master = false 
node.data = false

  • 协调节点(Coordinating node)

协调节点,是一种角色,而不是真实的Elasticsearch的节点,你没有办法通过配置项来配置哪个节点为协调节点。集群中的任何节点,都可以充当协调节点的角色。当一个节点A收到用户的查询请求后,会把查询子句分发到其它的节点,然后合并各个节点返回的查询结果,最后返回一个完整的数据集给用户。在这个过程中,节点A扮演的就是协调节点的角色。毫无疑问,协调节点会对CPU、Memory要求比较高。

创建结构目录

[code].
├── docker-compose.yml
├── config
│   ├── es01.yml
│   ├── es02.yml
│   └── es03.yml
├── logs
│   ├── es01
│   ├── es02
│   └── es03
└── data
|   ├── es01
│   ├── es02
│   └── es03

编写docker-compose.yml文件

[code]version: '2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:6.8.4
container_name: es01
restart: always
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
# nofile: 65535:65535
volumes:
- ./data/es01:/usr/share/elasticsearch/data
- ./config/es01.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./logs/es01:/usr/share/elasticsearch/logs
ports:
- 9200:9200
- 9300:9300
networks:
- esnet
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:6.8.4
container_name: es02
restart: always
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/es02:/usr/share/elasticsearch/data
- ./config/es02.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./logs/es02:/usr/share/elasticsearch/logs
#这里再同一台机器部署,需要修改端口
ports:
- 9201:9200
- 9301:9300
depends_on:
- es01
networks:
- esnet
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:6.8.4
container_name: es03
restart: always
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./data/es03:/usr/share/elasticsearch/data
- ./config/es03.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./logs/es03:/usr/share/elasticsearch/logs
#这里再同一台机器部署,需要修改端口
ports:
- 9202:9200
- 9302:9300
depends_on:
- es01
networks:
- esnet

networks:
esnet:

Elasticsearch集群启动的时候,需要主节点启动成功后,其他节点才能启动并join到集群里,因此在配置文件里要保证这一点。在数据节点中添加 “depends_on” 参数的作用为启动顺序,这里指定必须es01节点启动完成后才启动另外两个节点

分别编写每个节点的elasticsearch.yml配置

采用集群架构:三个都是候选主节点,两个数据节点,两个节点的数据相互备份。

节点1,候选主节点& 数据节点

[code]cluster.name: es-cluster
node.name: es01
# true 为候选主节点
node.master: true
# true 为数据节点
node.data: true
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["es01", "es02", "es03"]

http.cors.enabled: true
http.cors.allow-origin: "*"

xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false

action.auto_create_index: .security,.security-6,.monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*,logstash-*

节点2,候选主节点& 数据节点

[code]cluster.name: es-cluster
node.name: es02
# true 为候选主节点
node.master: true
# true 为数据节点
node.data: true
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["es01", "es02", "es03"]

http.cors.enabled: true
http.cors.allow-origin: "*"

xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false

action.auto_create_index: .security,.security-6,.monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*,logstash-*

节点3,候选主节点

[code]cluster.name: es-cluster
node.name: es03
# true 为候选主节点
node.master: true
# true 为数据节点
node.data: false
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["es01", "es02", "es03"]

http.cors.enabled: true
http.cors.allow-origin: "*"

xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false

action.auto_create_index: .security,.security-6,.monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*,logstash-*

使用docker-compose命令部署集群

[code]sudo docker-compose up -d

遇到问题

  • 写入权限问题:当设置挂载目录/data、/logs 时,由于docker容器运行的用户跟宿主机的用户不属于同一个,没有写入的权限,导致启动时报错。这种必须要设置/data、/logs目录,可使用“chmod -R 777 /data /logs” 指令进行授权。

docker-compose安装

  • 安装pip
[code]sudo yum -y install epel-release
sudo yum -y install python-pip
  • 确认版本
[code]sudo pip --version
  • 更新pip
[code]sudo pip install --upgrade pip
  • 安装docker-compose
[code]sudo pip install docker-compose
  • 查看版本
[code]sudo docker-compose version
  • 卸载
[code]sudo pip uninstall docker-compose

安装cerebro监控

[code]sudo docker search cerebro

sudo docker pull yannart/cerebro

sudo docker run -d --name cerebro -p 9000:9000 yannart/cerebro
  • 点赞
  • 收藏
  • 分享
  • 文章举报
powerzy236 发布了1 篇原创文章 · 获赞 0 · 访问量 73 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: