如何优化Elasticsearch数据同步以应对查询?

摘要:Elasticsearch数据同步优化 背景 为了满足项目需求,需要将大量数据的数据写入到ES进行检索,预估数据量是40亿左右,目前需要同步进去的是2亿左右。 ES集群配置 三台128G的国产服务器 国产linux系统 CPU主频低的拉跨
Elasticsearch数据同步优化 背景 为了满足项目需求,需要将大量数据的数据写入到ES进行检索,预估数据量是40亿左右,目前需要同步进去的是2亿左右。 ES集群配置 三台128G的国产服务器 国产linux系统 CPU主频低的拉跨 JDK8的版本 机械硬盘 遇到的问题 后端使用Java调用es的bulk api进行数据同步,数据同步特别慢,在测试环境做同步的时候速度是很快的,但是在正式环境下速度出奇的慢。 直接上优化方案 升级JDK版本 将JDK的版本升级到JDK17(中途先升级到JDK11的),升级之后速度提升明显 JDK8的垃圾回收器到底是比不过JDK17 ES索引的副本数据在数据同步阶段设置为0 多个副本就意味着要多写几份数据 ES索引的分片数量设置为3 和集群数量一致 调整Java调用ES bulk api的代码 使用异步批量调用的方式,后面会详细介绍 经过一阵鼓捣 数据同步速度极大提升, Java调用ES bulk api 首先es是有一个bulk的批量接口的,一般来说做批量数据同步的时候是使用的这个api,实际上还有一种更加灵活的api,在ES7里面是BulkProcessor这个类,在ES8里面是BulkIngester类,两者功能基本一致。 先说一下这两个api的工作原理 bulk api 接收到批量数据之后 会立即将数据提交给es集群,es集群如果在使用默认写入配置的情况下,会很快将数据进行落盘的,数据落盘的这个过程是比较耗时的。
阅读全文