elasticsearch的集群方式就那么几种,一个是直接用nginx、haproxy这样的负载均衡在集群的调度。另一种是用siniff方式自动嗅探。
这里简单说下,在python语言下创建elasticsearch连接时,遇到的一些小问题。
query filtered
Traceback (most recent call last):
File “es.py”, line 60, in <module>
“range” : { “idate” : { “gte” : “2015-02-01″,”lte”:”2015-02-03″}}
File “/Library/Python/2.7/site-packages/elasticsearch/client/utils.py”, line 68, in _wrapped
return func(*args, params=params, **kwargs)
File “/Library/Python/2.7/site-packages/elasticsearch/client/__init__.py”, line 497, in search
params=params, body=body)
File “/Library/Python/2.7/site-packages/elasticsearch/transport.py”, line 307, in perform_request
status, headers, data = connection.perform_request(method, url, params, body, ignore=ignore, timeout=timeout)
File “/Library/Python/2.7/site-packages/elasticsearch/connection/http_urllib3.py”, line 79, in perform_request
raise ConnectionTimeout(‘TIMEOUT’, str(e), e)
elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by – ReadTimeoutError(HTTPConnectionPool(host=u’192.168.1.103′, port=9000): Read timed out. (read timeout=10))
[ruifengyun@devops ~ ]$
这个问题很是明显,是超时timeout的问题,每次进行query的时候,默认是10s的超时的时间,不知道为毛默认为10s,在实际场景下,经常会被error, 个人建议在60s左右。
sniff 的功能我相信大家应该有了解的,可以保证程序的可用性。 如果懒得用haproxy nginx做反向代理,那么可以用sniff 来进行集群探测。 创建对象的时候,引入n个节点,如果一个节点挂掉的话,对于程序没有影响的。
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 )
ES肯定是内网使用的,但是如果为了安全,还是有必要做成证书认证的。 可以自己用openssl生成证书,在创建对象的时候,打开ssl和引入ca证书就可以了。
es = Elasticsearch( ['localhost:443', 'other_host:443'], # turn on SSL use_ssl=True, verify_certs=True, # provide a path to CA certs on disk ca_certs='/path/to/CA_certs' )