Loki安装部署
1、Loki介绍
Loki 是受 Prometheus 启发由 Grafana Labs 团队开源的水平可扩展,高度可用的多租户日志聚合系统。开发语
言: Google Go。它的设计具有很高的成本效益,并且易于操作。使用标签来作为索引,而不是对全文进行检索,
也就是说,你通过这些标签既可以查询日志的内容也可以查询到监控的数据签,极大地降低了日志索引的存储。
Loki 对标 EFK/ELK,由于其轻量的设计,备受欢迎,Loki 相比 EFK/ELK,它不对原始日志进行索引,只对日志的
标签进行索引,而日志通过压缩进行存储,通常是文件系统存储,所以其操作成本更低,数量级效率更高。
由于 Loki 的存储都是基于文件系统的,所以它的日志搜索时基于内容即日志行中的文本,所以它的查询支持
LogQL,在搜索窗口中通过过滤标签的方式进行搜索和查询。
Loki文档网址:https://grafana.com/docs/loki/latest/
下载网址:https://github.com/grafana/loki/releases
Github Loki:https://github.com/grafana/helm-charts/tree/main/charts/loki-stack
2、Loki架构
Loki 架构如下图所示:
Loki 分两部分,Loki 是日志引擎部分,Promtail 是收集日志端。
- Loki 是主服务器,负责存储日志和处理查询 。
- promtail 是代理,负责收集日志并将其发送给 loki 。
promtail 是日志收集 client;loki 是日志收集 service,它是一个时间序列数据库,可以作为 Granfna 的数据源
(类似于prometheus),同时它也有 Alert Rule 规则功能,可以向 Alertmanager 发送告警信息;而 Alertmanager
是一个独立的组件,专注于告警处理。
Loki 的数据可以通过Grafana进行展示。
只要在应用程序服务器上安装 promtail 来收集日志然后发送给 Loki 存储,就可以在 Grafana UI 界面通过添加
Loki 为数据源进行日志查询(如果 Loki 服务器性能不够,可以部署多个 Loki 进行存储及查询)。作为一个日志
系统不光只有查询分析日志的能力,还能对日志进行监控和报警。
Promtail 客户端采集日志数据,将其索引并存储在后端持久化存储中。
用户可以使用 LogQL 查询语言来过滤和检索特定的日志记录,并通过 Grafana 的集成来进行可视化分析。
3、Loki工作流程
1、promtail 收集并将日志发送给 loki 的 Distributor 组件。
2、Distributor 会对接收到的日志流进行正确性校验,并将验证后的日志分批并行发送到 Ingester。
3、Ingester 接受日志流并构建数据块,压缩后存放到所连接的存储后端。
4、Querier 收到 HTTP 查询请求,并将请求发送至 Ingester 用以获取内存数据 ,Ingester 收到请求后返回符合
条件的数据 ;如果 Ingester 没有返回数据,Querier 会从后端存储加载数据并遍历去重执行查询 ,通过 HTTP 返
回查询结果。
-
Promtail(采集器):Loki 默认客户端,负责采集并上报日志。
-
Distributor(分发器): Distributor 是 Loki 的入口组件,负责接收来自客户端的日志数据,并将其分发给不
同的 ingester 节点。
-
Ingester(摄取器): Ingester 负责接收并保存来自 Distributor 的日志数据。它将数据写入本地存储,并将
索引相关的元数据发送给 index 组件。
-
Index(索引): Index 组件负责管理和维护 Loki 中的索引数据结构。
-
Chunks(块文件): Chunks 是 Loki 中日志数据的物理存储形式。
-
Querier(查询器): Querier 是用于查询 Loki 中日志数据的组件。
4、LPG(Loki+Promtail+Grafana)与ELK比较优势
ELK 虽然功能丰富,但规模复杂,资源占用高,操作苦难,很多功能往往用不上,有点杀鸡用牛刀的感觉。loki 不
对日志进行全文索引。通过存储压缩非结构化日志和索引元数据,Loki 操作起来会更简单,更省成本。通过使用
与 Prometheus 相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高。安装部署简单快
速,且受 Grafana 原生支持。
架构和组件:
- Loki:Loki 是一个开源的水平可扩展日志聚合系统,由 Promtail、Loki 和 Grafana 组成。
- EFK:EFK 是一个集成的解决方案,由 Elasticsearch、Fluentd 和 Kibana 组成。
存储和查询:
- Loki:Loki 使用了基于日志流的存储方式,将日志数据存储为可压缩的块文件,并达到高度压缩效率。
- EFK:EFK 使用 Elasticsearch 作为中心化的日志存储和索引引擎。
可扩展性和资源消耗:
- Loki:Loki 的水平可扩展性非常好,可以处理大规模的日志数据。
- EFK:Elasticsearch 是一个高度可扩展的分布式存储系统,但它对硬件资源的要求较高,特别是在存储大规模日志数据时。
配置和部署复杂性:
-
Loki:Loki 的配置和部署较为简单。通过使用 Promtail 收集日志,并使用 Grafana 进行查询和可视化,可以
相对快速地启动和使用。
-
EFK:EFK 的配置和部署相对复杂一些。需要配置 Fluentd 的输入、过滤和输出插件,以及 Elasticsearch 和
Kibana 的集群设置。
5、Loki安装
这里通过编译好的二进制可执行文件进行安装。
下载地址:https://github.com/grafana/loki/releases/
配置文件参考地址:https://grafana.com/docs/loki/latest/configure/
5.1 下载Loki
# 下载
$ curl -O -L "https://github.com/grafana/loki/releases/download/v2.8.6/loki-linux-amd64.zip"
# 解压
# 解压之后只有一个二进制文件loki-linux-amd64
$ unzip "loki-linux-amd64.zip"
# 授权
$ chmod a+x "loki-linux-amd64"
# 查看版本
$ ./loki-linux-amd64 --version
loki, version 2.8.6 (branch: HEAD, revision: 990ac685e)
build user: root@75d791293cbe
build date: 2023-10-17T14:27:04Z
go version: go1.20.10
platform: linux/amd64
5.2 下载Promtail
# 下载
$ curl -O -L "https://github.com/grafana/loki/releases/download/v2.8.6/promtail-linux-amd64.zip"
# 解压
# 解压之后只有一个二进制文件promtail-linux-amd64
$ unzip "promtail-linux-amd64.zip"
# 授权
$ chmod a+x "promtail-linux-amd64"
# 查看版本
$ ./promtail-linux-amd64 --version
promtail, version 2.8.6 (branch: HEAD, revision: 990ac685e)
build user: root@75d791293cbe
build date: 2023-10-17T14:27:04Z
go version: go1.20.10
platform: linux/amd64
5.3 Loki配置文件
loki 配置文件:loki_config.yaml
auth_enabled: false
server:
# http监听端口,代理服务(promtail)会向此端口发送日志流
http_listen_port: 3100
# grpc监听端口
grpc_listen_port: 3110
# grpc最大接收消息值,默认4M
grpc_server_max_recv_msg_size: 1073741824
# grpc最大发送消息值,默认4M
grpc_server_max_send_msg_size: 1073741824
ingester:
lifecycler:
address: 192.168.151.195
ring:
kvstore:
store: inmemory
replication_factor: 1
final_sleep: 0s
chunk_idle_period: 5m
chunk_retain_period: 30s
max_transfer_retries: 0
# 一个timeseries块在内存中的最大持续时间,如果timeseries运行的时间超过此时间,则当前块将刷新到存储并创建一个新块
max_chunk_age: 20m
schema_config:
configs:
# 2020-10-24之后loki信息用下面的配置,这个主要是用来做兼容的
- from: 2020-10-24
# 索引使用哪种存储,还有boltdb-shipper
store: boltdb
# 怎么存储,简单部署的话保存在本地文件系统
object_store: filesystem
# 版本
schema: v11
# 索引怎么更新和存储
index:
# 索引前缀
prefix: index_
# 索引期限168小时,每张表的时间范围7天
period: 168h
storage_config:
boltdb:
# 索引文件存储地址
directory: /data/loki/index
filesystem:
# 块存储地址
directory: /data/loki/chunks
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
# 修改每用户摄入速率限制,即每秒样本量,默认值为4M
ingestion_rate_mb: 30
# 修改每用户摄入速率限制,即每秒样本量,默认值为6M
ingestion_burst_size_mb: 15
# 若不需要清理日志,以下配置均可删除
chunk_store_config:
# 最大日志可见时间,回看日志行的最大时间,只适用于即时日志
# 最大可查询历史日期28天,这个时间必须是schema_config中的period的倍数,否则报错
# max_look_back_period: 168h
max_look_back_period: 0s
table_manager:
# 日志保留周期开关,默认为false
retention_deletes_enabled: false
# 日志保留周期
# 表的保留期28天
# retention_period: 672h
retention_period: 0s
ruler:
# 告警地址,简单部署沿用即可
alertmanager_url: http://192.168.151.195:9093
analytics:
# 关闭向loki团队发送此配置文件
reporting_enabled: false
# 默认配置
common:
# 默认的路径前缀
path_prefix: /data/loki
storage:
filesystem:
# 压缩后的日志,存储在这个目录
chunks_directory: /data/loki/chunks
# 一些告警规则和查找规则,存储在这个目录,简单部署不用管
rules_directory: /data/loki/rules
# 简单部署不用管
replication_factor: 1
# 哈希环配置,简单部署不用管
ring:
# 一般为部署loki的机器的ip
instance_addr: 192.168.151.195
kvstore:
# 沿用即可
store: inmemory
compactor:
# compactor运行状态保存目录
working_directory: /data/loki/compactor
shared_store: filesystem
# 启动日志删除
retention_enabled: true
# compactor每隔10分钟运行一次
compaction_interval: 10m
# 在compactor运行2小时后删除
retention_delete_delay: 2h
# 用150个worker删除chunks
retention_delete_worker_count: 150
5.4 Promtail配置文件
promtail 配置文件:promtail_config.yaml
server:
# 监听端口
http_listen_port: 9080
# gRPC服务监听的端口(表示随机)
grpc_listen_port: 0
# grpc最大接收消息值,默认4M
grpc_server_max_recv_msg_size: 900000000000
# grpc最大发送消息值,默认4M
grpc_server_max_send_msg_size: 900000000000
positions:
# romtail保存文件的位置,服务异常关闭,启时可以继续在中断处继续采集,文件保存日志采集进度
filename: ./ositions.yaml
clients:
# oki接收日志的地址
- url: http://192.168.151.195:3100/loki/api/v1/push
batchwait: 10s
batchsize: 40960000
# 日志采集配置
scrape_configs:
# 这个随意配置
- job_name: test
static_configs:
- targets:
- localhost
labels:
# note,host,server,level自己定义的标签,根据自己需要改动
note: gl01
host: zsx1
server: 192.168.151.195
level: info
# 从此文件采集的日志会被打上上面的4个标签,支持正则
__path__: /opt/logs/info.log
- targets:
- localhost
labels:
note: gl02
host: zsx2
server: 192.168.151.196
level: error
__path__: /opt/logs/error.log
# 日志文件
$ cat /opt/logs/info.log
[INFO] Hello
[INFO] World
$ cat /opt/logs/error.log
[ERROR] Bad
[ERROR] Now
5.5 启动
# 启动loki
$ nohup ./loki-linux-amd64 --config.file=loki_config.yaml > loki.out 2>&1 &
# 启动promtail
$ nohup ./promtail-linux-amd64 --config.file=promtail_config.yaml > promtail.out 2>&1 &
# 查看进程
$ ps -ef | grep loki
$ ps -ef | grep promtail
6、使用Grafana查询日志
Grafana的安装请参考:
https://blog.csdn.net/qq_30614345/article/details/131261635
6.1 配置Grafana Loki数据源
访问Grafana:
配置数据源:
填写相关信息:
点击测试连接:
回到主页:
6.2 进行查询
点击Explore:
选择loki数据源:
输入查询条件:
{host="zsx1",note="gl01",server="192.168.151.195"}
# 对Hello进行筛选
{host="zsx1",note="gl01",server="192.168.151.195"} |= "Hello"
6.3 标签筛选
红色框中生成的为查询 LogQL,后面我们将对 LogQL 进行介绍。
也可以对时间进行筛选:
至此,Loki + promtail + Grafana 部署完毕。