python - elasticsearch python 客户端 - 使用多个节点 - 如何使用嗅探器

标签 python elasticsearch elasticsearch-py

我有一个包含 2 个节点的集群。

我正在尝试了解连接节点的最佳实践,并在一个节点出现停机时检查故障转移。

来自 documentation :

es = Elasticsearch(
    ['esnode1', 'esnode2'],
    # sniff before doing anything
    sniff_on_start=True,
    # refresh nodes after a node fails to respond
    sniff_on_connection_fail=True,
    # and also every 60 seconds
    sniffer_timeout=60
)

所以我尝试像这样连接到我的节点:

client = Elasticsearch([ip1, ip2],sniff_on_start=True, sniffer_timeout=10,sniff_on_connection_fail=True)

其中 ip1/ip2 是机器 ip(例如 10.0.0.1、10.0.0.2)

为了测试它,我终止了 ip2(如果不存在则不存在) 现在,当我尝试连接时,我总是得到:

TransportError: TransportError(N/A, 'Unable to sniff hosts - no viable hosts found.') 

即使 ip1 存在并且已经存在。

如果我尝试这样连接:

es = Elasticsearch([ip1, ip2])

然后我可以在日志中看到,如果客户端没有从 ip2 获得任何响应,它将移动到 ip1,并返回有效响应。

我是不是漏掉了什么?我认为通过嗅探,如果其中一个节点关闭,客户端不会抛出任何异常,并继续使用事件节点(直到下一次嗅探)

更新: 每当我将 sniff 设置为“True”时,我都会出现这种行为:

----> 1 client = Elasticsearch([ip1, ip2],sniff_on_start=True)

/usr/local/lib/python2.7/dist-packages/elasticsearch/client/__init__.pyc in __init__(self, hosts, transport_class, **kwargs)
    148             :class:`~elasticsearch.Connection` instances.
    149         """
--> 150         self.transport = transport_class(_normalize_hosts(hosts), **kwargs)
    151 
    152         # namespaced clients for compatibility with API names

/usr/local/lib/python2.7/dist-packages/elasticsearch/transport.pyc in __init__(self, hosts, connection_class, connection_pool_class, host_info_callback, sniff_on_start, sniffer_timeout, sniff_timeout, sniff_on_connection_fail, serializer, serializers, default_mimetype, max_retries, retry_on_status, retry_on_timeout, send_get_body_as, **kwargs)
    128 
    129         if sniff_on_start:
--> 130             self.sniff_hosts(True)
    131 
    132     def add_connection(self, host):

/usr/local/lib/python2.7/dist-packages/elasticsearch/transport.pyc in sniff_hosts(self, initial)
    235         # transport_schema or host_info_callback blocked all - raise error.
    236         if not hosts:
--> 237             raise TransportError("N/A", "Unable to sniff hosts - no viable hosts found.")
    238 
    239         self.set_connections(hosts)

最佳答案

您需要将 sniff_timeout 设置为比默认值更高的值(如果没记错则为 0.1)。

这样试试

es = Elasticsearch(
    ['esnode1', 'esnode2'],
    # sniff before doing anything
    sniff_on_start=True,
    # refresh nodes after a node fails to respond
    sniff_on_connection_fail=True,
    # and also every 60 seconds
    sniffer_timeout=60,
    # set sniffing request timeout to 10 seconds
    sniff_timeout=10
)

关于python - elasticsearch python 客户端 - 使用多个节点 - 如何使用嗅探器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39640200/

相关文章:

php - 如何使用PHP API分析字符串

elasticsearch - SonarQube:嵌入式elasticsearch配置位置

elasticsearch - 无法将主题映射到kafka elasticsearch连接器中的指定索引

elasticsearch - 两个聚合的Elasticsearch共同点

python - Elasticsearch不允许我添加较长的字典[TransportError(400)]

python - Linux : file descriptors from os. pipe() 没有出现在/dev/fd

python - 在python中按行对二维数组进行排序

python - Django 中的 Bootstrap 崩溃问题

python - python 中的 mininet dpctl mod-port

javascript - 有没有办法从一个别名下的所有索引中获得一个统一的映射?