ES每日tip往期回顾(第一期)

2022-01-18 10:16:51 浏览数 (1)

  • es中建索引是指创建一个保存数据的目录,用于保存倒排索引,索引创建之后是不可变的(Immutable),只允许新增字段
  • es字段是否索引只能在创建索引时配置,不同于mysql,es不能在字段创建后再给字段“加索引”
  • 索引字段有为“索引(indexed)”和“存储(stored)”两个属性,只有被“索引”的字段才能在查询/排序条件中使用,只有被“存储”的字段才能在请求的时候返回字段内容
  • 必须保证索引字段都存储(stored)才能使用update操作,update原理是先从索引中get到原文档内容,然后与传入的欲更新字段合并,作为一个新的文档index回去,如果有字段不是stored,那么update之后该字段就丢失了
  • 为了提升查询性能,索引文件会假定为不可变文件,在索引时预处理(排序/跳跃表等),因此为了反应数据变化,会有刷新时间的概念(隔多少时间重新打开一次索引文件)
  • es还无法做到资源二级调度(共享线程池/缓存区等,无法按索引隔离资源),所以如果集群内某一个索引发生大量慢查询或者污染缓存区(用低复用率内容踢出其他索引高复用率缓存),会导致search线程池满或者引起gc,阻塞集群内其他索引的响应
  • es每次refresh时需要重新打开所有索引文件(需要解压/刷缓存等),如果索引文件较多且更新频繁,每次refresh的开销会比较大,使机器负载升高,影响查询rt,所以更新频繁的大索引设置的刷新时间会限制到5s以上(实时程度下降),要提高实时性,必须减小索引大小
  • es有window size的概念(from size),每次查询先从每个shard中取window size条数据,然后在集群中某个节点汇聚数据,排序后取size条数据返回,假设有n个shard,有效数据占比 size / (n * (from size)),因此每次查询会限制window size,避免过多垃圾数据加重gc和IO负担,引起慢查询
  • 因为索引文件是不可变的,数据更新需要重新打开索引文件加载,所以任何时刻查询的数据都是打开索引文件当时的快照数据,刷新时间的长短决定了数据的近实时(nrt)程度
  • es有translog,也就是write ahead log,任何操作都是先写translog再入索引文件,避免服务挂的时候数据丢失
  • 不同于search,es的get操作是可以从translog中提取文档的,所以get是个真实时操作,可以拿到刚写入的文档数据

0 人点赞