镜像拉取
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