面试题:项目中是如何使用ES(elasticsearch)的?如何优化的?数据量多少?

背景:

面试的时候要是简历上写了elasticsearch,那好巧不巧,面试官对这个一般都很感兴趣,不管你是写了解还是仅仅使用过,都会不假思索的问到你炸。有些人实际上并没有使用过或者只是增删改查,就基本上,唯唯诺诺答不出来什么。笔者就讲讲自己公司里面怎么用es的。

想了解概念的,可以自己查博客或者看看我总结的:

src/main/java/Elasticsearch.java · 游建明/java面试相关的问题解答 - Gitee.com

1. 业务:项目中一般存储企业信息,企业变更信息,企业的各类关联数据。或者存储舆情数据,就是互联网爬虫爬取的网络上的微博,今日头条的热点数据等等。一般我们系统中是对这些数据做AC算法关联词匹配查询,然后对结果分析,对热点事件进行预测。

2. 数据量:看业务吧,企业是近千万家,包含企业的各类变更法人信息等,舆情数据是亿级的,每日入库千万级数据,保留近两个月的数据

3. 集群大小:不同业务集群也不同,一般是三台集群,内存64G,磁盘单台2-4T

4. 优化:企业数据比较侧重于并发读,每日写入不大,但是对数据的可靠性可用性要求高,互联网舆情数据比较侧重于并发写,每日写入量大,但是查询较少,而且允许数据丢失,两种的优化也不一样

5.舆情数据优化:

  1. 增加refresh的时间间隔,默认是1s,一般开到30s
  2. 减少副本数量:es默认为1个,有时候不设置副本或者设置1个,看数据,因为丢失了可以再次爬取,但是设置副本占据的数据量太大了,导致磁盘不够用
  3. 设置es的堆内存,64G的机器,设置为31G,而且最大最小堆内存要设置成一样,避免内部加大内存的消耗
  4. 禁止swap:swap是内存和磁盘的交换,要是发生了会导致卡顿,一般设置锁定内存的参数bootstrap.memory_lock:true
  5. 修改translog的参数:translog是es防止数据丢失的一种策略,可以设置异步刷新到磁盘,而且可以设置的大一点,flush的时间也可以设置的久一点

5. 企业数据优化

  1. 设置分区:三台节点的话,分区最大不应该超过节点数的两倍,所以分区设置为6
  2. 设置副本:副本数设置为3,保证并发查询和可用性
  3. 查询优化
    1. scroll查询:如果要查询大数据量的话,最好避免直接查询,使用scroll翻滚查询,再聚合查询结果
    2. 自动生成id:如果不是业务上的强要求,尽量使用es自己生成id,如果使用特定id,es会检查对应的索引下是否存在相同id,随着文档越来越大,消耗也会越来越大
    3. 少使用nested:创建索引的时候尽量少使用nested类型,并且保证nested类型的字段不能过多,一个document,每一个nested都会生成一个独立的document,影响查询效率,尤其是join的
    4. 批量插入数据使用bulk,bulk默认设置批量提交的数据量不能超过100M

你可能感兴趣的:(java面试,elasticsearch)