【问题标题】:How to setup a 3-node Elasticsearch cluster on a single AWS EC2 instance?如何在单个 AWS EC2 实例上设置 3 节点 Elasticsearch 集群?
【发布时间】:2019-11-05 22:18:54
【问题描述】:

我目前正在尝试使用 docker-compose 文件在 单个 EC2 实例(即仅使用一个实例)上部署 3 节点 Elasticsearch 集群。问题是我无法让 3 个节点相互通信以形成集群。

在我的 Windows 10 机器上,我使用了官方的 Elasticsearch:6.4.3 映像,而对于 AWS EC2,我使用的是自定义 Elasticsearch:6.4.3 映像,其中安装了 ec2-discovery 插件使用“docker build -t mdasri/eswithec2disc .”命令构建。参考下面的dockerfile。

dockerfile:

FROM docker.elastic.co/elasticsearch/elasticsearch:6.4.3

RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch discovery-ec2

我成功地在我的 Windows 10 机器上使用 docker-compose 在本地设置了 3 节点 Elasticsearch 集群。在我的 docker-compose 文件中,我有 3 个不同的 Elasticsearch 服务来组成 3 个节点:es01、es02、es03。我希望使用相同的 docker-compose 文件在 AWS EC2 实例上设置集群,但我遇到了错误。

我正在使用“ecs-cli compose -f docker-compose.yml up”命令部署到 AWS EC2。 ecs-cli compose 的状态为:“Started container...”。

为了检查集群状态,我输入了 x.x.x.x/_cluster/health?pretty,但遇到了这个错误:

{
  "error" : {
    "root_cause" : [
      {
        "type" : "master_not_discovered_exception",
        "reason" : null
      }
    ],
    "type" : "master_not_discovered_exception",
    "reason" : null
  },
  "status" : 503
}

当我在 ssh 进入后评估 EC2 实例中的每个 docker 容器日志时,这是我在 ALL 3 个容器中遇到的错误:

[2019-06-24T06:19:43,880][WARN][o.e.d.z.UnicastZenPing][es01] 无法解析主机 [es02]

这是我用于各自 AWS EC2 服务的 docker-compose 文件

version: '2'
services:

es01:
image: mdasri/eswithec2disc
container_name: es01
cpu_shares: 100
mem_limit: 2147482548

ulimits:
  memlock:
    soft: -1
    hard: -1
  nofile:
    soft: 65536
    hard: 65536

ports:
  - "9200:9200"
  - "9300:9300"

environment:
  - "cluster.name=aws-cluster"
  - "node.name=es01"
  - "node.master=true"
  - "node.data=false"
  - "discovery.zen.hosts_provider=ec2"
  - "discovery.zen.ping.unicast.hosts=es01, es02"
  - "discovery.zen.minimum_master_nodes=2"
  - "ES_JAVA_OPTS= -Xmx256m -Xms256m"
  - "bootstrap.memory_lock=true"

volumes:
  - /usr/share/elasticsearch/data

networks:
  - esnet

es02:
image: mdasri/eswithec2disc
container_name: es02
cpu_shares: 100
mem_limit: 2147482548

ulimits:
  memlock:
    soft: -1
    hard: -1
  nofile:
    soft: 65536
    hard: 65536

environment:
  - "cluster.name=aws-cluster"
  - "node.name=es02"
  - "node.master=true"
  - "node.data=false"
  - "discovery.zen.hosts_provider=ec2"
  - "discovery.zen.ping.unicast.hosts=es01, es02"
  - "ES_JAVA_OPTS= -Xmx256m -Xms256m"
  - "bootstrap.memory_lock=true"

volumes:
  - /usr/share/elasticsearch/data

networks:
  - esnet
es03:
image: mdasri/eswithec2disc
container_name: es03
cpu_shares: 100
mem_limit: 2147482548

ulimits:
  memlock:
    soft: -1
    hard: -1
  nofile:
    soft: 65536
    hard: 65536

environment:
  - "cluster.name=aws-cluster"
  - "node.name=es03"
  - "node.master=false"
  - "node.data=true"
  - "discovery.zen.hosts_provider=ec2"
  - "discovery.zen.ping.unicast.hosts=es01,es02"
  - "ES_JAVA_OPTS= -Xmx256m -Xms256m"
  - "bootstrap.memory_lock=true"

volumes:
  - /usr/share/elasticsearch/data

networks:
  - esnet

networks:
  esnet:

请帮助我,因为在过去的 1-2 周里我一直被这个问题困扰。 P.S:请让我知道你们还需要什么其他信息。谢谢!

【问题讨论】:

  • 在您的docker-compose 中使用link 以便能够解析主机名
  • 嗨@LinSel,请详细说明;比如我应该把link放在哪里或如何?
  • 此外,您还需要为es01 - "discovery.zen.ping.unicast.hosts=es02,es03" es02 - "discovery.zen.ping.unicast.hosts=es01,es03" 提供主机,所有这些都没有空格。

标签: docker elasticsearch amazon-ec2 docker-compose


【解决方案1】:

您需要在docker-compose 中配置links 才能解析:

来自 docker-compose 文档:

链接到另一个服务中的容器。要么指定服务名称和链接别名 (SERVICE:ALIAS),要么只指定服务名称。

web:
  links:
   - db
   - db:database
   - redis

还可以查看@Mishi.Srivastava 的评论

【讨论】:

  • 嗨@LinSel,感谢您的及时回复。我按照你提到的做了,但是却遇到了另一个错误。例如,对于 es01,` 链接:- es02 - es03 ` 但是遇到错误ClientException: Container links should not have a cycle
  • 如果您使用 aws-cli,请参阅此问题:stackoverflow.com/questions/48907012/…
  • 不,我使用了 ecs-cli compose -f dockercompose.yml up 并且我使用的文件是 docker-compose 文件,请注意,服务定义都已定义,与原帖相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多