如何基于Docker部署跨多主机的Elasticsearch集群并实现节点互通
跨主机部署ES Docker集群解决方案
前置准备
- 3台主机IP分别记为:
主机A(es01):192.168.1.10、主机B(es02):192.168.1.11、主机C(es03):192.168.1.12 - 三台主机之间互相放开
9200(ES HTTP服务端口)、9300(ES节点内部通信端口)的入站/出站规则 - 所有主机安装相同版本的Docker、Docker Compose
方案1:主机网络模式(轻量场景首选,无需Docker集群配置)
原来的单机配置用的是本地bridge网络,只能在单主机内通信,改用主机网络后容器直接复用主机IP和端口,不需要额外网络配置,是跨主机部署最简单的实现方式。
你需要把原来的docker-compose拆分为3个独立的配置文件,分别部署到3台主机上:
主机A(运行es01)的docker-compose.yaml
version: '2.2' services: es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0 container_name: es01 environment: - node.name=es01 - cluster.name=es-docker-cluster # 这里填另外两台主机的IP - discovery.seed_hosts=192.168.1.11,192.168.1.12 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 绑定所有网卡,同时对外公布当前主机IP供其他节点发现 - network.host=0.0.0.0 - network.publish_host=192.168.1.10 ulimits: memlock: soft: -1 hard: -1 volumes: - data01:/usr/share/elasticsearch/data # 主机网络模式不需要单独映射端口 network_mode: host volumes: data01: driver: local
主机B(运行es02)的docker-compose.yaml
version: '2.2' services: es02: image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0 container_name: es02 environment: - node.name=es02 - cluster.name=es-docker-cluster # 填另外两台主机的IP - discovery.seed_hosts=192.168.1.10,192.168.1.12 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - network.host=0.0.0.0 - network.publish_host=192.168.1.11 ulimits: memlock: soft: -1 hard: -1 volumes: - data02:/usr/share/elasticsearch/data network_mode: host volumes: data02: driver: local
主机C(运行es03)的docker-compose.yaml
version: '2.2' services: es03: image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0 container_name: es03 environment: - node.name=es03 - cluster.name=es-docker-cluster # 填另外两台主机的IP - discovery.seed_hosts=192.168.1.10,192.168.1.11 - cluster.initial_master_nodes=es01,es02,es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - network.host=0.0.0.0 - network.publish_host=192.168.1.12 ulimits: memlock: soft: -1 hard: -1 volumes: - data03:/usr/share/elasticsearch/data network_mode: host volumes: data03: driver: local
启动后执行curl http://192.168.1.10:9200/_cat/nodes即可看到3个节点均正常加入集群。
方案2:Docker Swarm Overlay网络(适合容器编排场景)
如果需要统一管理多主机容器,可以用Docker Swarm的跨主机overlay网络实现:
- 在主机A执行
docker swarm init,按提示在另外两台主机执行命令加入Swarm集群 - 手动创建跨主机可访问的overlay网络:
docker network create -d overlay --attachable elastic-overlay - 修改原来的docker-compose.yaml,增加部署约束将每个ES节点调度到不同主机,
discovery.seed_hosts仍可直接填节点服务名(overlay网络支持跨主机服务名解析),网络改为创建好的elastic-overlay即可。
注意事项
- 集群第一次启动完成后,可删除
cluster.initial_master_nodes配置,避免后续节点重启时出现选主冲突 - 不要跨主机挂载ES数据卷,ES原生的副本机制已经能保障数据可靠性,跨主机挂载会带来额外的性能损耗和故障风险
- 生产环境建议将ES_JAVA_OPTS调整为物理机内存的一半,最大不要超过31G
内容的提问来源于stack exchange,提问作者minglyu
相关产品推荐
相关产品推荐

