如何构建一个高可用、低延迟的 Elasticsearch 集群?

我们从 1.x 开始使用 Elasticsearch ,发展到现在大大小小的集群有 5000+,最大的集群物理主机 100+,单集群最大数据量几百 TB,几千亿条 doc。在这个大规模的应用过程中我们积累了很多宝贵经验,在此与大家分享。

相比 Hadoop 系列的大数据平台,Elasticsearch 使用起来要简单得多,你只要修改很少的几个配置就可以让集群运行起来,而且 Elasticsearch 拥有丰富的 REST 接口,你能够看到集群的各种指标和状态,从而了解集群内部的运行状态。

但越是简单易用的系统,它的内部就越隐含着更多的默认配置。系统可以在默认配置下正常运行,但是随着数据量的增加,或者用户访问的高峰期,集群可能忽然出现问题 —— 昨天还是好好的,为什么今天就出问题了?我们什么都没动。

要解决这些问题,你就需要知道故障的根本原因是什么,这需要你对系统有足够的了解。在大型互联网公司中,都有做基础技术的团队负责平台的开发和运维,但中小型企业很少会有这样的团队。

尤其像 Hadoop 这种复杂的系统,没有基础技术团队你很难把它真正用起来。虽然 Elasticsearch 简便许多,但仍然可能会遇到一些问题,排查这些问题可能会耽误你很长时间。

另一方面,一个新业务准备使用 Elasticsearch 时对集群的规划往往没有概念:

  • 需要多少个节点来存储数据?
  • 索引分片数量多少比较合适?
  • 集群 GREEN 就一定是正常的吗?
  • 什么时候集群需要扩容?
  • 我应该重点关注哪些指标来确认集群的健康状态?

我们往往只是在遇到线上故障的时候才去分析相关原理,而不是空闲的时候进行系统的学习。分析定位问题虽然有趣,但有时我们更希望有人直接告知答案是什么,它为什么会这样,怎么做可以合理地解决问题。

我们写下这门课程最大的目的,是希望读者能够解决用户的这些烦恼,分享我们在日常运维过程中所遇到的常见问题,大部分的故障是类似的。把这些分享出来,避免他人再重新分析问题。让读者能够合理地规划、使用,以及监控集群。

这些经验是我们在多年开发、运维 Elasticsearch 集群中的原理和实践的沉淀。如果只知道原理,没有实践经验,可能会在遇到问题时不知道具体该怎么做,更不明白原理的内在联系和利害关系,而实践经验可以让读者理解原理的同时有一个更具体的、可实施的参考依据。

点击了解《高可用 Elasticsearch 集群 21 讲》。

课程框架

本课程由四部分组成,总计 21 篇。

第一部分(第 1-1~1-4 课)新集群诞生

  • 合理地规划集群规模、组织结构,以及根据业务特点设计索引和分片是第一步。实际上很多问题是由于集群规划不合理,或者分片配置不合理、mapping 配置不合理导致的。

    一开始的时候就把这些工作做好,可以避免很多后期问题。这部分内容根据我们多年维护经验给读者一些原则性的参考,让集群规划和分片规划等能够相对准确地量化出来。

第二部分 (第 2-1~2-9 课)集群管理

  • 新集群组建好之后,最好对集群性能做整体评估,虽然基准测试有一定参考价值,但由于业务数据的差异,往往导致较大的性能差别,因此业务最好根据自己的数据样本进行压力测试,这样你就明确的知道系统能够达到什么能力,做到心中有数。

    这部分内容介绍了如何进行压力测试和对比压测效果,以及后续的日常管理工作,包括集群监控、应该重点关注哪些指标、性能优化都需要做些什么、集群什么时候需要扩容、扩容注意事项、数据迁移等常见的管理工作。

第三部分 (第 3-1~3-4 课) 安全防护

  • 业务初期很容易忽视安全问题,在遇到麻烦的时候才去解决。安全包括用户认证、用户鉴权、通讯加密等多方面的内容,最简单的方式可以使用 Nginx 之类的反向代理来过滤请求,实现简单的用户和权限管理。

    X-Pack 中提供了非常完善的安全组件,但是版本之间的变化比较大,中文内容又比较少,这部分内容就是使用 X-Pack 进行安全防护,并接入自己的用户管理体系。

第四部分 (第 4-1~4-4 课)常见问题

  • 在这部分中我们把多年运维过程中常见的、比较通用的问题梳理出来,希望给读者一个参考,在遇到类似问题的时候可以从中直接找到答案,以及分析问题的思路和方法、诊断问题所需的工具等,把握住问题的本质。

    虽然一个故障可能是多种因素导致的,这部分内容无法覆盖所有的情况,但是相信可以应对大部分情况。

