Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 弹性豆茎的弹性研究_Amazon Web Services_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Docker_Amazon Elastic Beanstalk - Fatal编程技术网 elasticsearch,docker,amazon-elastic-beanstalk,Amazon Web Services,elasticsearch,Docker,Amazon Elastic Beanstalk" /> elasticsearch,docker,amazon-elastic-beanstalk,Amazon Web Services,elasticsearch,Docker,Amazon Elastic Beanstalk" />

Amazon web services 弹性豆茎的弹性研究

Amazon web services 弹性豆茎的弹性研究,amazon-web-services,elasticsearch,docker,amazon-elastic-beanstalk,Amazon Web Services,elasticsearch,Docker,Amazon Elastic Beanstalk,我正在尝试让ElasticSearch在ElasticBeanstalk环境中运行。使用Docker映像,在负载平衡的环境中运行一个实例非常简单。但是,当我尝试向集群添加更多实例时,它们无法相互发现,每个新实例都成为新的_主节点 我的Dockerfile如下所示 FROM dockerfile/java:oracle-java8 RUN ... # Downloading and installing ElasticSearch RUN /elasticsearch/bin/plugin ins

我正在尝试让ElasticSearch在ElasticBeanstalk环境中运行。使用Docker映像,在负载平衡的环境中运行一个实例非常简单。但是,当我尝试向集群添加更多实例时,它们无法相互发现,每个新实例都成为新的_主节点

我的
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
配置
config/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

1)检查您的实例安全组,为了使ES实例能够相互通信,它们必须使用端口9300

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

将此行添加到每个ES配置的配置中

discovery.zen.ping.multicast.enabled: false
如果不起作用,请尝试添加单播配置

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
可以在EBT上部署ES,下面是如何


此时(2015年11月14日),在花了大量时间之后,我会说,让ES集群在EB上工作是不可能的

问题#1是您必须将docker端口映射到主机,就像您要做的那样

docker run -p 9300:9300 ...
如果您添加post-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我怀疑您可以在不使用Docker的情况下将ES部署到EB,但我尚未尝试此选项


更新2我能够让节点发现彼此并尝试通信,但现在它有了一个



更新3以下是关于如何实现预期效果的故事和示例代码

我忘了您还必须在docker文件上公开端口9300,直到这里天黑为止。不能
telnet
到任何东西,甚至到同一台机器,除非我使用来自
sudo docker inspect的IP…|grep IP
。随机猜测,是否由未映射IPv4引起?一个可疑行是
bound\u address{inet[/0:0:0:0:0:0:9300]},publish\u address{inet[/172.17.0.5:9300]}
安全组是否允许端口9300?还要将其添加到config:network.host:ec2:privateIpv4@RăzvanPetruescu您无法连接到本地实例IP,因为docker的端口未映射到主机。AWS为每个VPS运行一个容器。您可以创建appdeploy post钩子,它将通过iptables映射IP,但是还有一个问题我不知道如何解决。你可以在这里读到,vladmiller.com的链接断了。该博客是否已被转载到其他地方?Vlad已打开代码,可以访问该博客