docker Elasticsearch单机部署与集群部署
镜像拉取
[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
- 点赞
- 收藏
- 分享
- 文章举报
- 基于 Docker 快速部署 Elasticsearch 集群
- 使用docker快速部署Elasticsearch集群的方法
- Docker部署Elasticsearch集群
- 云计算学习总结(1)——PaaS云平台部署之在Centos7搭建Mesos+Zookeeper+Marathon+Docker单机集群
- elasticsearch6.2.3安装以及单机集群部署
- Elasticsearch单机双节点集群部署实战
- 使用 Docker 部署和迁移多节点的 ElasticSearch-Logstash-Kibana 集群
- elasticsearch单机部署和集群部署
- Docker容器与容器云之Docker单机集群部署案例
- 使用Docker Compose部署单机TiDB集群时指定版本的一个方法
- centos7 部署Elasticsearch单机/集群并安装head插件实现ES集群的可视化管理
- 基于docker1.7.03.1单机上部署hadoop2.7.3集群
- elasticsearch 单机部署,脱离集群
- 使用 Docker 部署和迁移多节点的 ElasticSearch-Logstash-Kibana 集群
- 基于 DOCKER 快速部署 ELASTICSEARCH 集群-集成IK分词器
- 使用Docker Compose部署基于Sentinel的高可用Redis集群
- ElasticSearch 系列 (2) 集群安装部署
- 部署 Kubernetes 集群日志插件 Fluentd、Elasticsearch、Kibana
- 在单机上实现ZooKeeper伪机群/伪集群部署
- 用 vagrant 快速部署 docker 虚拟机集群