Elastic Beanstalk上的ElasticSearch

我试图让ElasticSearch在Elastic Beanstalk环境中运行。 使用Docker镜像可以让一个实例在负载均衡环境中运行,这相当简单。 但是,当我尝试向集群添加更多实例时,它们无法相互发现,并且每个新实例都成为new_master。

我的Dockerfile如下所示

 FROM dockerfile/java:oracle-java8 RUN ... # Downloading and installing ElasticSearch RUN /elasticsearch/bin/plugin install elasticsearch/elasticsearch-cloud-aws/2.5.0 VOLUME ["/data"] ADD config/elasticsearch.yml /elasticsearch/config/elasticsearch.yml WORKDIR /data CMD ["/elasticsearch/bin/elasticsearch"] EXPOSE 9200 

configurationconfig/elasticsearch.yml如下所示:

 cluster: name: elastic-env-dev cloud: aws: region: ap-southeast-2 discovery: type: ec2 ec2: tag: Name: elastic-env-dev ping_timeout: 120s 

EB环境的名称是elastic-env-dev

可以在EBT上部署ES,这里是如何实现的

http://vladmiller.com/elasticsearch/aws/2015/12/08/deploy-elasticsearch-on-aws-elasticbeanstalk.html


在这一点上(2015年11月14日),花了很多时间之后,我会说在EB上做ES集群是不可能的

问题1是你必须将docker端口映射到主机,就像你会这样做

 docker run -p 9300:9300 ... 

这可以很容易解决,如果你通过.ebextensions添加后将appdeploy挂钩将设置iptables端口转发

 files: "/opt/elasticbeanstalk/hooks/appdeploy/post/99_setup_iptables.sh": mode: "0755" owner: root group: root content: | #!/bin/sh iptables-save | grep -v added_by_ebextension | iptables-restore DOCKER_IP=$(docker inspect `cat /etc/elasticbeanstalk/.aws_beanstalk.current-container-id` | jq -r .[0].NetworkSettings.IPAddress) iptables -t nat -A DOCKER -p tcp --dport 9300:9400 -j DNAT --to-destination ${DOCKER_IP} -m comment --comment added_by_ebextension service iptables save 

问题#2您需要调整安全组,请确保您允许在SG中的节点之间的TCP 9300-9400和ICMP通信。

问题#3使用aws-ec2发现插件并将其限制在您的SG,因此没有其他机器被发现

 // elasticsearch.yml cloud.aws: access_key: YYYYYYYYY secret_key: XXXXXXXXX region: us-east-1 discovery.type: ec2 discovery.ec2.ping_timeout: 30s discovery.ec2.tag.Name: [ENVIRONMENT_NAME] discovery.ec2.host_type: private_dns discovery.zen.ping.multicast.enabled: false 

问题4未解决的是,每个ES节点都会绑定到内部的docker IP地址,类似于172.17.0.3 ,但是您的主机私有IP是不同的。 因此,当节点发现彼此并开始通信时,他们会向其他人报告错误的IP地址。

 [2015-11-13 21:50:58,542][TRACE][discovery.zen.ping.unicast] [86ac0ad55d5b] [2] received response from {#zen_unicast_21_#cloud-i-8c317a3b-0#}{10.165.71.177}{ip-10-165-71-177.ec2.internal/10.165.71.177:9300}: [ping_response{node [{86ac0ad55d5b}{U3PF5qOaQCucpK3JfZ3ARA}{172.17.0.3}{172.17.0.3:9300}], id[5], master [null], hasJoinedOnce [false], cluster_name[es-staging]}, ping_response{node [{86ac0ad55d5b}{U3PF5qOaQCucpK3JfZ3ARA}{172.17.0.3}{172.17.0.3:9300}], id[7], master [null], hasJoinedOnce [false], cluster_name[es-staging]}, ping_response{node [{86ac0ad55d5b}{U3PF5qOaQCucpK3JfZ3ARA}{172.17.0.3}{172.17.0.3:9300}], id[9], master [null], hasJoinedOnce [false], cluster_name[es-staging]}, ping_response{node [{86ac0ad55d5b}{U3PF5qOaQCucpK3JfZ3ARA}{172.17.0.3}{172.17.0.3:9300}], id[11], master [null], hasJoinedOnce [false], cluster_name[es-staging]}, ping_response{node [{89764d1bb185}{yVRC-HmIQoayIuWfi6a09g}{172.17.0.3}{172.17.0.3:9300}], id[30], master [{89764d1bb185}{yVRC-HmIQoayIuWfi6a09g}{172.17.0.3}{172.17.0.3:9300}], hasJoinedOnce [true], cluster_name[es-staging]}] 

你可以看到在ip-10-165-71-177.ec2.internal / 10.165.71.177:9300上发现的那个节点,但是那个节点回答说它的IP是172.17.0.3,因此第一个节点,而不是连接到EC2私有IP将尝试连接到内部的Docker IP

 [2015-11-13 21:51:00,037][TRACE][discovery.ec2 ] [86ac0ad55d5b] full ping responses: --> ping_response{node [{89764d1bb185}{yVRC-HmIQoayIuWfi6a09g}{172.17.0.3}{172.17.0.3:9300}], id[30], master [{89764d1bb185}{yVRC-HmIQoayIuWfi6a09g}{172.17.0.3}{172.17.0.3:9300}], hasJoinedOnce [true], cluster_name[es-staging]} [2015-11-13 21:51:00,041][DEBUG][discovery.ec2 ] [86ac0ad55d5b] filtered ping responses: (filter_client[true], filter_data[false]) --> ping_response{node [{89764d1bb185}{yVRC-HmIQoayIuWfi6a09g}{172.17.0.3}{172.17.0.3:9300}], id[30], master [{89764d1bb185}{yVRC-HmIQoayIuWfi6a09g}{172.17.0.3}{172.17.0.3:9300}], hasJoinedOnce [true], cluster_name[es-staging]} 

我们需要以某种方式使ES绑定到主机的IP地址或忽略这些docker的IP地址,并继续发现的IP。


更新1我怀疑你可以将ES部署到没有Docker的EB,但是我还没有尝试过这个选项。


更新2我能够使节点相互发现并尝试进行通信,但现在它有一个不同的问题


更新3这里是关于如何实现所需的效果的故事和示例代码http://vladmiller.com/elasticsearch/aws/2015/12/08/deploy-elasticsearch-on-aws-elasticbeanstalk.html

1)检查您的实例安全组,为了使ES实例彼此交谈,他们必须使用端口9300

2)AWS不允许多播。 您必须在elasticsearchconfiguration中禁用多播

将此行添加到每个ESconfiguration中的configuration

 discovery.zen.ping.multicast.enabled: false 

如果这不起作用,请尝试添加单播configuration

 discovery.zen.ping.unicast.hosts: loadbalancer.address 

3)记住实例上的安全组必须允许来自ELB的9300

 Custom TCP Rule TCP 9300 amazon-elb/sg-123456ed (amazon-elb-sg) 

4)使用telnet检查ES实例之间的通信

 telnet ip_address 9300