docker Elasticsearch单机部署与集群部署

镜像拉取

docker pull docker.elastic.co/elasticsearch/elasticsearch:6.8.4

开发者模式启动elasticsearch

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

指定参数运行

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

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脚本


#!/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

拉取镜像

docker pull mobz/elasticsearch-head:5

运行容器

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要求比较高。

创建结构目录

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

编写docker-compose.yml文件

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,候选主节点& 数据节点

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,候选主节点& 数据节点

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,候选主节点

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命令部署集群

sudo docker-compose up -d 

遇到问题

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

docker-compose安装

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

安装cerebro监控

sudo docker search cerebro 

sudo docker pull yannart/cerebro 

sudo docker run -d --name cerebro -p 9000:9000 yannart/cerebro
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值