Elasticsearch生产环境中的一些问题

1. low water disk

某个节点的硬盘空间超过85%时,es将不会再往该节点分配replica。这在重启后时,会发现集群状态始终是yellow,有一些unassigned shards。此时可以不停机的进行集群配置。

PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.disk.watermark.low": "80%",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
  }
}


使用百分比或者gb数都可以,注意low的值一般要比high的大。


2.  org.elasticsearch.common.breaker.CircuitBreakingException: [FIELDDATA] Data too large

这个Data too large也是经常遇到的问题,究其原因,在于ES配置中提到的FieldData指的是字段数据。当排序(sort),统计(aggs)时,ES把涉及到的字段数据全部读取到内存(JVM Heap)中进行操作。相当于进行了数据缓存,提升查询效率。

JVM中默认使用内存的60%作为上限,当memory_size_in_bytes用到了可用上限,而evictions(驱逐)为0。当下的缓存处于无法有效驱逐的状态,新的缓存数据进不去,老的缓存数据没有被驱逐出来,ES就会报错。

简而言之: 
indices.fielddata.cache.size 配置fieldData的Cache大小,可以配百分比也可以配一个准确的数值。cache到达约定的内存大小时会自动清理,驱逐一部分FieldData数据以便容纳新数据。默认值为unbounded无限。 
indices.fielddata.cache.expire用于约定多久没有访问到的数据会被驱逐,默认值为-1,即无限。expire配置不推荐使用,按时间驱逐数据会大量消耗性能。而且这个设置在不久之后的版本中将会废弃。

看来,Data too large异常就是由于fielddata.cache的默认值为unbounded导致的了。

这是配置文件里的一个bug,所以在配置文件里加上indices.fielddata.cache.size:40%,当使用了40%时,就会驱逐老旧的缓存数据。

注意修改。


3、bool查询和bool过滤的区别

首先,bool查询是将多个子查询语句串联起来,各子查询语句是and关系。只有当一个文档满足布尔查询中的所有子查询条件时,ES才会认为是匹配到了一个文档。布尔查询支持的子查询类型共有四种,分别是:must,should,must_not和filter:

must:and

should:or,一个或多个

must_not:非

filter:过滤器,必须匹配该过滤条件,与must的区别是它不影响score。

其中,最值得注意的地方就是should。通常情况下,should子句是数组字段,包含多个should子查询,默认情况下,匹配的文档必须满足其中一个子查询条件。如果查询需要改变默认匹配行为,查询DSL必须显式设置布尔查询的参数minimum_should_match的值,该参数控制一个文档必须匹配的should子查询的数量,目前遇到的情况是,如果不显示指定,该参数的话,即使should子句中包含两个查询,如果不设置参数minimum_should_match,其默认值是0。建议在布尔查询中,显示设置参数minimum_should_match的值。

很可能造成查询结果与想象结果的不一致性,所以如果写成查询的语句,一定指定参数为1!

我简直是受不了了!!

也就是说,在没有指定minimum_should_match的情况下,匹配到should的文档的得分会更高,仅此而已。


4. 短语查询multi_phrase

当你需要寻找邻近的几个单词时,你会使用match_phrase查询:


GET /my_index/my_type/_search
{
    "query": {
        "match_phrase": {
            "title": "quick brown fox"
        }
    }
}
和match查询类似,match_phrase查询首先解析查询字符串来产生一个词条列表。然后会搜索所有的词条,但只保留含有了所有搜索词条的文档,并且词条的位置要邻接。一个针对短语quick fox的查询不会匹配我们的任何文档,因为没有文档含有邻接在一起的quick和box词条。


5. 新版ES 2.3.1中与原来的1.6版本有很多不一样的地方。

利用plugin在线安装head插件,注意install前面没有“-”

bin/plugin install mobz/elasticsearch-head。


root用户启动问题:

在bin/elasticsearch中修改

ES_JAVA_OPTS="-Des.insecure.allow.root=true"

或者在启动命令中加上bin/elasticsearch -Des.insecure.allow.root=true。


配置文件中network.host:要写成当前的服务器ip,以前默认的是192.168.0.1.


如果网络通信不好,可以指定要去发现的ip或者host,discovery.zen.ping.unicast.hosts: ["host1", "host2"]


你可能感兴趣的:(elasticsearch)