ElasticSearch注意点

文章引用 http://baijiahao.baidu.com/s?id=1582140418694970203&wfr=spider&for=pc

自我Mark下

三个层面来讲:第一个有关Linux的系统配置,第二是集群层面的参数设置,最后会涉及到存储到集群上的索引设置。

1、OS参数设置

像OS这个参数设置,首先提到的是内存相关的参数,由于ES采用Mapping机制,将文件映射到内存,在系统级别有一些相关的参数要设置。另一个就是文件数,假设我们所有都设置到最大65535。

这个设置之后还需要在下面加入加入login这个文件,这里讲得非常具体,可以说是一个教程。

这里我只是做了一个示例,在Ext4文件系统中,每一次访问一个文件或者目录时,其实OS级别会记录访问时间,如果只是在海量文件的情况,上述的记录信息就会对IO有影响。有一篇文章提到,关闭文件访问时间信息之后,系统IO性能可以提升20%—30%。

我们知道Linux里面文件信息,不是直接改一次之后就写入到磁盘,它会先有一个文件的缓存,文件的缓存什么情况下会被写入到disk里面?有两个相应的系统参数可以设置的,一个是vm.dirty_background_ratio,一个是vm.dirty_ratio,一旦缓存占据内存超过百分比(默认值是20%)之后,内核就停止其它方面的操作,而只做文件的缓存吐到disk的操作,这时效果有点像Java里进行垃圾回收一样,对外界停止响应。 vm.dirty_ratio就是当它缓存量达到20%时,它就其它的什么都不干了,只做数据同步到disk一件。

内存不够时,会使用swap空间, 内存很大的话,可以不用创建swap空间。默认值是60,但是我们把它设置为零的话,是跟swap off效果一样。但为了避免内核出现OOM, 只是将其设置为1。

2、ElasticSearch参数设置

刚才两个讲的都是系统级别的设置,一个是内存,另一个是系统级别的IO,下面讲的是针对ES—JVM的设置。

这里建议,不管物理内存有多大,分配给Elasticsearch的只设成32G,同时后面如果出现OOM,进程直接退出。

为什么说要把它改成这个呢?因为我们在使用一个集群时看到,有时因为聚合操作的原因,会导致某一台机器上的JAVA进程出现OOM,但是这个JVM进程还在,并没有退出,退出的话可以通过monit捕捉到,也可以进行重启。如果没有退出,而是一直挂在那的话,就不能提供正常的服务。 此外加上这个参数的话,需要升级一下JDK版本,JDK要求1.8.0_92, 从这个版本开始支持ExitOnOutOfMemoryError参数。

另外一种办法就是如果我们内存不能升级JDK、存在种种现实约束的话,可以在这个时候用另一种方式来实现,在JVM启动参数中加入

-XX:OnOutOfMemoryError="kill -9 %p"。

这里就是讲输入到ElasticSearch里面每个集群的一些参数,一些相对比较主要的一些参数。这里的参数配了一幅图,这幅图最想表明的意思是说,我的参数的配置要使得我从整个集群的角度上来看,它每一台机器上的shard数目基本是相当的。

这里有一点,参数设置能保证shard数目是基本相当的,但并不是保证每一个shard的大小相等,这两者还是有差异的。决定每个集群上shard相等的参数是由这个balance决定,它默认一个是0.5,把它往下调的话,就不可以倾斜;往上调的话对倾斜的容忍度相对比较高。

ElasticSearch是一个高可靠的系统,集群的一个节点挂掉了,另一个节点是可以继续的。挂掉的节点是进行恢复,为了避免恢复工作对集群造成太多影响,主要是避免大的I/O消耗,需要进行参数设置。比如集群中同时在进行恢复的索引可以是多少个,还有就是一个node上能允许shard在做恢复。 这两个参数是cluster_concurrent_rebalance和node_concurrent_recoveries。

