Elasticsearch原理学习(七)elasticsearch性能优化

590 阅读5分钟

一、硬件

es的基础是lucene,其所有的索引和文档都是存储在硬盘上的。磁盘是现代服务器上的通用瓶颈,当你的磁盘吞吐量越大,节点就越稳定,性能则越高。有几下几个可优化的方向:

1)SSD

2)RAID 0 参考:baike.baidu.com/item/RAID%2… RAID 0又称为Stripe或Striping,它代表了所有RAID级别中最高的存储性能。RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行操作可以充分利用总线的带宽,显著提高磁盘整体存取性能。

但RAID 0在提高性能的同时,并没有提供数据保护功能,只要任何一块硬盘损坏就会丢失所有数据。因此RAID 0 不可应用于需要数据高可用性的关键领域。

3)设置多个存储路径,分布到不同的磁盘 es支持设置多个存储路径,用逗号分隔

**4)**不要使用远程挂载的存储,比如 NFS 或者 SMB/CIFS。

二、分片策略设置

2.1、分片数设置

分片策略提供了支持分布式和故障转移特性,但是分片也不是可以随便设置的。另外,索引的路由机制导致,分片一旦设置完成之后就不能被改变。

分片的优化必须要了解一下的概念: 1)一个分片就是一个lucene索引,会消耗一定的文件句柄,内存,CPU等。 2)每一次搜索请求需要遍历所有的分片,当分片都处于不同主机上还好,如果存在大量的分片位于同一主机,则会导致当前节点资源竞争的激烈。 3)相关度,lucene提供了相关度的搜索,分片过多导致搜索时每个分片命中低,导致整体的相关度低。 4)控制每个分片占用的硬盘容量不超过JVM配置的堆内存(通常32g),如果索引总容量在500g,分片大概16个。 5)在4)的分片设置要结合本条,一般一个节点会占用一台服务器,如果分片数大大超过了节点数量,当有节点挂机后,即使有副本的存在,仍然存在丢失数据的风险。通常分片数不会超过节点的3倍。 6)主分片,副本和节点的设置,参考以下公式:节点数<=主分片数(副本+1 )*

2.2 推迟分片分配

对于节点瞬时中断的问题,默认情况,集群会等待一分钟来查看节点是否会重新加入,如果这个节点在此期间重新加入,重新加入的节点会保持其现有的分片数据,不会触发新的分片分配。这样就可以减少 ES 在自动再平衡可用分片时所带来的极大开销。

通过修改参数 delayed_timeout ,可以延长再均衡的时间,可以全局设置也可以在索引级别进行修改:

PUT /_all/_settings
{
  "settings": {
    "index.unassigned.node_left.delayed_timeout": "5m"
  }
}

路由选择

查询时,es通过以下公式来确定文档存在哪个分片当中:

shard = hash(routing) % number_of_primary_shards

routing 默认值是文档的 id,也可以采用自定义值。

下面说下routing的作用: 不使用routing: 查询时,不知道数据具体在哪个分片上,需要经过以下两个步骤: 1)分发:请求到达协调节点后,协调节点将查询请求分发到每个分片上。 2)聚合: 协调节点搜集到每个分片上查询结果,在将查询的结果进行排序,之后给用户返回结果 使用routing: 查询的时候,可以直接根据 routing 信息定位到某个分配查询,不需要查询所有的分配,经过协调节点排序。 如果 routing 设置为 userid 的话,就可以直接查询出数据来,效率提升很多。

指定routing:

PUT /my_index2/student/1?routing=key1
{
    "name":"n1",
    "age":10
}

根据routing查询:

GET /_search_shards?routing=key1

三、写入速度优化

ES 的默认配置,是综合了数据可靠性、写入速度、搜索实时性等因素。实际使用时,我们需要根据公司要求,进行偏向性的优化。

对于搜索要求不高,二写入要求较高的场景,可以进行以下优化: 1)增加translog 的flush时间,降低每秒的读写次数(Iops),以及写阻塞(writeblock)。 2)增加索引的refresh时间,减少Segment 合并的次数。 3)调整Bulk线程池和队列。这点官方给出的建议是不进行修改。www.elastic.co/guide/cn/el… 4)使用Bulk 来进行批量写入。Bulk 默认设置批量提交的数据量不能超过 100M。 5)如前面说的提升存储设备如SSD等 6)采用默认的lucene段合并策略,后台定期执行。 7)定义尽量少的副本数量,减少io。

四、内存设置

ES 默认安装后设置的内存是 1GB,对于任何一个现实业务来说,这个设置都太小了。 通常有一下了两个原则: 1)不要超过物理内存的 50%。 Lucene 的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。 如果我们设置的堆内存过大,Lucene 可用的内存将会减少,就会严重影响降低 Lucene 的全文本查询性能。 2)堆内存的大小最好不要超过 32GB。

最终我们都会采用 31 G 设置 -Xms 31g -Xmx 31g