更换ElasticSearch版本6.3-7.6导致的问题

项目中使用的es需要迁移,之前是由亚马逊提供的服务现在改为使用运维自建库,之前AWS提供的es版本是6.3,现在运维自建的ES版本是7.6(PS:正常来说,即便是迁移,项目使用的数据库版本应该是一致的,这里我也很无奈)

代码层面

jar包
6.3版本



    org.elasticsearch.client
    elasticsearch-rest-high-level-client
    6.3.2

7.6版本



    org.elasticsearch.client
    elasticsearch-rest-high-level-client
    7.6.1

不要以为只需要把版本号从6.3.2改为7.6.1就万事大吉了,这俩jar包是互不兼容的
6.X的jar包都无法访问7.X的ES,在6.X版本的ES除了index外还可以用type作为条件,比如这样的搜索语句:
GET /index/type/_search?q=user:kimchy
但是在7.X以后要求搜索语句不能使用type
GET /index/_search?q=user:kimchy
如果使用包含type的搜索语句访问7.X的ES会收到type字段已废弃的异常提示,当然,如果你在6.X中没有使用type作为查询条件,那么这个坑是不会踩的
Java使用elasticsearch-rest-high-level-client必须添加RequestOptions,RequestOptions不会改变ES的搜索过程及结果,只在应用层进行一些处理,如果没什么要改的使用默认构造方法就行,如下所示

SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

ES本身的配置参数

这是一个巨大的坑,公司项目都是采用容器化部署方案,使用的Kubernetes管理容器,恰好ES官方也支持这种部署模式,运维直接拿来搭建,很多配置都使用的默认参数
然而不对照官方文档,忽视了默认参数的变化
在6.X版本的ES每个索引有几个分区,几个副本都可以通过number_of_shards和number_of_replicas分别设置,分区数量默认5,副本数量默认1,但是在7.6的版本中分区数量默认为1,副本数量默认为1,每个节点的JVM heap大小默认1G
援引官方文档:If ES_JAVA_OPTS is not defined, the Elasticsearch default heap size of 1Gi will be in effect.
如果在7.6的版本中仍然使用默认参数去创建索引,数据分布在两个node且JVM堆大小分别只有1G去存储索引数据,在数据量大,且有一定并发的情况下,ES的查询速度是无法满足生产环境需求的
我们需要在es中添加一个模板,以便在新建索引的时候使用可以满足需求的配置

PUT _template/template_1
{
  "index_patterns": ["te*", "bar*"],
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 1
  }
}

index_patterns设置匹配该模板的索引名称,此模板适用于所有te和bar开头的索引,当然也可以使用"index_patterns": ["*"]来匹配所有索引
settings设置了此模板下索引的默认分区数量和副本数量,如果在创建索引时指定了分区数量和副本数量则不会使用默认参数
模板中的设置只对以后创建的索引有效,对已有索引不生效


参考网站

Elasticsearch Reference 7.6

你可能感兴趣的:(更换ElasticSearch版本6.3-7.6导致的问题)