课程特色

本课程内容属于进阶到精通级别,需要读者有一定的基础知识,在基础知识方面,《Elasticsearch 权威指南》已经很好,我们希望给读者一些切合实际的、注重实战方面的资料。

因此,本课程重点解决以下实际问题:

  • 新集群规模如何决定,我们给出可以量化的指标,以及角色分离建议
  • 索引和分片如何设计,在此给出相关注意事项,很多都是我们踩坑后的总结
  • 集群 RED 和 YELLOW 等常见问题如何分析和解决
  • 内存居高不下,GC 严重,节点不稳定等问题如何分析和解决
  • 如何应用安全策略,如何压测,了解你集群能力的上限
  • 常见配置的作用及建议值

在阅读本课程之前,建议读者已经阅读过《Elasticsearch 权威指南》中的大部分内容,对 Elasticsearch 的基本概念如分片、节点角色,以及常见配置项已经有了一定的了解。

如何学习 Elasticsearch

关于 Elasticsearch 基础知识的内容,例如:分布式搜索,主从节点,主副分片等基本概念有很多资料可以参考,由于本课程定位为进阶与精通,在此我们不再重复介绍这些基础知识。

如果读者尚未了解这些基础概念,或者知识体系尚不完善,推荐阅读 Elasticsearch 官方的资料,现在,我们给读者一些具体学习建议,方法论可以让你把握住重点,提升效率。

分布式系统是复杂的,但是 Elasticsearch 的产品设计使得它变得简单易用。当你下载到一个安装包,不用修改任何配置就可以让它运行起来,相对于 Hadoop 系列的平台来说容易的多。

但是当你大规模应用于线上服务时,只使用默认配置是不够的,你需要根据自己的情况进行很多调整,你可以等系统出现问题的时候再去了解相关知识,但是对于入门级用户来说,最好先系统化地熟悉 Elasticsearch 的基础知识。

1. 入门知识

小白用户该如何学习 Elasticsearch 呢?

我们推荐阅读《Elasticsearch 权威指南》,虽然它的内容有些过时,但仍然是最适合入门者的材料,建议从第一页开始通读此书,并且搭建一个集群实际操作一下,这样会有一个直观的感受,加深理解和记忆。读书过程中会产生很多问题,因此可以自己做一些测试,或者与其他人互相交流探讨解决疑问。

每当读完一章,或者一个比较大的部分,你需要用自己的方式整理这部分的重点,可以是思维导图、PPT 或者 Markdown 等你喜欢的形式,这样当读完整本书的时候,你会形成自己的知识体系结构,通过查看笔记就可以掌握所有的关键环节。

学习的过程中一定要有输出,用自己的语言将学习到的知识表达出来。我们团队的同事们在学习完一部分内容后会在周会的时候做一次技术分享,虽然在制作 PPT 的时候会花些时间,但这是一个对知识整理的过程,你需要把它给大家讲明白。

在讲解的时候会面对大家的很多问题,在整个归纳和整理的过程中,你自己就发现很多疑问,连自己的说服不了,这就迫使你去彻底搞明白。但如果你只是被动地阅读,没有主动思考,理解的层次就往往流与表面,并且容易忘记。

这个过程进度不用太快,优先消化和吸收知识点,保证学习效果。最理想的是同时配合一些实践,虽然你刚刚学习完一大部分的内容,但是在线上遇到与这部分相关的问题时可能还是会有点懵,因此处理一些实际问题会让你对系统的理解更加深刻。

有些问题解决起来确实比较花时间,每次解决必须搞清楚到底什么原理,切忌模棱两可的结论,它可能是这样,也可能是那样,虽然有时候搞清楚到底怎么回事可能花费非常多的时间,但是一旦解决,以后你再也不会受它的困扰,否则后续遇到类似问题仍然是原地踏步。

这个时期的参考资料不建议去 baidu 查阅中文博客的文章,因为这些资料经常有很多一知半解的错误,并且内容过时。

官网的 API 手册、GitHub 上的 Issues、Pull Request,以及中文及英文社区是最权威的内容,绝大部分问题都可以找到答案。尤其是在 API 的使用方式上,官网的手册是非常完整的,并且很多 API 在不同版本之间存在较大差异,因此最好在手册中选择与自己一致的版本。

如何构建一个高可用、低延迟的 Elasticsearch 集群?_第1张图片

