ES优化总结

标签: es 优化 | 发表时间:2018-09-13 14:33 | 作者:java-007
出处:http://www.iteye.com
最近一直在研究ES集群,也看了很多篇前辈们总结的博客,同事借鉴了官方给出的一些建议,做了一下几点总结,希望对后来者有用:



1、内存交换。为了防止ES进程的内存被置换到磁盘上(会导致在检索的时候发生内存交换导致检索速度迟缓)引起性能急速下降。在启动ES的时

候可以把config/elasticsearch.yml中的bootstrap.mlockall设置为true就可以了。



2、节点的细分。在官方文档中,主要定义了master node 、data node 、client node 、tribe node、coordinating node,他们之间的协调工作,才能使

集群节点更好的工作。(需要仔细研究,多搭建几个节点测试下)。

master node:配置 node.master : true     node.data : false

1)当master为false,而data为true时,会对该节点产生严重负荷;

2)当master为true,而data为false时,该节点作为一个协调者;

3)当master为false,data也为false时,该节点就变成了一个负载均衡器。



3  索引刷新。每次在进行一次document操作的时候,有两个可选项,在索引(动词,理解为插入一条document)之后刷新,在查询(同上)之前刷

新,在索引之后刷新,会牺牲索引的效率(每次插入document都额外的进行刷新),在查询之前刷新会牺牲查询的效率(查询之前会额外的进行刷新)。这两种方式虽然都可以让我们每次查到的数据都是实时性的,但是效率特别的低下,因此我们正常情况可以采用定时刷新的方式,即每次间隔一秒刷新一次(时间可以自己定)。在创建构建客户端的时候,设置index.refresh_interval为想要的数值即可。如:1s,也可以在elasticsearch中配置index.refresh_interval:1s



4 内存分配。es在内存分配上官方给的内存最大不超过32G(和os有关,超过32G,指针会变长,增加cpu压力),一般为机器内存的50%即可,剩下

的会交给lucene,Lucene的设计目的是把底层OS里的数据缓存到内存中。Lucene的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些段文件缓存起来,以便更快的访问。



5  分片数量。ES在创建索引的时候默认的分片大小是5。我们可以在创建索引的时候指定分片数量。注意:分片一旦确定,就没法更改。这是因为

Es在创建分片之后,每次索引(动词)都会使用一个算法

shard= hash(routing) % number_of_primary_shards

来确定存储在哪一个分片上,如果更改分片的数量,那么之前所有的document都将无效。没法被routing。

官方给的建议:每个node上的分片数量不超过3个,因此我们如果想要更多的分片只能通过增加节点的方式。

分片不宜过大,也不宜过小。具体可以参考官网的文档和压力测试的结果来设定大小。

为了导入数据更快,可以在创建索引的时候把复制分片设置为0.导入数据结束之后再设置为想要的值。



6  routing。Elasticsearch的路由机制和它的分片机制有相似的地方,他们都是使用的hash算法。将具有相同hash值得文档放在一起。

情景分析:如果poi将全国所有的店面的信息放在es中,如果我们不指定路由,es会随机的将所有的文档存入分片中(数据很大,所以我们需要不止5个分片),现在我们想要查询上海地区所有的poi信息,es的做法是master收到请求,然后广播,每个节点查询数据,然后将数据交给通道节点合并,排序交给用户。这个会严重增加es的节点压力,网络负载。如果我们在查询的时候能明确的知道上海的poi数据在某一个节点上,我们只需要在查询的时候指定routing,es就会在routing指定的节点上查询,就可以避免不必要的资源浪费。也可以提高查询的速度。

我们可以在添加数据的时候指定某一个相同值得字段放在一起,比如上海的cityid=1,我们可以使用以下命令

Curl -XPUT localhost:9200/store/poi?routing=cityId -d '{

"cityId":"1",

"cityName":"上海"

}'

PUT test/_settings
{
"index.routing.allocation.include.size":"big,medium" #这个是把test索引的数据全部分配到big和medium节点
}

PUT test/_settings
{
"index.routing.allocation.exclude.size": "small" #与上面相反,把test索引的数据全部移除small节点
}





7  导入。在导入数据的时候建议先把副本设置为0.待导入完毕之后再设置为需要的数据。

curl -XPUT '192.168.5.112:9200/qinzi/_settings?pretty' -d '
{
    "index" : {
        "number_of_replicas" : 1
    }
}'

导入的时候先把刷新的时间设置为-1(这样在索引的时候,数据对搜索不可见,就是在索引的时候,数据是没法实时查询的),等到索引结束之后,在设置为想要的时间,这个值可以可以通过api设置

curl -XPUT localhost:9200/test/_settings-d '{
    "index" : {
        "refresh_interval" :"-1"
    }
}'

记得在索引之后改回来,不然之前索引的数据都没法查询。



8  节点状态监控。



9    segments优化 ES是基于lucene的,

