MyException - 我的异常网
当前位置:我的异常网» 软件架构设计 » ElasticSearch性能优化谋略

ElasticSearch性能优化谋略

www.MyException.Cn  网友分享于:2013-10-22  浏览:0次
ElasticSearch性能优化策略

ElasticSearch性能优化主要分为4个方面的优化。
一、服务器部署
1、增加1-2台服务器,用于负载均衡节点
elasticSearch的配置文件中有2个参数:node.master和node.data。这两个参 数搭配使用时,能够帮助提供服务器性能。
1.1> node.master: false    node.data: true
        该node服务器只作为一个数据节点,只用于存储索引数据。使该node服务器功能 单一,只用于数据存储和数据查询,降低其资源消耗率。
    1.2> node.master: true    node.data: false
        该node服务器只作为一个主节点,但不存储任何索引数据。该node服务器将使用 自身空闲的资源,来协调各种创建索引请求或者查询请求,讲这些请求合理分发到相关 的node服务器上。
    1.3> node.master: false    node.data: false
该node服务器即不会被选作主节点,也不会存储任何索引数据。该服务器主要用 于查询负载均衡。在查询的时候,通常会涉及到从多个node服务器上查询数据,并请 求分发到多个指定的node服务器,并对各个node服务器返回的结果进行一个汇总处理, 最终返回给客户端。
2、关闭data节点服务器中的http功能
针对ElasticSearch集群中的所有数据节点,不用开启http服务。将其中的配置 参数这样设置:http.enabled: false,同时也不要安装head, bigdesk, marvel等监控 插件,这样保证data节点服务器只需处理创建/更新/删除/查询索引数据等操作。
http功能可以在非数据节点服务器上开启,上述相关的监控插件也安装到这些服 务器上,用于监控ElasticSearch集群状态等数据信息。
这样做一来出于数据安全考虑,二来出于服务性能考虑。
3、一台服务器上最好只部署一个Node
一台物理服务器上可以启动多个Node服务器节点(通过设置不同的启动port), 但一台服务器上的CPU,内存,硬盘等资源毕竟有限,从服务器性能考虑,不建议一台 服务器上启动多个node节点。

二、服务器配置
1、配置索引线程池的大小
ElastiSearch服务器有多个线程池大小配置。主要有:index,search,suggest, get,bulk,percolate,snapshot,snapshot_data,warmer,refresh。
在此主要针对index和search进行一个配置调整。index操作包含:创 建/更新/删除索引数据。search操作主要针对用户的各种搜索操作。
具体配置如下:
threadpool:
    index:
        type: fixed
        size: 100
    search:
        type: fixed
        size: 1000
2、创建/查找索引设置相同的分词解析器
索引服务器用到了ik中文分词插件,对于添加到该搜索服务器中的数据都使用该 中文分词(例如orgglobal对象中的orgName就使用了ik中文分词)。当执行搜索请求 时,搜索关键词也需要用到相关的中文分词器,如果不指定设置的话,则会使用服务器 默认的中文分词standard,而使用standard作为中文分词器进行查询时,性能不好。 通过将ik中分词设置为默认的分词器时,则查询效率是standard的2-3倍。
该配置具体如下:
index:
     analysis:
         analyzer:
        ik:
         alias: [news_analyzer_ik,ik_analyzer]
          type: org.elasticsearch.index.analysis.IkAnalyzerProvider
index.analysis.analyzer.default.type: ik
    3、确定分片(shard)的数量和副本(replica)的数量
ElasticSearch在创建索引数据时,最好指定相关的shards数量和replicas,
    否则会使用服务器中的默认配置参数shards=5,replicas=1。
因为这两个属性的设置直接影响集群中索引和搜索操作的执行。假设你有足够的  
    机器来持有碎片和副本,那么可以按如下规则设置这两个值:
     1) 拥有更多的碎片可以提升索引执行能力,并允许通过机器分发一个大型的索引;
     2) 拥有更多的副本能够提升搜索执行能力以及集群能力。
  对于一个索引来说,number_of_shards只能设置一次,而number_of_replicas可以使用索引更新设置API在任何时候被增加或者减少。
这两个配置参数在配置文件的配置如下:
index.number_of_shards: 5
index.number_of_shards: 1
    4、查询速度慢的日志配置
在进行实际应用中,会记录下查询速度慢或者添加索引速度慢的操作记录,为后
    续性能优化提供依据。其具体配置如下:
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.threshold.query.info: 5s
index.search.slowlog.threshold.query.debug: 2s
index.search.slowlog.threshold.query.trace: 500ms