对于集群故障,也尽量不要百度查找答案,搜索技术内容 Google 要要准确的多。另外,有条件的话也可以报名参加官方的培训课程,并考取 Elasticsearch 工程师认证。官方的培训是线下的形式,基于最新的稳定版,并且对于学习中的问题可以现场得到最权威的解答,是效率最高的学习方式。

2. 进阶学习

当你系统化地学习过基础知识,并且有了一些线上故障处理经验,进一步的学习需要关注更多内容,有时候你会遇到比较深层次的问题,虽然在《Elasticsearch 权威指南》中有许多原理方面的知识,但是仍然不够,有些问题你需要从源码中找到答案。

进阶方面的内容可以阅读我的另一本书《Elasticsearch 源码解析与优化实战》以及本课程。系统化的学习,以及自己的亲身经历让你成长很多,现在可能集群也比较稳定,你也许不知道接下来应该再学些什么?怎样进一步提升?

现在是时候拓宽眼界,关注社区的发展,以及别人都遇到了哪些问题,不再局限于自己所处的环境。因此建议定期关注以下内容:

  • 订阅 Elasticsearch 日报,日报每天会推送一些最近技术动向,以及网络上其他人编写的比较不错的内容,订阅地址:https://tinyletter.com/elastic-daily
  • 英文社区论坛,不可否认官方英文论坛是最活跃的,你可以在这里看大别人都遇到了什么问题,是怎么解决的,这里有官方的工程师回应:https://discuss.elastic.co/
  • 英文社区博客,官网的博客大部分是关于新产品的信息,但是也有一些对于底层原理的细致讲解,不可错过。地址:https://www.elastic.co/blog
  • GitHub PR,其他人对 Elasticsearch 提交的改动,对于实际问题很有参考价值:https://github.com/elastic/elasticsearch/pulls
  • GitHub issues,其他人的提议和 bug 反馈等:https://github.com/elastic/elasticsearch/issues
  • 中文社区论坛,国内用户交流比较多,英文不好的同学和一些一般性问题也可以来此提问:https://elasticsearch.cn
  • 中文社区的精彩分享,线下活动分享的 PPT 会放在这个地方,非常值得借鉴和学习,不可错过:https://elasticsearch.cn/slides/
  • 社区电台,勇哥会经常对大规模应用 Elasticsearch 的企业做访谈,聊一聊他们的使用情况,遇到的问题及建议,并且普及一些大家可能不了解的知技术点,很多问题和解决方案都是通用的,可以借鉴和参考。订阅地址:
    https://www.ximalaya.com/zhubo/111156131/

此外,建议多参加 Meetup 及技术交流会等线下活动,很多问题还是线下交流效果更好,毕竟 PPT 上的语言太过简练,同时也可以得到比较权威的答案。

很多问题是大规模应用的时候才会遇到,当集群数据量比较小,请求也比较少的时候,Elasticsearch 基本不会出问题。而大规模应用的企业一般都在比较大型的互联网公司,线下聊一聊很大程度上让你可以对业界情况有一定了解。

我们将从入门到进阶的知识体系大致归纳如下:

如何构建一个高可用、低延迟的 Elasticsearch 集群?_第2张图片
努力吧,你也将成为 Elasticsearch 专家!同时也建议提交一些有价值的 PR,共同促进 Elasticsearch 发展。

寄语

本课程着重讨论 Elasticsearch 在实际应用场景中所遇到和关心的问题。下一节将介绍如何规划新集群。

Elasticsearch 本身是一个分布式存储系统,也有一些特点像 NoSQL,同时又是一个全文检索系统,这就需要掌握更多的知识,同时可以思考一些其他类似系统的特点,例如在分段合并方面 HBase 是怎么做的,在磁盘管理、坏盘处理方面 HDFS 是怎么做的,等等。

由于 Elasticsearch 在使用方面的自由度比较大,我们希望告诉读者合理的部署和使用方式应该是什么样的,并且对于常见问题给出分析方法和解决方式,但是希望读者能够更多地思考背后的原理,掌握技术本质。大数据平台的很多理论都是相通的。

一个技术问题有多种解决方式,希望读者深入思考,关心背后原理,而非只是解决眼前问题。

为了方便学习和技术交流,特此创建了高可用 Elasticsearch 集群的读者群,入群方式写在第 1-3 课文末,欢迎已购本课程的同学入群交流。

点击了解《高可用 Elasticsearch 集群 21 讲》。

如何构建一个高可用、低延迟的 Elasticsearch 集群?_第3张图片

你可能感兴趣的:(架构,运维开发,运维,GitChat技术杂谈)