ELK文档

  1. ELK日志收集架构:

image
  • 第一层、数据采集层

数据采集层位于最左边的业务服务器集群上,在每个业务服务器上面安装了filebeat做日志收集,然后把采集到的原始日志发送到Kafka+zookeeper集群上。

  • 第二层、消息队列层

原始日志发送到Kafka+zookeeper集群上后,会进行集中存储,此时,filbeat是消息的生产者,kafka作为消息队列进行存储消息,存储的消息可以随时被消费。

  • 第三层、数据分析层

Logstash作为消费者,会去Kafka+zookeeper集群节点实时拉取原始日志,然后将获取到的原始日志根据规则进行分析、清洗、过滤,最后将清洗好的日志转发至Elasticsearch集群。

  • 第四层、数据持久化存储

Elasticsearch集群在接收到logstash发送过来的数据后,执行写磁盘,建索引库等操作,最后将结构化的数据存储到Elasticsearch集群上。

  • 第五层、数据查询、展示层

Kibana是一个可视化的数据展示平台,当有数据检索请求时,它从Elasticsearch集群上读取数据,然后进行可视化出图和多维度分析。

  1. Filebeat:

角色分类:

  • Input(新版)/ Prospecto(旧版):[勘探者]负责管理收割机并找到所要读取的源,在此处配置源日志路径。
  • Harvester:[收割者]读取源路径log文件的内容,每个Harvester会逐行读取各个文件,并将文件内容发送到指定输出中。Harvester会负责打开和关闭文件如果文件在收集过程中被删除或重命名,Filebeat 会继续读取该文件。这会产生副作用,即磁盘上的空间会被保留,直到收割机关闭。

Filebeat 如何保持文件状态?

  • 将文件状态记录在注册文件中(默认在/var/lib/filebeat/registry)。此状态可以记住Harvester收集文件的偏移量。

  • 将状态刷新到注册表文件中的磁盘。该状态用于记住收割机读取的最后一个偏移量offset,并确保发送所有日志行。(注册表记录重建状态)

  • 当输出无法访问,filebeat会跟踪发送的最后一行,在输出可以访问后继续读文件。

  • 每个Input为它找到的每个文件保留一个状态,前提是Filebeat一直运行。由于文件可以重命名或移动,文件名和路径不足以识别文件。对于每个文件,Filebeat 存储唯一标识符以检测之前是否收集了文件。

  • 如果在收割机关闭时移动或删除文件,则 Filebeat 将无法再次拾取该文件,收割机尚未读取的任何数据都将丢失。

Filebeat 如何确保至少一次交付?

  • 将每个事件的传递状态存储在注册表文件中( Filebeat 将它收集的每个文件的状态存储在注册表中)

  • 任何发送到输出但在 Filebeat 关闭之前未确认的事件,将在 Filebeat 重新启动时再次发送。这可确保每个事件至少发送一次,(最终可能重复发送)可通过设置shutdown_timeout选项将 Filebeat 配置为在关闭之前等待特定时间,时filebeat在真正关闭前确认事件已经收到。

一些常见codecs处理:

  • json:使用json格式对数据进行编码/解码。
  • multiline:将汇多个事件中数据汇总为一个单一的行。在此处对日志进行多行处理,防止在logstash处理会导致数据损坏。

配置信息(Filebeat只负责收集和多行处理,没有对日志信息作其他操作):

Input:输入类型type、源日志路径paths、扩展字段(即后续kafka的topic)fields 。

Output:主机组hosts、主题topic(此时output到kafka)、分片partition.hash 。

  1. Kafka:

为什么选择kafka?

消息传递模式分为两种:点对点传递模式、发布-订阅模式

  • 点对点模式:到达消息队列的每一条消息只能被消费一次,消费完该条数据从消息队列中删除,生产者发送一条消息到queue,只有一个消费者能收到。

  • Kafka就是一种发布-订阅模式。消息被持久化到一个topic中。与点对点消息系统不同的是,消费者可以订阅一个或多个topic,消费者可以消费该topic中所有的数据,同一条数据可以被多个消费者消费,数据被消费后不会立马删除。