如果要缩容、对某一台机器进行维护、将其从集群中拉出来该怎么办?这个时候可以设定exclude名单,名单可以通过ip地址或主机名来指定。一旦设置的exlude名单,该名单上节点中的索引数据被拉到别的机器上面,数据被拉完之后,就可以被这个集群拉出去的机器进行维护,避免维护带来的数据丢失。

3、索引参数设置

这是具体到一个索引参数的设置。在讲具体参数之前,我们可以先讲一下ElasticSearch索引参数的设置、输入以及中间发生的过程。当真正的数据请求到达ElasticSearch节点之后,它一方面会写入到内存中,另外一部分会写入到TransactionLog。

写入到内存并不意味着可以被搜索,要通过Refresh操作,才可以被搜索到。Refresh之后,数据可以被搜索到,此刻数据还在内存中,如果很不巧的话,在这个时候断电,或者出现其它故障不可用了,那么等到这台机器再恢复时,我刚才写的内容就丢失掉了, 因为并没有被持久化到磁盘。 为了持久化这个内容,需要进行一次FLUSH操作, flush的内容会被写到一个segment中。 可想而知,随着时间的推移,系统会产生大量的segments,这些segment需要把它合并成一个大的。不合并成一个大的会怎样呢?不合并成一个大的,就是说每一个segment都会吃掉一些文件句柄,文件句柄数是有限的。另一个带来的就是查询性能下降,因为查询的时候,要对所有segments进行访问,效率就比较低了。

有了刚才讲的三步之后,再来看下面的参数就比较容易好理解了。 Refresh_interval 过多久可以让你查询到,时间越短就可以被越快地检索到,但是意味着我相应的I/O也上去了,在有大批量数据导入时,这个数值会适当的调大。

在我们目前部署的集群中,高峰时候每秒写入量,有十几万。 为了应对这种场景,将refresh_interval设置为100多秒或者90秒以上。

Number_of_shards索引分片的数目,这个数目可以设置得大一些,还有每一个分片的副本,在大批量导入时,由于副本数目是可以动态调整的,副本数也可以先设置为零,等数据全部导入后,再设置为非0值。 副本数可以动态调整,但是分片数目是无法动态调整的,也就是说,除非重建另外一个索引,不然原先设置的是啥样就只能啥样。 这个FLUSH也可以调大,需要的时候可以设置得大一些。

下面就是做segments合并的线程数,如果是spin disk的话,就使用默认值1,如果是SSD的话,可以把它调大一些。 讲到SSD代码的话, 为了进一步优化性能,可以将系统的i/o scheduler设置为noop 。

这里是针对每个Index的Schema设置。假设事先并不能确定索引,大部分我们可以采用动态的template。 上述的动态模板表示的是, 如果字符串小于10915, 就采用keyword来存储。

