ES的默认设置是综合考虑数据可靠性、搜索实时性、写入速度等因素的,应当根据不同的业务场景进行合理的调整。例如:通过ES查询组合标签下的用户数据场景,不需要非常高的查询效率和不存在高并发的查询请求,但是往往需要周期性地全量或大批量更新用户标签属性数据,这对写入/更新的效率有较高要求。
一、ES部署架构调整
1)V1版本
V1架构中所有的节点充当数据节点或Master节点(通过N/2+1个节点选举产生)角色。
批量数据写入压力测试(总共插入15798265条记录,耗时1h),压测结果如下:
2)V2版本
V2架构由1MasterNode(主节点)+1CoodinatorNode(协调节点)+3DataNode(数据节点)组成。
批量数据写入压力测试(总共插入94697458条记录,耗时3h),压测结果如下:
总结:从压测的效果看,V2架构写入的效率比V1架构的写入效率提高了一倍,V2架构相比V1架构更加协调,V1架构参数设置不合理可能会出现脑裂现象。当然,除了架构上的改变,还有配置项的优化也非常重要。
二、索引过程分析
数据写入过程:
Lucene把每次生成的倒排索引叫做一个段segment,然后另外使用一个commit文件记录索引内所有的segment。
数据写入-->写入ES内存,同时记录到translog-->生成倒排索引分片segment-->将内存中的segment同步到文件系统缓存中,然后再刷写到磁盘。
实时性:
由于内存中的索引分片先同步到文件系统缓存再刷写到磁盘,检索时直接检索文件系统缓存,内存刷写到文件系统缓存默认设置为1秒间隔,对于大多数应用来说,几乎相当于实时可搜索。
数据一致性:
由于ES把数据写入内存的同时,还另外记录了一个translog日志,如果在这期间故障发生ES会从commit位置开始,恢复整个translog文件中的记录,保证数据一致性,等segment刷到磁盘且commit文件进行更新时,translog文件才清空(flush)。
translog容灾:
ES通过translog保证数据一致性,为了保证不丢失数据,每次index、bulk、delete、update完成时,一定触发刷新translog到磁盘上,才给请求返回200状态码,这提高了数据安全性的同时也降低了一点性能。
三、性能优化
1、增加1-2台服务器,用于负载均衡节点;
node.master: false node.data: true
该node服务器只作为数据节点,只用于数据存储和数据查询。
node.master: true node.data: false
该node服务器只作为主节点,不存储任何索引数据,用于协调各种创建索引请求或者查询请求,将这些请求合理分发到相关的node服务器上。
node.master: false node.data: false
该node服务器不会被选作主节点,也不会存储任何索引数据,主要用于查询负载均衡。
2、关闭data节点服务器中的http功能
ES集群中的所有数据节点,不用开启http服务,将其中的配置参数修改为http.enabled: false,同时不安装head、bigdesk、marvel等监控插件,data节点只需要处理创建/更新/删除/查询索引数据等操作。
3、一台服务器上最好只部署一个Node
4、设置合理的分片(shard)数量和副本(replica)数量
index.number_of_shards: 5 index.number_of_replicas: 1,ES默认分片数量为5副本数量为1,每个分片存储数据量约20~40GB,因此需要根据实际数据量来确定分片数,并且确保同一索引的每个分片落在不同的节点上,分片数在索引创建后一次生成后续不可更改,而副本数则可以后续更改。
5、副本数设为0
批量导入索引数据时,可设置副本数为0,等全部索引数据创建完成后再修改副本数。
6、设置索引刷新频率
index.refresh_interval: 120s,索引的刷新频率,默认1秒,太小会造成索引频繁刷新,新的数据写入就慢,可根据实际应用场景设置。
7、锁定内存或关闭swap
当JVM开始写入交换空间时(swapping),ES性能下降,应该确保它不会写入交换空间,可通过设置参数bootstrap.mlockall: true锁定内存或者关闭Linux的swap机制。
8、设置预加载fielddata
9、设置tcp传输时进行数据压缩
10、设置刷新到磁盘的日志量
11、设置参与选举master节点的节点数,防止脑裂
12、调整集群之间节点通信discovery参数
默认超时时间较小,适当把参数调大,避免集群GC时间较长导致节点的失联。
13、关闭广播自动发现节点
14、设置segment合并的限流值
默认情况下,归并线程的限速配置indices.store.throttle.max_bytes_per_sec为20MB,对于写入量较大,磁盘转速较高,可适当调大。
indices.store.throttle.type: merge
indices.store.throttle.max_bytes_per_sec: 100mb
15、调整ES_HEAP_SIZE大小
ES默认堆内存为1GB,在ES启动脚本上设置export ES_HEAP_SIZE=10g或者启动时指定-Xmx10g和-Xms10g。
领取专属 10元无门槛券
私享最新 技术干货