curl -XPOST192.168.5.112:9200/baidu/_forcemerge?max_num_segments=1(强制性的把segments变为1)在合并的时候需要预留足够的磁盘空间,因为segments合并时候是采用一定的策略,把segments合并,但是旧的还会暂时存在的。

curl -XPOST 192.168.5.112:9200/baidu/_optimize?max_num_segments=1

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [es 优化] 推荐:

ES优化总结

- - 非技术 - ITeye博客
最近一直在研究ES集群,也看了很多篇前辈们总结的博客,同事借鉴了官方给出的一些建议,做了一下几点总结,希望对后来者有用:. 为了防止ES进程的内存被置换到磁盘上(会导致在检索的时候发生内存交换导致检索速度迟缓)引起性能急速下降. 候可以把config/elasticsearch.yml中的bootstrap.mlockall设置为true就可以了.

ES性能优化总结

- - 互联网 - ITeye博客
    Elasticsearch是目前大数据领域最热门的技术栈之一,经过近8年的发展,已从0.0.X版升级至6.X版本,虽然增加了很多的特性和功能,但是在主体架构上,还是没有太多的变化. 下面就把我对于ES使用实践的一些经验总结一下,供大家参考;也请大家拍砖. 如果有条件,尽可能使用SSD硬盘, 不错的CPU.

es集群快速恢复(优化方案)_大数据_ClearloveXXX的博客-CSDN博客

- -
2、关闭allocate,禁止shard做allocate. 5、等级集群变成yellow后开启allocate,允许shard做allocate. 调整集群恢复时的带宽,-1是指无限制 . 调整集群恢复时的单机并发度,最好是和磁盘块数一致 . 调整集群恢复时单个shard中同时恢复的小文件的个数.

非常哇塞的 ES读场景、写场景 性能优化指南!你值得拥有!

- - IT瘾-dev
原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. ES作为NoSQL数据库里非常重要的一员,使用越来越广泛. 虽然它因为索引延迟的原因,数据在时效性上有一些缺陷,但其大容量、分布式的优秀设计,使得它在时效性要求并不是特别高的类实时搜索领域,能够大展身手. 根据使用场景和用途,ES可以分为写入和读取两种典型的应用方式.

es的连接查询

- - 行业应用 - ITeye博客
在一般的关系型数据库中,都支持连接操作. 在ES这种分布式方案中进行连接操作,代价是十分昂贵的. 不过ES也提供了相类似的操作,支持水平任意扩展,实现连接的效果. 其他内容, 参考Elasticsearch官方指南整理. 在ES中支持两种连接方式:嵌套查询 和 has_child、has_parent父子查询.

ElasticSearch —修改ES数据

- -
ElasticSearch能够以接近实时的速度提供数据操作和搜索功能. 在默认情况下,从索引/更新/删除数据到出现在搜索结果之间,你可能会感受到有1秒的延迟时间(刷新间隔). 这是与SQL等其他平台的一个重要区别,这些平台在完成事务之后,它们的数据立即可用. 先前,我们已经知道如何索引一个单个的文档.

es近实时搜索原理

- - 企业架构 - ITeye博客
 随着按段(per-segment)搜索的发展, 一个新的文档从索引到可被搜索的延迟显著降低了. 新文档在几分钟之内即可被检索,但这样还是不够快.  提交(Commiting)一个新的段到磁盘需要一个 . fsync 来确保段被物理性地写入磁盘,这样在断电的时候就不会丢失数据. 但是  fsync 操作代价很大; 如果每次索引一个文档都去执行一次的话会造成很大的性能问题.

请警惕 ES 的三大坑

- - InfoQ推荐
搜索引擎现在是用得越来越多了,比如 日志系统用到的 ELK 中的 E 就是 搜索引擎 Elasticsearch(简称 ES). 那对于搜索这种技术来说,最看重的是搜索的结果的准确性和搜索的响应时间. ES 的准确性可以通过 倒排索引算法来保证,那响应时间就需要磁盘或缓存来支持了,那么磁盘和缓存会带来哪些坑呢.

碾压ES和MongoDB,RedisJson横空出世!

- - DockOne.io
近期官网给出了 RedisJson(RedisSearch)的性能测试报告,可谓碾压其他 NoSQL. 下面是核心的报告内容,先上结论:. 对于隔离写入(isolated writes),RedisJSON 比 MongoDB 快 5.4 倍,比 ElasticSearch 快 200 倍以上. 对于隔离读取(isolated reads),RedisJSON 比 MongoDB 快 12.7 倍,比 ElasticSearch 快 500 倍以上.

MySQL InnoDB 與 PostgreSQL 的 Partial Index(es) 是不一樣的東西…

- - Gea-Suan Lin's BLOG
MySQL InnoDB 指的 Partial Index 是:. An index that represents only part of a column value, typically the first N characters (the prefix) of a long VARCHAR value..