index.search.slowlog.threshold.fetch.warn: 1s
index.search.slowlog.threshold.fetch.info: 800ms
index.search.slowlog.threshold.fetch.debug: 500ms
index.search.slowlog.threshold.fetch.trace: 200ms

index.indexing.slowlog.threshold.index.warn: 10s
index.indexing.slowlog.threshold.index.info: 5s
index.indexing.slowlog.threshold.index.debug: 2s
index.indexing.slowlog.threshold.index.trace: 500ms
三、数据结构优化
1、尽量减少不需要的字段
ElasticSearch中存储的数据是用于搜索服务,因此其他一些不需要用于搜索的字段最好不存到ES中,这样即节省空间,同时在相同的数据量下,也能提高搜索性能。
2、routing值的设置
通常情况下,往ElasticSearch服务器添加索引数据时,是无需指定routing值。ElasticSearch会根据索引Id,将该条数据存储到ElasticSearch集群中的一个shard中。而当指定了routing值为accountId(用户Id),则ElasticSearch会将相同accountId的多个数据都存放到同一个shard中,后续查询的时候,在指定routing值后,ElasticSearch只需要查询一个shard就能得到所有需要的数据,而不用再去查询所有的shard,从而大大提供了搜索性能。
四、运行期优化
1、optimize
随着时间的推移,ElasicSearch中每个shard的数据也会越来越多,索引越来越大,而生成的segment(在每个shard中,每个索引文件实际是由多个sgment文件组成)也会越来越多。而segment越多的话,则查询的性能越差,所以通过调用optimize命令,将多个segment合并成更少数量的segment(最少为一个),从而来提高查询性能。
在调用该命令时,可以设置几个参数,这些参数的具体含义如下:
1.1> max_num_segments
段数优化。要全面优化索引,将其设置为1。默认设置只需检查是否需要执行一个合并,如果需要,则执行它。【经过测试,该值越小,查询速度越快】
1.2> only_expunge_deletes
该优化操作是否只清空打有删除标签的索引记录。在Lucence中,在执行删除操作时,不会直接删除segment中的记录,而是对该记录打上delete标签。当多个segment进行合并操作时,就会生成一个新的segment,而该新的segment中不再包含删除的记录。这个参数允许只对哪些包含删除记录的segment进行优化操作。
1.3>flush
在执行完优化操作之后,再执行刷新操作。默认值为true
1.4>wait_for_merge
当该参数设置为true时,表示其他请求操作要等到合并segment操作结束之后,再进行响应。值得注意的是,由于这个优化操作是一个非常耗时,耗资源的事情,用户提交的请求操作是不能容忍等待这么久,所以这个参数最好设置为false.
具体调用命令如下:
http://localhost:9200/indexName/_optimize?only_expunge_deletes=true&wait_for_merge=false
2、warmers
当ElasticSearch服务器启动之后,业务系统中要使用的索引数据暂时没有导入到内存中,因此当用户进行第一次数据搜索时,会因为数据导入耗时很久,而严重影响用户的使用体验。为了解决该问题,可以使用warmer工具。通过ElastiSearch提供的工具,可以register/delete/get特定名称的warmer。通常情况下,warmer包含的请求需要载入大量的索引数据(例如在数据搜索中需要针对特定字段的排序操作,或者用到一些聚合sum,min,max函数的查询等),这样才能达到预热的效果。
具体调用示例如下(下面的warmer是针对索引名为test的warmer,warmer定义的名字为warmer_1):
curl -XPUT localhost:9200/test/_warmer/warmer_1 -d '{
    "query" : {
        "match_all" : {}
    },
    "aggs" : {
        "aggs_1" : {
            "terms" : {
                "field" : "field"
            }
        }
    }
}' 

文章评论

做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
旅行,写作,编程
旅行,写作,编程
我的丈夫是个程序员
我的丈夫是个程序员
老程序员的下场
老程序员的下场
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
总结2014中国互联网十大段子
总结2014中国互联网十大段子
一个程序员的时间管理
一个程序员的时间管理
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员的鄙视链
程序员的鄙视链
我是如何打败拖延症的
我是如何打败拖延症的
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
漫画:程序员的工作
漫画:程序员的工作
Java程序员必看电影
Java程序员必看电影
程序员必看的十大电影
程序员必看的十大电影
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员应该关注的一些事儿
程序员应该关注的一些事儿
代码女神横空出世
代码女神横空出世
编程语言是女人
编程语言是女人
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
为什么程序员都是夜猫子
为什么程序员都是夜猫子
10个调试和排错的小建议
10个调试和排错的小建议
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
 程序员的样子
程序员的样子
中美印日四国程序员比较
中美印日四国程序员比较
那些争议最大的编程观点
那些争议最大的编程观点
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有