kafka术语解释:

  • Broker:kafka集群服务器节点node,即主机节点,broker存储topic的数据,(当topic有n个partiton,集群有n个broker,每个broker存该topic的一个partition,其他数目另外策略)【建议:broker数大于某topic的paititon数】

  • Topic:发送到kafka集群的消息一个大类别,逻辑上一个topic的消息保存于一个或多个broker,物理上不同topic(可能是同topic不同partition)的消息分开存储????

  • Partition:topic切分为一个或多个partition,切分提高了kafka的吞吐率。每个partition中的数据使用多个segment文件存储。

  • Partition:单个partition中的数据是有序的,不同partition间的数据丢失了数据的顺序。如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。

  • Segment:文件存储单位,直接保存partiton数据。

  • Producer:broker接收到生产者Producer发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者也可以指定数据存储的partition。此处生产者Producer是Filebeat。

  • Consumer:消费者,对应producer生产者。有对应的consumer group消费者组,zookeeper会在组变化时进行rebalance。此处的消费者Consumer是Logstash。

  • Leader:每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。

  • Follwer:Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。

  • 机制:leader失效,follower选举新leader,通过zookeeper管理集群配置。follower卡住或者同步太慢,把此follower删掉,重新创建一个新follower。(leader和follwer基于zookeeper实现)

  • Offset:offset值表示在分区partition中的位置。

kafka工作机制:

  • 每条消费都必须指定它的topic。

  • partiton顺序写磁盘,每条消息append到该partiton上。

  • kafka的pull模式,concumer消费者必须主动从kafka拉(pull)取数据、订阅数据。

  • Kafka提供两种策略删除旧数据。一是基于时间,二是基于Partition文件大小。

  • 每个partiton相当于一个文件夹,里面存储这个partition的消息和索引。超过一个的partiton会失去数据的顺序。

配置信息:

  • 配置文件配置保留数据策略log,分区数partition,zk监听地址connection,kafka唯一标识码broker.id
  • 提前在命令行创建写入kafka的主题topic、分区数partition以及副本数replication-factor。
  1. Zookeeper:

功能作用:

在基于 Kafka 的分布式消息队列中,ZooKeeper 的作用有:broker 注册、topic 注册、消费组的控制、producer 和 consumer 负载均衡、维护 partition 与 consumer 的关系、记录消息消费的进度以及 consumer 注册等。

  1. Logstash:

内部结构图:

image

角色类型:

  • Input :从kafka集群订阅消息。(logstash 管道中的每个输入阶段都在自己的线程中运行)
  • Filter:过滤器(做正则匹配和加解码)
  • Output:输出es集群集群

配置信息:

配置input:kafka集群地址,组group id, kafka中的消费主题topics。

配置filter:过滤器,配置json解码,grok正则,ruby匹配。

配置output:es集群地址,es存放索引。

使用 Grok 正则过滤器例子:

  • 原日志格式

55.3.244.1 GET /index.html 15824 0.043

  • Grok match匹配

%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration} #格式转换(IP WORD 这些是提前设定的正则表达式)

  • 结果输出

client: 55.3.244.1

method: GET

request: /index.html

bytes: 15824

duration: 0.043

  1. Elasticsearch(简称ES):

功能作用:

  • 一个分布式的实时文档存储,每个字段可以被索引与搜索

  • 一个分布式实时分析搜索引擎

ES术语解释:

  • node 节点:一个运行中的Elasticsearch 实例称为一个节点。(分为master节点,data节点,client节点)

  • cluster 集群:集群是由一个或者多个拥有相同 cluster.name配置的节点组成, 它们共同承担数据和负载的压力。

  • shard 分片:分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。分片 是一个底层的工作单元,它仅保存了全部数据中的一部分。它本身就是一个完整的搜索引擎。

  • 文档:它是指最顶层或者根对象, 这个根对象被序列化成 JSON 并存储到 Elasticsearch 中,指定了唯一 ID。

  • 文档被存储和索引到分片内。应用程序是直接与索引而不是与分片进行交互。

  • 一个文档不仅仅包含它的数据 ,也包含元数据—— 有关文档的信息。 三个必须的元数据元素如下:

