Loki Stack收集MongoDB日志最佳实践(下)

前戏 小白: 前文我们提到了 Fluent Bit 采集器, 我对它的一些配置信息很感兴趣, 它是如何高效采集的? 老花:Fluent Bit 作为一个轻量级的日志收集器,特别适合在 Kubernetes 环境中作为 DaemonSet 运行。它的核心配置涉及服务(services), 解析器(parsers),输入配置(inputs), 输出配置(outputs)等。总结来说, 一套日志流可以定义多个插件, 通过tag和match来流转。 Fluent Bit 核心配置解析 Fluent Bit 架构图 在这个时序图中: Inputs:输入插件收集来自不同输入源的日志记录。 Parsers:解析器插件解析输入的日志记录。 Filters:过滤器插件对日志记录进行特定的修改,如添加或删除键值对,丰富特定元数据,或基于特定条件丢弃记录。 Storage:处理后的数据被认为是安全状态(要么在内存中,要么在文件系统中),然后记录通过适当的输出目的地进行路由。 StreamProcessor:流处理器是一个独立的子系统,它检查存储接口上的新记录。通过配置,流处理器可以附加到来自特定输入插件的记录,或通过应用标签和匹配规则。 Outputs:输出插件将处理后的数据发送到配置的输出目的地。 多线程 Fluent Bit会自动管理输入和输出插件的线程,确保在多线程环境中高效运行。过滤器始终在主线程中运行,而处理器则在各自的输入或输出的独立线程中运行。 内存管理 在容器化环境中,估算Fluent Bit的内存使用量至关重要。可以通过设置Mem_Buf_Limit选项来限制输入插件的内存使用。例如,如果设置Mem_Buf_Limit为 10MB,输出插件在最坏情况下可能会使用20MB,因此总内存需求应为30MB(10MB + 20MB),再加上一定的安全余量。 增量采集 Fluent Bit 通过检查日志文件的偏移量来实现增量采集。它会记录每个文件的最后读取位置,并在下一次采集时从该位置开始,确保不会重复采集。 缓冲与存储 Fluent Bit 通过缓冲机制临时存储处理后的数据,直到数据准备好被发送。 Fluent Bit 使用内存作为主要的临时存储位置,但在某些场景下,使用基于文件系统的持久缓冲机制可以提供聚合和数据安全能力。 输入插件发出的记录被引擎组合在一起形成块,通常大小约为 2MB,默认仅在内存中创建。 如果仅设置内存作为缓冲,它将尽可能多地在内存中存储数据。这是最快的机制,但如果服务因网络慢或远程服务无响应而无法快速分发记录,Fluent Bit 的内存使用量将增加。 背压问题 当日志或数据的产生速度, 超过其被刷新到某些目的地的能力时,会产生背压,导致服务内存消耗增加。Fluent Bit通过Mem_Buf_Limit和storage.Max_Chunks_Up配置参数限制输入插件可以摄入的数据量。 核心配置项 buf_chunk_size: 缓冲区块大小,用于存储日志数据。 buf_max_size: 缓冲区最大大小。 batch_size: 每个批次发送的日志条目数。 batch_wait: 等待更多日志条目到达以填满批次的时间。 mem_buf_limit: 内存缓冲区限制。 mem_buf_flush_count: 触发缓冲区刷新的日志条目数。 这些配置影响内存的使用, 是否产生背压, 以及写入后端outputs的效率(攒批)。 ...

十二月 9, 2024 · 3 分钟 · 622 字 · zhu733756

Loki Stack收集MongoDB日志最佳实践(上)

前戏 老花:小白,我们今天来聊聊收集容器日志的那些事儿。 小白:好啊,老花。我听说有好几种方法可以收集容器日志,你能给我讲讲吗? 常见收集容器日志的方法 老花:当然可以。最常见的有两种方法:Sidecar和DaemonSet。 Sidecar:俗称边车, 在每个需要收集日志的容器旁边运行一个Sidecar容器,专门负责日志收集。这种方法的好处是可以为每个应用提供定制化的日志收集配置,但缺点是资源消耗较大,因为每个应用都需要额外的容器。 DaemonSet:在Kubernetes集群的每个节点上运行一个Pod,负责收集该节点上所有容器的日志。优点是资源消耗较小,因为每个节点只需要一个Pod。缺点是配置不够灵活,因为所有容器共享同一个日志收集配置。 小白:我明白了,那我们通常用哪种方法呢? 老花:这取决于你的具体需求。如果你需要高度定制化的日志收集策略,可能会选择Sidecar。如果你更关心资源消耗,DaemonSet可能更适合。 日志收集系统优缺点 老花:不管是哪种收集方式, 都需要暴露日志路径给收集器。日志除了收集, 通常还有轮转、转换、存储和可视化查询等组件整合在一起, 组成强大日志收集系统。 我们来聊聊几个常见的日志收集系统: 采集、转换、扭转: Loki:轻量级,易于水平扩展,但不支持全文搜索。 Fluentd/Fluent Bit:Fluent Bit 轻量级,插件丰富,Fluentd 插件丰富,支持多种数据源和目的地,灵活的配置,适合大规模部署。 Logstash:功能强大,但资源消耗大,配置复杂。 Filebeat:轻量级,易于配置,但功能不如 Logstash。 网易和阿里开源的采集组件也很强大。 存储: Elasticsearch/ OpenSearch,搜索能力强,但成本高; ClickHouse(CK),查询速度快,成本较低。 套件: ELK Stack(Elasticsearch, Logstash, Kibana):功能强大,但资源消耗大,配置复杂。 EFK Stack(Elasticsearch, Fluent, Kibana):功能强大,fluent-bit资源消耗低, 插件不如fluentd丰富,配置容易。 Loki on grafana:采集组件可以使用promtail或者fluent-bit, 不需要额外的存储, 还自带可视化界面 UI, 多租户, 读写分离, 但不支持全文搜索。 各种采集器+ Kafka + ClickHouse +ClickVisual 等等。 小白:听起来每个系统都有它的优缺点,我们应该怎么选择呢? 老花:确实,选择哪个系统取决于你的具体需求,比如预算、资源、搜索需求等。 Loki 接入 MongoDB 分片集群日志最佳实践 小白:老花,我们公司正在用 MongoDB 分片集群,你觉得用 Loki 来收集日志怎么样? 老花:这是个好问题。Loki 可以很好地集成 MongoDB 分片集群的日志。我们可以部署 Promtail或者Fluent-bit 等采集器 作为 DaemonSet 来收集 MongoDB 的日志,然后将它们发送到 Loki。 ...