下面一栏对应特别特别大的字段,如果我们只是存储这个字段的内容,不对这个字段做搜索也不做任何分词,可以将类型设置为object,enabled设置为false,即便包含嵌套信息也不会被解析。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Elasticsearch 提供了很多搜索 API,下面是一些常用的 API 以及使用注意: 1. `_search` API:这是 Elasticsearch 中最常用的搜索 API,它允许你执行查询并返回搜索结果。使用时需要注意的是,你需要指定索引名称和类型,并且你还可以使用请求体来指定搜索条件和过滤条件。 2. `_msearch` API:这个 API 允许你执行批量搜索操作,可以同时执行多个搜索请求。使用时需要注意的是,你需要在请求体中指定多个搜索请求,并使用回车符隔开。 3. `_count` API:这个 API 允许你计算满足指定条件的文档数量。使用时需要注意的是,你需要指定索引名称和类型,并且你还可以使用请求体来指定过滤条件。 4. `_suggest` API:这个 API 允许你为搜索提供自动补全建议。使用时需要注意的是,你需要指定索引名称和类型,并且你还需要在请求体中指定自动补全策略。 希望这些信息能帮到你! ### 回答2: Elasticsearch 搜索API提供了丰富的功能和灵活的查询语法,可以帮助用户快速高效地搜索和检索数据。下面我将罗列一些常用的搜索API,并提供一些使用注意。 1. match_all API:该API可以匹配索引中的所有文档,并返回结果。 使用注意:需要注意使用分页和排序参数,以控制返回结果的数量和顺序。 2. term API:该API用于精确匹配某个字段的值。 使用注意:要确保字段的类型和索引的映射一致,否则可能无法正确匹配。 3. match API:该API用于匹配包含指定关键词的文档。 使用注意:关键词被分词器处理成词条,需要根据实际需求选择合适的分词器和配置。 4. bool API:该API用于组合多个查询条件,支持逻辑运算符AND、OR和NOT。 使用注意:要合理组织查询条件的逻辑关系,并注意性能影响。 5. range API:该API用于按范围查询某个字段的值。 使用注意:需要注意字段的类型和格式,确保返回符合预期的结果。 6. wildcard API:该API用于进行通配符模式的匹配。 使用注意:通配符查询是相对较慢的,不适合频繁使用。 7. match_phrase API:该API用于匹配包含指定短语的文档。 使用注意:短语查询考虑词条的顺序,要确保查询的短语顺序与文档中的一致。 在使用Elasticsearch搜索API时,还需要注意以下几: 1. 索引管理:在进行搜索之前,需要确保索引中的数据已经正确地被建立和管理,包括映射定义、分词器配置等。 2. 查询性能:要合理使用查询条件和操作符,选择合适的索引类型、分片和副本配置,以提高查询的性能。 3. 监控和调优:结合Elasticsearch提供的监控工具,及时发现和解决潜在的性能问题,优化搜索性能。 4. 数据安全:根据需求设置相应的访问控制和权限,确保数据的安全和隐私。 总而言之,Elasticsearch搜索API提供了强大的搜索功能,用户可以根据自己的需求,选择合适的查询API和配置,灵活高效地进行数据检索。同时,在使用过程中需要注意数据的正确性、查询的性能和安全性等方面的问题。 ### 回答3: Elasticsearch 是一个开源的全文搜索引擎,具有优秀的搜索性能和扩展性。它提供了丰富的搜索 API 来满足各种搜索需求。以下是一些常用的 Elasticsearch 搜索 API 罗列以及使用注意。 1. match API:使用 match API 可以进行简单的全文搜索,它根据查询条件对文本进行分词处理,并返回匹配的结果。使用注意:要注意使用合适的分析器来进行分词,以确保搜索结果的准确性。 2. term API:term API 是用来进行精确匹配搜索的。它不对查询条件进行分词处理,而是将查询条件与文档中的精确词条进行比较。使用注意:对于需要精确匹配的情况,可以使用 term API 来提高搜索效率。 3. bool API:bool API 允许进行复杂的布尔查询。它可以进行逻辑与、逻辑或以及逻辑非操作,以满足更复杂的搜索需求。使用注意:对于复杂的查询需求,可以使用 bool API 来构建复合查询语句。 4. range API:range API 可以进行范围查询,它可以查询指定字段在特定范围内的文档。使用注意:要确保传入的范围参数正确,以避免错误的搜索结果。 5. filter API:filter API 可以用来过滤搜索结果,它可以通过指定条件来排除某些文档。使用注意:对于结果过滤需求,可以使用 filter API 来提高搜索效率。 此外,使用 Elasticsearch 搜索 API 还需注意以下几: 1. 创建合适的索引映射,包括字段类型的定义和分析器的配置,以确保搜索结果的准确性和一致性。 2. 根据实际需求选择合适的查询类型和参数,避免过度查询或查询不准确导致的性能问题。 3. 调整相关的配置参数,如分片和副本数量,以提供更好的搜索性能和扩展性。 4. 使用合适的搜索策略,如分页和排序,以提供良好的用户体验。 总之,了解 Elasticsearch 搜索 API 的使用方法和注意对于正确使用 Elasticsearch 进行全文搜索是非常重要的,可以帮助我们更高效地构建搜索功能和提供优质的搜索体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值