_index 索引名

文档在哪存放 [一个索引应该是因共同的特性被分组到一起的文档集合]

_type 索引类型

文档表示的对象类别

_id 文档名

它和 _index 以及 _type 组合就可以唯一确定 Elasticsearch 中的一个文档,生成一个文档

  • 文档是不可变的:他们不能被修改,只能被替(当对文档作修改时底层是生成新文档,然后做新的索引)

ES集群健康状态:

  • green

所有的主分片和副本分片都正常运行。

  • yellow

所有的主分片都正常运行,但不是所有的副本分片都正常运行。

  • red

有主分片没能正常运行。

(测试:curl -X GET "localhost:9200/_cluster/health?pretty”)

查看 status 字段中展示为 green 、 yellow 或者 red

ES集群内部工作操作:

  1. 新建、索引和删除 请求都是写操作(在主分片上面完成修改之后,被复制到相关的副本分片)

在客户端收到成功响应时,文档变更已经在主分片和所有副本分片执行完成,变更是安全的。

image
  1. 取回单个文档(读不一定要在主分片读,可以在副本分片上读取文档,负载均衡读)
image
  1. 作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点

ES集群配置:

  • Elasticsearch 默认被配置为使用单播发现,以防止节点无意中加入集群。
  • ES集群要有同样的 cluster.name配置,它就会自动发现集群并加入到其中。 但是在不同机器上启动节点的时候,为了加入到同一集群,你需要配置一个可连接到的单播主机列表[discovery.zen.ping.unicast.hosts#设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点] 。

ES数据结构

  • Elasticsearch 使用一种称为倒排索引的结构。

  • 一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。

  • 倒排索引包含一个有序列表,列表包含所有文档出现过的不重复个体,或称为 词项 ,对于每一个词项,包含了它所有曾出现过文档的列表。

  • 例子:

  1. <u>The quick brown fox jumped over the lazy dog</u>
  2. <u>Quick brown foxes leap over lazy dogs in summer</u>

Term Doc_1 Doc_2 #维护的文档列表


Quick | | X

The | X |

brown | X | X

dog | X |

dogs | | X

fox | X |

foxes | | X

in | | X

jumped | X |

lazy | X | X

leap | | X

over | X | X

quick | X |

summer | | X

the | X |


之后在根据近义词,大小写,单复数等等的相关性,对文档列表进行标准化

Term Doc_1 Doc_2 #维护的标准化文档列表


brown | X | X

dog | X | X

fox | X | X

in | | X

jump | X | X

lazy | X | X

over | X | X

quick | X | X

summer | | X

the | X | X


  1. Kibana:

功能作用:

数据查询,数据展示,导出数据信息

语法:

  • url拆分:http_host 域名/upstream_name(服务名)/具体路径 #(upstream最终一定能到达)

  • url拆分:http_host 域名/request(请求详情) #(request不一定能全部到达)

  • status: 状态码

  • x-user-id: 用户ID

  • remote_addr: 远程IP

  • http_x_forwarded_for : 远程IP

  • request_api: 请求的api,不带参数

导出不需要统计的数据:

Step 1:

image

Step 2:

image

Step 3:

image

注意:从kibana中导出的数据有大小限制,此处最大支持导出文件大小500MB,可在配置文件修改maxsize,但是不建议过大,设置过大值可能会导致kibana服务器崩溃。

导出统计的数据:

image

步骤:visualize--加号(➕)----Data----Data Table----new search----选择检索的日志(index:ngxlog-public-*)----Metrics(选择监控项)----Buckets(选择切割方式)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容