elasticsearch 1.x集群优化

来源:互联网 发布:平原烈火读后感知乎 编辑:程序博客网 时间:2024/06/05 06:18

设置 Filter cache

缓存是提高性能的很重要的手段, es 中的 filter cache 能够把搜索时的 filter 条件的结果进行缓存,当进行相同的 filter 搜索时( query 不同, filter 条件相同) ,es 能够很快的返回结果。这是因为第一次计算完 filter 后, es 就把结果存储到了缓存中,下次搜索时, es 就不用再计算。

Es 的 filter cache 有两种,一种是 node 级别的 cache(filter cache 默认类型 ), 一种是 index 级别的 filter cache 。 Node 级别的 cache 被整个 node 共享,并且可以使用百分比设置,对应的属性为 indices.cache.filter.size ,这个属性的值可以是百分比,也可以是具体的大小。 Index 级别的 cache ,顾名思义,就是针对单个索引的大小。 Es 官方并不推荐使用这种设置,因为谁也无法预测索引级别的缓存到底有多大(可能非常大,超过了 node 的对内存),一个索引可能分布在多个 node上面,而多个 node 的结果如果汇总到一个 node 上,其结果可想而知。

设置 Field cache

当对字段排序或者对字段做聚合(如 facet )时,字段缓存( Field cache )非常重要。 Es 会将这些待排序或者聚合字段都加载到内存,以提高对这些字段的快速访问。注意,将字段都加载到内存是非常耗费资源的,所以,你应该保证 field cache 足够大,以足以将所有的结果都缓存起来,下次排序或 facet 时不用再次从磁盘进行加载。

可以通过设置 indices.fielddata.cache.size 为具体的大小,比如 2GB ,或者可用内存的百分比,比如 40% 。请注意,这个属性是 node 级别 ( 不是 index 级别的 ). 当这个缓存不够用时,为了跟新的缓存对象腾出空间,原来缓存的字段会被挤出来,这会导致系统性能下降。所以,请保证这个值足够大,能够满足业务需求。另外,如果你没有设置这个值, es默认缓存可以无限大。所以,在生产环境注意要设置这个值。

同时,我们也可以为 field cache 指定过期时间,系统默认缓存不过期。可以通过设置 indices.fielddata.cache.expire 为 10m ,表示缓存 10 分钟过期。 Es 建议,最好不要设置过期时间,因为将字段加载到内存是很浪费资源的。

设置 circuit breaker

Circuit breaker ,断路器。这个和 field cache 有关系。断路器可以估算待加载的 field 的大小。通过断路器,可以防止将特别大的 field 加载到内存,导致内存溢出。断路器发现待加载的filed 超过 java 的对内存时,会产生一个异常,防止 field 的继续加载,从而起到保护系统的作用。有两个属性可以设置断路器,一个是 indices.fielddata.breaker.limit , 这个值默认是 80% 。这个值可以动态修改,通过集群设置的 api 就可以修改。 80% 就是说,当待加载的 field 超过 es 可用堆内存的 80% 时,就会抛一个异常。

另一个属性是 indices.fielddata.breaker.overhead , 默认值为 1.03 , es 将使用这个值乘以 field 实际的大小作 Field 估算值。

设置 Index Buffers

indices.memory.index_buffer  _size,这个值默认为10%,即堆内存的10%会被用作index时的缓存,这个值可以设置百分比也可以是固定的大小。缓冲自然是越大越好。但记得千万不能超过可用的对内存,并且要跟filter cache和filed cache保证在一个合理的比例。

设置 Index Refresh rate(索引刷新频率)

index.refresh_interval,默认为1秒。即被索引的数据,1秒之后才能够被搜索到。这个时间越小,搜索和索引的性能就越低。这个时间越大,索引和搜索的性能就越高。es建议,在bulk index非常大的索引数据时,将此值设置为-1,索引完毕之后再将此值修改回来。

综合考虑

记住,对 ES 来说,缓存( caches )与缓冲 (buffers) 是提高索引( index )和搜索( query )性能的关键因素。

在我们优化 es 之前,我们必须时刻牢记一点, es 需要足够多的内存,越多越好。但是,也不能把所有的内存都分配给 es。分配给 es 的内存最好是保持在物理内存的 50-60% 左右,因为 os 也需要内存支持用户进程,比如分配线程, io 缓存等。但是,物理内存的 50-60% 也不是唯一标准。假如你的内存有 256G ,即便和 OS 预留 10% 的内存,也有 25G ,足够操作系统使用。另外,最好设置 Xmx 和 Xms 一样大,避免heap size 的 resizing 。

做性能测试时,在相同的情形下,测试结果应该是可以重现的。你做的任何参数的修改,都应该使用进行性能测试,看性能是否有所提高。以性能测试为检验标准,是我们进行优化的必要前提。

