这样,在日志目录下的慢查询日志就会有输出记录必要的信息了 。
{CLUSTER_NAME}_index_indexing_slowlog.log{CLUSTER_NAME}_index_search_slowlog.log
数据结构优化基于 Elasticsearch 的使用场景,文档数据结构尽量和使用场景进行结合,去掉没用及不合理的数据 。
尽量减少不需要的字段如果 Elasticsearch 用于业务搜索服务,一些不需要用于搜索的字段最好不存到 ES 中,这样即节省空间,同时在相同的数据量下,也能提高搜索性能 。
避免使用动态值作字段,动态递增的 mapping,会导致集群崩溃;同样,也需要控制字段的数量,业务中不使用的字段,就不要索引 。控制索引的字段数量、mapping 深度、索引字段的类型,对于 ES 的性能优化是重中之重 。
以下是 ES 关于字段数、mapping 深度的一些默认设置:
index.mapping.nested_objects.limit: 10000index.mapping.total_fields.limit: 1000index.mapping.depth.limit: 20
Nested Object vs Parent/Child尽量避免使用 nested 或 parent/child 的字段,能不用就不用;nested query 慢,parent/child query 更慢,比 nested query 慢上百倍;因此能在 mapping 设计阶段搞定的(大宽表设计或采用比较 smart 的数据结构),就不要用父子关系的 mapping 。
如果一定要使用 nested fields,保证 nested fields 字段不能过多,目前 ES 默认限制是 50 。因为针对 1 个 document,每一个 nested field,都会生成一个独立的 document,这将使 doc 数量剧增,影响查询效率,尤其是 JOIN 的效率 。
index.mapping.nested_fields.limit: 50
Nested Object
Parent/Child
优点
文档存储在一起,因此读取性高
父子文档可以独立更新,互不影响
缺点
更新父文档或子文档时需要更新整个文档
为了维护 join 关系,需要占用部分内存,读取性能较差
场景
子文档偶尔更新,查询频繁
子文档更新频繁
选择静态映射,非必需时,禁止动态映射尽量避免使用动态映射,这样有可能会导致集群崩溃,此外,动态映射有可能会带来不可控制的数据类型 , 进而有可能导致在查询端出现相关异常 , 影响业务 。
此外,Elasticsearch 作为搜索引擎时,主要承载 query 的匹配和排序的功能,那数据的存储类型基于这两种功能的用途分为两类 , 一是需要匹配的字段,用来建立倒排索引对 query 匹配用,另一类字段是用做粗排用到的特征字段,如 ctr、点击数、评论数等等 。
document 模型设计对于 MySQL,我们经常有一些复杂的关联查询 。在 es 里该怎么玩儿,es 里面的复杂的关联查询尽量别用,一旦用了性能一般都不太好 。
最好是先在 JAVA 系统里就完成关联,将关联好的数据直接写入 es 中 。搜索的时候 , 就不需要利用 es 的搜索语法来完成 join 之类的关联搜索了 。
document 模型设计是非常重要的,很多操作 , 不要在搜索的时候才想去执行各种复杂的乱七八糟的操作 。es 能支持的操作就那么多,不要考虑用 es 做一些它不好操作的事情 。如果真的有那种操作,尽量在 document 模型设计的时候,写入的时候就完成 。另外对于一些太复杂的操作,比如 join/nested/parent-child 搜索都要尽量避免,性能都很差的 。
集群架构设计
合理的部署 Elasticsearch 有助于提高服务的整体可用性 。主节点、数据节点和协调节点分离Elasticsearch 集群在架构拓朴时,采用主节点、数据节点和负载均衡节点分离的架构,在 5.x 版本以后,又可将数据节点再细分为“Hot-Warm”的架构模式 。
Elasticsearch 的配置文件中有 2 个参数,node.master 和 node.data 。这两个参数搭配使用时 , 能够帮助提供服务器性能 。
主(master)节点配置 node.master:true 和 node.data:false,该 node 服务器只作为一个主节点,但不存储任何索引数据 。我们推荐每个集群运行3 个专用的 master 节点来提供最好的弹性 。使用时 , 你还需要将 discovery.zen.minimum_master_nodes setting 参数设置为 2,以免出现脑裂(split-brain)的情况 。用 3 个专用的 master 节点,专门负责处理集群的管理以及加强状态的整体稳定性 。因为这 3 个 master 节点不包含数据也不会实际参与搜索以及索引操作,在 JVM 上它们不用做相同的事,例如繁重的索引或者耗时 , 资源耗费很大的搜索 。因此不太可能会因为垃圾回收而导致停顿 。因此 , master 节点的 CPU , 内存以及磁盘配置可以比 data 节点少很多的 。
推荐阅读
- 新站SEO优化如何实现“漂亮”流量翻一番的目标
- 麒麟960相当于骁龙多少
- 如何进行Python代码的代码重构和优化?
- 网站开发中的内链策略:如何理解并有效运用内链优化?
- 10大SEO技巧揭秘:让你的网站优化事半功倍,流量飙升
- 黑帽SEO揭秘:为何选择正规优化而非非法手段?
- 元素p和s对钢的性能有哪些影响
- 为什么高性能场景选用Postgres SQL 而不是 MySQL
- 如何优化网页 如何优化网页关键词
- 网页如何优化下载 网页如何优化