经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Docker » 查看文章
使用docker快速部署Elasticsearch集群的方法
来源:jb51  时间:2019/3/22 12:08:46  对本文有异议

本文将使用Docker容器(使用docker-compose编排)快速部署Elasticsearch 集群,可用于开发环境(单机多实例)或生产环境部署。

注意,6.x版本已经不能通过 -Epath.config 参数去指定配置文件的加载位置,文档说明:

For the archive distributions, the config directory location defaults to $ES_HOME/config. The location of the >config directory can be changed via the ES_PATH_CONF environment variable as follows:
ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch
Alternatively, you can export the ES_PATH_CONF environment variable via the command line or via your shell profile.

即交给环境变量 ES_PATH_CONF 来设定了(官方文档),单机部署多个实例且不使用容器的同学多多注意。

准备工作

安装 docker & docker-compose

这里推进使用 daocloud 做个加速安装:

  1. #docker
  2. curl -sSL https://get.daocloud.io/docker | sh
  3.  
  4. #docker-compose
  5. curl -L https://get.daocloud.io/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  6.  
  7. chmod +x /usr/local/bin/docker-compose
  8.  
  9. #查看安装结果
  10. docker-compose -v

数据目录

  1. #创建数据/日志目录 这里我们部署3个节点
  2. mkdir /opt/elasticsearch/data/{node0,nod1,node2} -p
  3. mkdir /opt/elasticsearch/logs/{node0,nod1,node2} -p
  4. cd /opt/elasticsearch
  5. #权限我也很懵逼啦 给了 privileged 也不行 索性0777好了
  6. chmod 0777 data/* -R && chmod 0777 logs/* -R
  7.  
  8. #防止JVM报错
  9. echo vm.max_map_count=262144 >> /etc/sysctl.conf
  10. sysctl -p

docker-compse 编排服务

创建编排文件

vim docker-compose.yml

参数说明

- cluster.name=elasticsearch-cluster

集群名称

- node.name=node0
- node.master=true
- node.data=true

节点名称、是否可作为主节点、是否存储数据

- bootstrap.memory_lock=true

锁定进程的物理内存地址避免交换(swapped)来提高性能

- http.cors.enabled=true
- http.cors.allow-origin=*

开启cors以便使用Head插件

- "ES_JAVA_OPTS=-Xms512m -Xmx512m"

JVM内存大小配置

- "discovery.zen.ping.unicast.hosts=elasticsearch_n0,elasticsearch_n1,elasticsearch_n2"
- "discovery.zen.minimum_master_nodes=2"

由于5.2.1后的版本是不支持多播的,所以需要手动指定集群各节点的tcp数据交互地址,用于集群的节点发现failover,默认缺省9300端口,如设定了其它端口需另行指定,这里我们直接借助容器通信,也可以将各节点的9300映射至宿主机,通过网络端口通信。

设定failover选取的quorum = nodes/2 + 1

当然,也可以挂载自己的配置文件,ES镜像的配置文件是/usr/share/elasticsearch/config/elasticsearch.yml,挂载如下:

  1. volumes:
  2. - path/to/local/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro

docker-compose.yml

  1. version: '3'
  2. services:
  3. elasticsearch_n0:
  4. image: elasticsearch:6.6.2
  5. container_name: elasticsearch_n0
  6. privileged: true
  7. environment:
  8. - cluster.name=elasticsearch-cluster
  9. - node.name=node0
  10. - node.master=true
  11. - node.data=true
  12. - bootstrap.memory_lock=true
  13. - http.cors.enabled=true
  14. - http.cors.allow-origin=*
  15. - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  16. - "discovery.zen.ping.unicast.hosts=elasticsearch_n0,elasticsearch_n1,elasticsearch_n2"
  17. - "discovery.zen.minimum_master_nodes=2"
  18. ulimits:
  19. memlock:
  20. soft: -1
  21. hard: -1
  22. volumes:
  23. - ./data/node0:/usr/share/elasticsearch/data
  24. - ./logs/node0:/usr/share/elasticsearch/logs
  25. ports:
  26. - 9200:9200
  27. elasticsearch_n1:
  28. image: elasticsearch:6.6.2
  29. container_name: elasticsearch_n1
  30. privileged: true
  31. environment:
  32. - cluster.name=elasticsearch-cluster
  33. - node.name=node1
  34. - node.master=true
  35. - node.data=true
  36. - bootstrap.memory_lock=true
  37. - http.cors.enabled=true
  38. - http.cors.allow-origin=*
  39. - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  40. - "discovery.zen.ping.unicast.hosts=elasticsearch_n0,elasticsearch_n1,elasticsearch_n2"
  41. - "discovery.zen.minimum_master_nodes=2"
  42. ulimits:
  43. memlock:
  44. soft: -1
  45. hard: -1
  46. volumes:
  47. - ./data/node1:/usr/share/elasticsearch/data
  48. - ./logs/node1:/usr/share/elasticsearch/logs
  49. ports:
  50. - 9201:9200
  51. elasticsearch_n2:
  52. image: elasticsearch:6.6.2
  53. container_name: elasticsearch_n2
  54. privileged: true
  55. environment:
  56. - cluster.name=elasticsearch-cluster
  57. - node.name=node2
  58. - node.master=true
  59. - node.data=true
  60. - bootstrap.memory_lock=true
  61. - http.cors.enabled=true
  62. - http.cors.allow-origin=*
  63. - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  64. - "discovery.zen.ping.unicast.hosts=elasticsearch_n0,elasticsearch_n1,elasticsearch_n2"
  65. - "discovery.zen.minimum_master_nodes=2"
  66. ulimits:
  67. memlock:
  68. soft: -1
  69. hard: -1
  70. volumes:
  71. - ./data/node2:/usr/share/elasticsearch/data
  72. - ./logs/node2:/usr/share/elasticsearch/logs
  73. ports:
  74. - 9202:9200

这里我们分别为node0/node1/node2开放宿主机的9200/9201/9202作为http服务端口,各实例的tcp数据传输用默认的9300通过容器管理通信。

如果需要多机部署,则将EStransport.tcp.port: 9300端口映射至宿主机xxxx端口,discovery.zen.ping.unicast.hosts填写各主机代理的地址即可:

  1. #比如其中一台宿主机为192.168.1.100
  2. ...
  3. - "discovery.zen.ping.unicast.hosts=192.168.1.100:9300,192.168.1.101:9300,192.168.1.102:9300"
  4. ...
  5. ports:
  6. ...
  7. - 9300:9300

创建并启动服务

  1. [root@localhost elasticsearch]# docker-compose up -d
  2. [root@localhost elasticsearch]# docker-compose ps
  3. Name Command State Ports
  4. --------------------------------------------------------------------------------------------
  5. elasticsearch_n0 /usr/local/bin/docker-entr ... Up 0.0.0.0:9200->9200/tcp, 9300/tcp
  6. elasticsearch_n1 /usr/local/bin/docker-entr ... Up 0.0.0.0:9201->9200/tcp, 9300/tcp
  7. elasticsearch_n2 /usr/local/bin/docker-entr ... Up 0.0.0.0:9202->9200/tcp, 9300/tcp
  8.  
  9. #启动失败查看错误
  10. [root@localhost elasticsearch]# docker-compose logs
  11. #最多是一些访问权限/JVM vm.max_map_count 的设置问题

查看集群状态

192.168.20.6 是我的服务器地址

访问http://192.168.20.6:9200/_cat/nodes?v即可查看集群状态:

  1. ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
  2. 172.25.0.3 36 98 79 3.43 0.88 0.54 mdi * node0
  3. 172.25.0.2 48 98 79 3.43 0.88 0.54 mdi - node2
  4. 172.25.0.4 42 98 51 3.43 0.88 0.54 mdi - node1

验证 Failover

通过集群接口查看状态

模拟主节点下线,集群开始选举新的主节点,并对数据进行迁移,重新分片。

  1. [root@localhost elasticsearch]# docker-compose stop elasticsearch_n0
  2. Stopping elasticsearch_n0 ... done

集群状态(注意换个http端口 原主节点下线了),down掉的节点还在集群中,等待一段时间仍未恢复后就会被剔出

  1. ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
  2. 172.25.0.2 57 84 5 0.46 0.65 0.50 mdi - node2
  3. 172.25.0.4 49 84 5 0.46 0.65 0.50 mdi * node1
  4. 172.25.0.3 mdi - node0

等待一段时间

  1. ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
  2. 172.25.0.2 44 84 1 0.10 0.33 0.40 mdi - node2
  3. 172.25.0.4 34 84 1 0.10 0.33 0.40 mdi * node1

恢复节点 node0

  1. [root@localhost elasticsearch]# docker-compose start elasticsearch_n0
  2. Starting elasticsearch_n0 ... done

等待一段时间

  1. ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
  2. 172.25.0.2 52 98 25 0.67 0.43 0.43 mdi - node2
  3. 172.25.0.4 43 98 25 0.67 0.43 0.43 mdi * node1
  4. 172.25.0.3 40 98 46 0.67 0.43 0.43 mdi - node0

配合 Head 插件观察

  1. git clone git://github.com/mobz/elasticsearch-head.git
  2. cd elasticsearch-head
  3. npm install
  4. npm run start

集群状态图示更容易看出数据自动迁移的过程

1、集群正常 数据安全分布在3个节点上

2、下线 node1 主节点 集群开始迁移数据

迁移中

迁移完成

3、恢复 node1 节点

问题小记

elasticsearch watermark

部署完后创建索引发现有些分片处于 Unsigned 状态,是由于 elasticsearch watermark:low,high,flood_stage的限定造成的,默认硬盘使用率高于85%就会告警,开发嘛,手动关掉好了,数据会分片到各节点,生产自行决断。

  1. curl -X PUT http://192.168.20.6:9201/_cluster/settings -H 'Content-type':'application/json' -d '{"transient":{"cluster.routing.allocation.disk.threshold_enabled": false}}'

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号