设置 Filter cache

缓存是提高性能的很重要的手段, es 中的 filter cache 能够把搜索时的 filter 条件的结果进行缓存,当进行相同的 filter 搜索时( query 不同, filter 条件相同) ,es 能够很快的返回结果。这是因为第一次计算完 filter 后, es 就把结果存储到了缓存中,下次搜索时, es 就不用再计算。

Es 的 filter cache 有两种,一种是 node 级别的 cache(filter cache 默认类型 ), 一种是 index 级别的 filter cache 。 Node 级别的 cache 被整个 node 共享,并且可以使用百分比设置,对应的属性为 indices.cache.filter.size ,这个属性的值可以是百分比,也可以是具体的大小。 Index 级别的 cache ,顾名思义,就是针对单个索引的大小。 Es 官方并不推荐使用这种设置,因为谁也无法预测索引级别的缓存到底有多大(可能非常大,超过了 node 的对内存),一个索引可能分布在多个 node上面,而多个 node 的结果如果汇总到一个 node 上,其结果可想而知。

设置 Field cache

当对字段排序或者对字段做聚合(如 facet )时,字段缓存( Field cache )非常重要。 Es 会将这些待排序或者聚合字段都加载到内存,以提高对这些字段的快速访问。注意,将字段都加载到内存是非常耗费资源的,所以,你应该保证 field cache 足够大,以足以将所有的结果都缓存起来,下次排序或 facet 时不用再次从磁盘进行加载。

可以通过设置 indices.fielddata.cache.size 为具体的大小,比如 2GB ,或者可用内存的百分比,比如 40% 。请注意,这个属性是 node 级别 ( 不是 index 级别的 ). 当这个缓存不够用时,为了跟新的缓存对象腾出空间,原来缓存的字段会被挤出来,这会导致系统性能下降。所以,请保证这个值足够大,能够满足业务需求。另外,如果你没有设置这个值, es默认缓存可以无限大。所以,在生产环境注意要设置这个值。

同时,我们也可以为 field cache 指定过期时间,系统默认缓存不过期。可以通过设置 indices.fielddata.cache.expire 为 10m ,表示缓存 10 分钟过期。 Es 建议,最好不要设置过期时间,因为将字段加载到内存是很浪费资源的。

设置 circuit breaker

Circuit breaker ,断路器。这个和 field cache 有关系。断路器可以估算待加载的 field 的大小。通过断路器,可以防止将特别大的 field 加载到内存,导致内存溢出。断路器发现待加载的filed 超过 java 的对内存时,会产生一个异常,防止 field 的继续加载,从而起到保护系统的作用。有两个属性可以设置断路器,一个是 indices.fielddata.breaker.limit , 这个值默认是 80% 。这个值可以动态修改,通过集群设置的 api 就可以修改。 80% 就是说,当待加载的 field 超过 es 可用堆内存的 80% 时,就会抛一个异常。

另一个属性是 indices.fielddata.breaker.overhead , 默认值为 1.03 , es 将使用这个值乘以 field 实际的大小作 Field 估算值。

设置 Index Buffers

indices.memory.index_buffer  _size,这个值默认为10%,即堆内存的10%会被用作index时的缓存,这个值可以设置百分比也可以是固定的大小。缓冲自然是越大越好。但记得千万不能超过可用的对内存,并且要跟filter cache和filed cache保证在一个合理的比例。

设置 Index Refresh rate(索引刷新频率)

index.refresh_interval,默认为1秒。即被索引的数据,1秒之后才能够被搜索到。这个时间越小,搜索和索引的性能就越低。这个时间越大,索引和搜索的性能就越高。es建议,在bulk index非常大的索引数据时,将此值设置为-1,索引完毕之后再将此值修改回来。

综合考虑

记住,对 ES 来说,缓存( caches )与缓冲 (buffers) 是提高索引( index )和搜索( query )性能的关键因素。

在我们优化 es 之前,我们必须时刻牢记一点, es 需要足够多的内存,越多越好。但是,也不能把所有的内存都分配给 es。分配给 es 的内存最好是保持在物理内存的 50-60% 左右,因为 os 也需要内存支持用户进程,比如分配线程, io 缓存等。但是,物理内存的 50-60% 也不是唯一标准。假如你的内存有 256G ,即便和 OS 预留 10% 的内存,也有 25G ,足够操作系统使用。另外,最好设置 Xmx 和 Xms 一样大,避免heap size 的 resizing 。

做性能测试时,在相同的情形下,测试结果应该是可以重现的。你做的任何参数的修改,都应该使用进行性能测试,看性能是否有所提高。以性能测试为检验标准,是我们进行优化的必要前提。

0 0
原创粉丝点击