如何插入托管在 Google Cloud (bitnami) 上的 Elasticsearch
Posted
技术标签:
【中文标题】如何插入托管在 Google Cloud (bitnami) 上的 Elasticsearch【英文标题】:How to insert into Elasticsearch hosted on Google Clouds (bitnami) 【发布时间】:2016-06-17 03:52:08 【问题描述】:抱歉,我对 Google Clouds 和 Elasticsearch 还很陌生,但我没有找到任何关于此的文档。基本上,我们只是使用 Bitnami 在 Google Cloud 上部署了一个 Elasticsearch 节点。但我无法用 Python 连接到它。我为下面的代码尝试了很多不同的公式(主机是谷歌云节点外部 IP,用户和密码是 Bitnami 要求连接到我的应用程序的那些)。有人可以让我知道它来自哪里以及正确的语法是什么吗?
from elasticsearch import Elasticsearch
connection_parameters = ['host': 'http://104.196.x.x', 'port': 80]
es = Elasticsearch(connection_parameters, http_auth=('user', 'password'))
print(es.info())
这是错误:
elasticsearch.exceptions.ConnectionError: ConnectionError(<urllib3.connection.HTTPConnection object at 0x7f72e757a090>: Failed to establish a new connection: [Errno -2] Name or service not known) caused by: NewConnectionError(<urllib3.connection.HTTPConnection object at 0x7f72e757a090>: Failed to establish a new connection: [Errno -2] Name or service not known)
如果您能帮助我,非常感谢!
【问题讨论】:
这可能是由您的连接中的身份验证错误引起的。看起来 ElasticSearch 正在使用 urllib3 来建立 HTTP 连接,我特别记得在使用 GAE 时遇到过类似的问题。为了建立我的联系,我不得不打开verify=False
或类似的东西(已经有一段时间了)。另外,您确定 ElasticSearch 在端口 80 上提供服务吗?
您好,感谢您的回答。我试过了,但没有用。
我敢打赌它是端口号,然后才是问题所在。这个 ElasticSearch 服务器是否也在您的 GCE 上运行? GCE 有时可能不喜欢传出的 HTTP 请求,尽管根据我的经验,GAE 通常对此没有任何问题。 GCE 中可能有一些选项可以让您控制允许的端口。
是的,Elastic 正在 GCE 上运行。我确保所有端口都打开(tcp:80; tcp:9200; tcp:9300)并且允许 HTTP 流量...
【参考方案1】:
看来问题出在您在 Google Compute Engine 上的防火墙规则上。您需要明确允许来自 Google 外部的流量到您的 ES 节点。
您可以使用 Google Cloud SDK [1] 创建新的防火墙规则:
gcloud compute firewall-rules create allow-traffic-to-es --allow tcp:80,tcp:443 --source-ranges 0.0.0.0/0 --target-tags es
请注意,此规则将允许从 (0.0.0.0/0) 到您的 ElasticSearch 集群的流量,因此您可能会实施更严格的 CIDR 范围。
[1]Google Cloud SDK
【讨论】:
嗨,不幸的是,流量已经被允许:'bitnami-elasticsearch-2-2-0-0-firewall 网络默认源过滤器允许来自任何源(0.0.0.0/0)允许的协议和端口tcp:80 tcp:443' @Barrec - 您是否尝试连接到端口 9200?当然,您还需要在防火墙中允许此端口。 嗨,是的,我做到了,但仍然没有工作。也许我确实错过了弹性搜索配置中的某些内容? 你确定你在 elasticsearch conf 中的主机配置绑定到 0.0.0.0 了吗? 也可以:network.host: 0.0.0.0 network.publish_host: 10.240.0.4 transport.tcp.port: 9300 http.port: 9200 cluster.name: elastic-pool-dev
【参考方案2】:
我认为您应该像这样排除连接字符串的协议部分:
connection_parameters = ['host': '104.196.x.x', 'port': 80]
或者这样:
es = Elasticsearch(['http://user:f00b4r42@104.196.x.x:80/elasticsearch'])
【讨论】:
以上是关于如何插入托管在 Google Cloud (bitnami) 上的 Elasticsearch的主要内容,如果未能解决你的问题,请参考以下文章
如何在已部署的 Cloud Run Service(托管)中使用 Google Secret?
如何在 MySQL Workbench 中使用 REGEXP_SUBSTR 或 REGEXP_EXTRACT 以及托管在 Google Cloud SQL 上的数据库?
从 Google Cloud Datalab 向 BigQuery 插入数据时如何调试解析错误?