今天这个话题对于大部分工程师应该都是基本常识了,我也就算是抛砖引玉,大家有什么好玩的经历或者体验都可以在留言里分享。
日志系统的架构经过多年的演变,现在比较流行的一种应该是 ELK (ElasticSearch-LogStash-Kibana) 架构了。或者大部分时候其实也可以说是 ELK with Redis 架构。这个系统把当下流行的 Elasticsearch, Logstash and Kibana 组合在一起,搭建了一个端到端的日志系统,以方便工程师对日志的查询。

上图中:
  • 最左边的 Shipper 通常是一个 local 的 syslog 机制。Syslog 是一种计算机 logging 的标准。最早是 Sendmail 的一部分,后来演化支持多种不同的平台和应用。尤其在 Unix 或者 Linux 操作系统上,成为了日志的默认标准。很多系统通过 rsyslog 收集日志,例如 Rails 上的 Rails.logger.*,一些基于 JVM 应用的 runit 的 svlogd,以及一些 nginx 的 log 等等。
  • Redis 常常被用作日志的 broker。该 broker 的一个主要功能就是防止 production 系统的阻塞。所有 shipper 产生的 log 都会先在 Redis instance 上 enqueue,等待 downstream 的 LogStash worker 从中读取、parse 以及 index。
  • Logstash 主要做的就是 index。Index 是搜索系统里很常见的一个概念,其过程可以概括为 ETL (Extract-Transform-Load),这个过程主要是将数据从 upstream 的格式(这里可能是标准的 Syslog 格式)解析转化成 downstream 的 ElasticSearch 的文档格式,并 load 到 ElasticSearch 中。
  • ElasticSearch 是主要的搜索引擎。一方面,他从上游的 indexer 那里接收 index 好的文档;另一方面,它提供固定的 query 格式通过 API 来支持对内容的检索。对 ElasticSearch 不熟悉的,建议查看一下其 API 文档对其稍作了解。很多别的搜索引擎的 API 都比较类似。主要是内部系统的差别以及一些比较高级属性的差别(例如父子结构等)。
  • 最后就是 Kibana。Kibana 就是一个 web interface,让用户可以比较方便的写出搜索表达式,以及 apply 一些相关的搜索 filter。
ELK 系统的搭建和详细的介绍,可以参见 logstash 的文档或者 logstash book。我问了一些中小型的公司,貌似 ELK 日志系统基本是现在日志系统的主流架构。一些大公司会定制自己的日志系统,处理一些特殊的业务需求,例如多系统日之间的合并和拆分等。
简单说说几点小体会吧。
首先,这种架构在可用性和扩展性方面往往都已经做的比较成熟。Redis、LogStash、ElasticSearch 的 cluster 中任何一个节点挂掉,索引及副本都会自动重新分配。向 cluster 中增加新的节点,索引也会自动重新组织以达到负载平衡。至少理论上是这样。
那实际中最容易出现的问题是什么呢?所有这种类队列的架构,几乎无可避免的问题就是队列的阻塞。举几个例子:
  1. 如果 log 量突增,collector/shipper 产生的日志量过大,可能会导致 logstash 的队列的 backup。
  2. ElasticSearch 节点 failure(如 disk failure)等,可能导致 indexed log 无法 load 而阻塞。
  3. ElasticSearch Split Brain 的发生导致需要重启 master 节点,cluster 需要时间恢复,也可能导致 logstash 队列的阻塞。
另一个比较常见的问题就是对配置文件改动的测试如果不够完全,那么也会很容易导致 production 的问题。通常对配置改动最好有 test box 可以预先测试再 populate 到所有 production box,以避免这种情况的发生。
最后就是 Kibana。因为 Kibana 的一些搜索结果可能对一些问题的 debugging 或者 investigation 有帮助,偶尔一个 query 会被 copy 并共享给多个工程师。而有一些 Kibana query 可能是对一周甚至更久的所有日志进行检索。根据每个公司业务的不同,这可能是亿兆级的数据量。当多个工程师同时打开这个 query 链接的时候,很容易搞挂一个 cluster。
对于 ELK 系统网上有资源可以进一步学习和了解。这几个资源比较常用:

  • LogStash Book:https://www.logstashbook.com/
  • ElasticSearch Doc:https://www.elastic.co/guide/index.html
  • Redis Doc:http://redis.io/documentation
  • Query Parser Syntax:http://lucene.apache.org/core/3_5_0/queryparsersyntax.html

题图:Glennz Tees
继续阅读
阅读原文