加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 服务器 > 安全 > 正文

百姓网 Elasticsearch 2.x 升级之路

发布时间:2021-01-10 06:07:09 所属栏目:安全 来源:网络整理
导读:《百姓网 Elasticsearch 2.x 升级之路》要点: 本文介绍了百姓网 Elasticsearch 2.x 升级之路,希望对您有用。如果有疑问,可以联系我们。 导读:Elasticsearch 是广泛使用的一个软件,我们邀请了曾经在高可用架构分享过 ES 的王卫华继续分享在升级 Elasticse
副标题[/!--empirenews.page--]

《百姓网 Elasticsearch 2.x 升级之路》要点:
本文介绍了百姓网 Elasticsearch 2.x 升级之路,希望对您有用。如果有疑问,可以联系我们。

导读:Elasticsearch 是广泛使用的一个软件,我们邀请了曾经在高可用架构分享过 ES 的王卫华继续分享在升级 Elasticsearch 过程中的经验.

王卫华,资深开发工程师、架构师,具有 10+ 年互联网从业经验,曾获得微软 2002 – 2009 MVP 荣誉称号.在百姓网近 9 年,负责后端代码开发和 Elasticsearch & Solr 维护工作.现就职于途虎养车.

背景

百姓网使用 Elasticsearch 虽然有用于日志(ELK),但本次分享所涉及 Elasticsearch 升级,是指用于业务系统数据服务的 Elasticsearch 集群.

百姓网是一个分类网站,要提供快速数据查询,我们使用了 Lucene 作为基层的搜索系统,从几年前的 Solr 到 现在使用的 Elasticsearch.为了提供快速的查询响应,我们使用了一个 golang 写的代理系统,代理后面是几个 Elasticsearch 集群,以应对不同查询.

因为集群众多,一次性全部系统升级需要占用一倍的机器,这比较浪费,所以我们采用一个集群一个集群升级,这就需要不同版本的集群同时存在,从 1.0 升级到 1.6/1.7,他们基本查询都相差不大,然而,从 1.x 到 2.x,需要做的事情就很多了.而且很不幸,还有坑.

下面谈谈我们在升级过程所遇到的一些问题和解决之路.

一、Elasticsearch 2.x 变化

1、doc_values

这无疑是 2.x 中最大变化之一,虽然之前也有 doc_values,但是这次是默认开启 doc_values,也说明官方是建议你使用 doc_values 的.

2、Filtered Query

这个已经 deprecated,在 2.x 中你还可以用.但是建议做如下修改

{

“query”: {

“filtered”: {

“query”: {

…….

},

“filter”: {

…….

}

}

}

}

修改为

{

“query”: {

“bool”: {

“must”: {

…….

},

“filter”: {

…….

}

}

}

}

把 query 和 filter 移到 bool 查询的 must 和 filter 参数之中.

3、DeleteByQuery

现在作为一个插件了,而且使用的是 Scroll/Scan & Bulk 来进行安全删除,当然,速度可能慢一些.(./bin/plugin install delete-by-query 安装插件)

4、Facet 已经删除,使用 aggerations 代替.

Aggerations histogram min_doc_count 默认值现在是 0.

5、network.host 默认是 localhost,如果不设置就只能本机访问了.

一般设置为网络设备名称相关,如 eth0,则设置为 _eth0:ipv4,若是 em1,这设置为 _em1:ipv4.

6、Discovery:multicast (组播)因为系统受限的原因,现在从 Elasticsearch 移除.

不过它也可以作为一个插件加入.1.x multicast 默认是启用的,2.x 使用 unicast (单播),需要设置 discovery.zen.ping.unicast.hosts: [“host1:port”,“host2”],以使得集群可以加入相关机器.

7、Store FS: 内存(memory/ram)存储模式被移除.

默认使用 default_fs,是一种 Lucene MMapDirectory 和 NIOFSDirectory 混合的模式,词典文件和 doc values 文件使用 mmap 映射到系统虚拟内存(需要设置 vm.max_map_count=262144),其他的文件(如频率、位置等)使用 nio 文件系统.

8、Mapping 变化

1)同名字段:如果同一个索引中有不同类型的同名字段,那么这两个类型的 mapping 必须一致.并且不能删除 mapping (删了mapping,另一个类型同名字段就没有 mapping 了?).

2)各种 _ 前缀的名称移除了.

3)dot (点)的各种坑,字段名不要包含 dot.

4)字段名最长 255

5)_routing 只能设置为required : true,没有 path 参数.

6)analyzer 现在可以分开设置 index_analyzer 和 search_analyzer.默认设置 analyzer 即为两者(index、search)同一配置.

9、快照的配置 path.repo 要设置白名单(注:是一个数组).

10、Scroll:

1)search_type=scan deprecated,你可以在 scroll 查询时使用 sort:”_doc” 来代替,_doc 排序已经进行了优化,因此它的性能和 scan 相同.

2)search_type=count deprecated,可以设置 size:0 .

11、 Optimize:deprecated.使用 force merge 接口代替.

12、geo_point:percolating 的地理查询移除了.

Percolator docs 是在内存中,不支持 doc_values,而 geo_point(ES 2.2)的一些查询功能需要启用 doc_values.

不过,geo_point 禁用了doc_values,有些一般查询仍然有效.

13、indices.fielddata.cache.expire 配置移除(默认会忽略).

二、升级之路

1、IO 压力增大

2.0 刚出的时候,我们进行了测试,发现 IO 压力有点大.启用比不启用 doc_values,IO 压力要增加一倍以上(测试磁盘非 SSD).

2.0 初始版本,Delete 会导致 IO 压力更大,删除操作会有 translog 等诡异问题.

解决办法:建议升级到较高版本,如 2.2 及以上.

2、Index 速度变慢.

在 1.x 时候,我们没有启用 Bulk 接口,而是使用 Index 接口,升级后发现更新速度比较慢.我们改用 Bulk 接口以解决这个问题.

3、Bulk 接口的问题

如果使用 Bulk 接口来进行删除,建议升级到较高版本,因为 2.0 初始版本 Bulk delete 可以不需要提供 routing,但是这样性能也很差.较高版本修复了这个问题,删除一个 DOC,需要提供 routing.

其实要获得 routing 并不困难,2.x 在你查询的时候,提供的结果中,就有 routing 这个数据,这个对于做删除操作还是比较方便的,不需要进行计算,还能保证在 routing 频繁变化后删除干净.

4、Doc Values

Lucene 索引是一种倒排索引,当需要进行排序或者计算时,需要在内存中使用 fielddata cache 进行计算,极端情况下,可能导致 OOM 或者内存泄露.这时候可以考虑启用 doc_values,这个是索引时候已经进行处理的一种非倒排索引.启用 doc_values,性能有一点损失,但是可以设置较小的 heap size,而留下内存给系统缓存 doc_values 索引,性能几乎相当.

1)启用 doc_values 后,Index size 增加近一倍.

2)启用 doc_values,当进行 aggs,sort 时,减少内存需求,减低 GC 压力.可以设置较小的 heap size.

3)启用 doc_values 后,当 Lucene 索引有效使用系统缓存时,性能几乎相当.

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读