十二月 6, 2024 · 3 分钟 · 553 字 · zhu733756

MongoDB分片集群在k8s上的部署实战(二)

前戏 小白:你好,老花!前面我们已经用kind创建了一个k8s集群, 接下来我们怎么部署sharded cluster? 老花:当然可以,小白!我们先从 Helm 的安装开始,然后详细介绍 Helm 中的每个角色配置,最后解释 Helm 应用是如何运行起来的。 helm 简介 安装 helm 老花:Helm 是 Kubernetes 的包管理器,它帮助我们管理 Kubernetes 应用。安装 Helm 的步骤如下: 下载 Helm:访问 Helm 的官方 GitHub 页面,下载最新版本的 Helm。 解压并移动 Helm 到你的 PATH 中: tar -zxvf helm-v3.0.0-linux-amd64.tar.gz cd linux-amd64 sudo mv helm /usr/local/bin/ 验证 Helm 是否安装成功: helm version 老花:Helm也安装好了,我们可以开始部署 MongoDB Sharded 集群了。再安装之前, 我们先了解 Helm 的基本命令。 Helm 常见命令汇总 helm init:初始化 Tiller(在 Helm 3 中不再需要)。 helm repo add <repo_name> <repository_url>:添加一个新的 Helm 仓库。 helm repo list:列出所有已添加的 Helm 仓库。 helm repo update:更新本地仓库的缓存。 helm search repo <keyword>:在所有仓库中搜索 Chart。 helm search hub <keyword>:在 Helm Hub 中搜索 Chart。 helm install <release_name> <chart>:安装一个 Helm Chart,并给它一个发布名称。 helm install --namespace <namespace> <release_name> <chart>:指定命名空间安装 Helm Chart。 helm list:列出所有的 Helm 发布。 helm status <release_name>:获取指定 Helm 发布的状态信息。 helm upgrade <release_name> <new_chart>:升级一个现有的 Helm 发布到新版本的 Chart。 helm rollback <release_name> <revision>:将 Helm 发布回滚到指定的版本。 helm uninstall <release_name>:卸载一个 Helm 发布。 helm history <release_name>:查看一个 Helm 发布的更新历史。 helm package <chart_dir>:将 Helm Chart 打包成 tgz 文件。 helm show chart <chart>:查看一个 Helm Chart 的详细信息。 helm get values <release_name>:查看指定 Helm 发布的配置值。 helm get all <release_name>:查看指定 Helm 发布的所有配置和值。 helm dependency list <chart>:列出一个 Helm Chart 的依赖。 helm dependency update <chart_dir>:更新一个 Helm Chart 目录中的依赖。 helm lint <chart_dir>:对一个 Helm Chart 进行 lint 检查。 MongoDB Helm Chart 中的每个角色配置 前文提到过, MongoDB Sharded 集群主要包括以下几个角色: ...

十一月 28, 2024 · 4 分钟 · 661 字 · zhu733756

MongoDB分片集群在k8s上的部署实战(一)

前戏 小白:你好,老花!我对在 Kubernetes 上使用 Helm 部署 MongoDB Sharded 集群很感兴趣,但我对 Kind 和 Helm 不太熟悉,你能详细教我一下吗? 老花:当然可以,小白!我们先从 Kind 和 Helm 的安装开始,然后详细介绍 Helm 中的每个角色配置,最后解释 Helm 应用是如何运行起来的。 Kind 快速构建集群 Kind 是一个使用 Docker 容器作为节点来运行本地 Kubernetes 集群的工具。可以通过以下步骤安装 Kind: 安装 Docker Kind 需要 Docker 来运行 Kubernetes 集群,所以首先确保你已经安装了 Docker。 安装 Kind 可以使用以下两种方式中一种下载: > sudo apt-get install kind > go install sigs.k8s.io/kind@v0.25.0 Tip: 如果镜像无法拉取, 可以配置一些国内源: cat /etc/docker/daemon.json { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn" ] } 或者使用代理: { "proxies": { "default": { "httpProxy": "http://xxxx:xx", "httpsProxy": "https://xxxx:xx", "noProxy": "docker.m.daocloud.io,127.0.0.0/8" } } } 创建Kind集群: 配置docker和环境 下面的命令修改了docker运行时, 并配置了ulimits上限: ...

十一月 27, 2024 · 3 分钟 · 563 字 · zhu733756