diff --git a/Observability/conclusion.md b/Observability/conclusion.md index a9d7fee1..aa496a56 100644 --- a/Observability/conclusion.md +++ b/Observability/conclusion.md @@ -8,4 +8,6 @@ https://github.com/cncf/tag-observability/blob/dec82aa5bd39a8834f58da0377d1e2b8f - 《Gorilla:快速、可扩展的内存时间序列数据库》https://blog.acolyer.org/2016/05/03/gorilla-a-fast-scalable-in-memory-time-series-database/ - https://github.com/open-telemetry/docs-cn/blob/main/OT.md -- https://medium.com/lightstephq/observability-will-never-replace-monitoring-because-it-shouldnt-eeea92c4c5c9 \ No newline at end of file +- https://medium.com/lightstephq/observability-will-never-replace-monitoring-because-it-shouldnt-eeea92c4c5c9 + +- https://blog.devgenius.io/what-is-inverted-index-and-how-we-made-log-analysis-10-times-more-cost-effective-with-it-6afc6cc81d20 \ No newline at end of file diff --git a/Observability/logging.md b/Observability/logging.md index 97e92762..3c3d2c8e 100644 --- a/Observability/logging.md +++ b/Observability/logging.md @@ -1,23 +1,22 @@ # 9.2.2 事件日志 -日志我们绝对不会陌生(绝大多数程序员生涯的第一行代码都是从打印 “hello world” 开始)。整个日志系统中最成熟的部分就是打印日志。尤其是本地日志打印,各式各样层出不穷的 logging Library,同步的异步的、有锁的无锁的、有上下文的无上下文的、高性能的低性能的,花活最多轮子也造的最多。 +作为最古老而又最具体的 Signal,日志是用来记录系统运行期间发生一系列离散的事件,特别是非预期的行为、异常情况。在缺乏有力的监控系统时,日志通常是工程师定位生产问题时最直接的手段。如果 Metrics 是告诉我们系统出现问题,那么日志就是告诉我们为什么会出现问题。 -作为最古老而又最具体的 Signal,日志记录的是系统运行期间发生的离散的事件,特别是非预期的行为、异常情况。大部分的时候都是基于可读性较好的文本。 - - -今天只要稍微复杂点的系统,已经很难只依靠 tail、grep、awk 来从日志中挖掘信息,对于日志的完整处理,除了打印,还包含着日志采集、日志传输、日志清洗、日志存储、分析与检索、告警与智能化响应一系列步骤。 +从程序员生涯的第一行代码打印 “hello world” 开始,再到从 Nginx 的 access.log 中通过 awk 挖掘信息,对于日志的生产和处理,相信程序员们绝对不会陌生。而今天只要稍微复杂点的系统,已经很难只依靠 tail、grep、awk 来从日志中挖掘信息。现在对日志的完整处理,除了打印,还包含着日志采集、日志传输、日志清洗、日志存储、分析与检索、告警与智能化响应一系列步骤。 +日志的处理和分析是典型的大数据分析场景之一,高吞吐写入、低成本海量存储、实时文本检索,业内通常以 ELK(倒排索引架构,消耗巨大的资源建立索引,巨大的存储成本)和 Grafana Loki(轻量索引,检索性能慢)为代表的两类权衡架构。 ## ELK 谈论实现一套完整的日志系统,相信用户或多或少都应该听说过这几个名词:Elasticsearch、ELK 或者 Elastic Stack。 - :::tip ELKB ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。 Elasticsearch 是一个搜索和分析引擎。 Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。Beats 作为轻量级的数据搬运工,集合了多种单一用途数据采集器,将数据发送给 Logstash 或 ElasticSearch,其可扩展的框架及丰富的预置采集器将使工作事半功倍。 ::: +总结起来, ELK 是一组开源组件组成的套件,组件之间作用不用,各司其事,可以像网络协议一样按分层来理解和归类,所以形成一个类似 TCP/IP Stack 类似的 ELK Stack,如下图所示。但明确的是 ELK 中的 Stack 肯定不是协议栈,跟协议没有任何区别。为严谨准确,我们把上面的所有名词简称为 Elastic。 +
Loki 架构:与 Prometheus、Grafana 密切集成
@@ -25,10 +24,15 @@ ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elastic ELK 中最核心的是 Elasticsearch,它是一个分布式搜索分析引擎,提供一种准实时搜索服务(生产环境中可以做到上报 10 秒后可搜,不惜成本万亿级日志秒级响应)。与 Elasticsearch 类似的产品还有商业公司 Splunk 和 Apache 开源的 Solr。事实上,Elasticsearch 和 Solr 都使用了著名的 Java 信息检索工具包 Lucene,Lucene 的作者就是大名鼎鼎的 Doug Cutting,如果你不知道谁是 Doug Cutting,那你一定听过他儿子玩具的名字 -- Hadoop。 -Elastic Stack 之所以流行的一个原因之一,可能是它的无侵入性。对于遗留系统的日志,它可以做到悄无声息地把处了上面打印日志之外的所有事情,全都给做了。 +Elasticsearch 在日志场景中的优势在于全文检索能力,能快速从海量的数据中检索出关键词匹配的日志,其底层核心技术是转置索引(Inverted index)。正常的索引是按 ID 查询详情,类似字典通过页码查询内容。转置索引反过来,将每一行文本进行分词,变成一个个词(Term),然后构建词(Term) -> 行号列表(Posting List) 的映射关系,将映射关系按照词进行排序存储。当需要查询某个词在哪些行出现的时候,先在 词 -> 行号列表 的有序映射关系中查找词对应的行号列表,然后用行号列表中的行号去取出对应行的内容。这样的查询方式,可以避免遍历对每一行数据进行扫描和匹配,只需要访问包含查找词的行,在海量数据下性能有数量级的提升。 +inverted index
+Loki Grafana