loki是Grafana Labs团队开发的一个开源项目,是一个高水平可扩展,高可用性,多租户的日志聚合系统。Grafana Loki作为整体的日志聚合系统,使用了和当前主流的倒排索引日志系统不同的设计,其为每个日志流编制一组标签,使用标签来作为日志的索引,达成了较低的成本和快速查询的使用体验。
倒排索引源于实际应用中根据属性的值来查找记录,也就是说不适用记录来确定属性值而实由属性值来确定记录,因而被称为倒排索引,带有倒排索引的文件被称为倒排文件。倒排索引一般表示为一个三元组:关键词、词频、id或位置(出现在哪篇文章或网页中,及有关的日期,作者等信息),它相当于为所有文档或者互联网网页做了一个索引(打标签),我们只需要根据标签就能快速匹配到对应文章或网页。
一个未经处理的数据库中,一般是以文档ID作为索引,以文档内容作为记录。而倒排索引是将单词作为索引,将文档ID作为记录,这样便可以通过单词或记录查找到所在文档。
简单来说就是正排索引是遍历所有文件名来找文件,倒排索引则是记录文档中的关键字及其所在文档,根据关键字来找到文档。
①不对日志进行全文索引。Loki中存储的是压缩后的非结构化日志,并且支队元数据建立索引,因此Loki操作简单,成本较低。
②使用与Prometheus相同的标签。Loki通过标签对日志进行索引和分组,使得日志的扩展和操作效率更高。
③适合储存Kubernetes Pod日志。比如Pod节点信息、容器信息、命名空间、标签之类的元数据会自动删除和编入索引。
④Grafana原生支持。
①Loki主服务器,负责存储日志和处理查询。
②Promtail是专为loki定制的代理,负责收集日志并将其发送给loki。
③Grafana用于UI展示。
Promtail时Loki的官方日志采集器原生支持journal、syslog、file、docker类型的日志集,作用类似于Logstash。Promtail作为一个日志采集器,首先要知道的是日志在什么位置才能做到收集与打标签推送等功能。
对于普通的静态日志文件,可以直接在Promtail配置文件中写入路径信息。但是如果想要采集k8s内的日志文件则需要弄清日志的存放位置。
wget https://github.com/grafana/loki/releases/download/v2.2.1/loki-linux-amd64.zip
wget https://github.com/grafana/loki/releases/download/v2.2.1/promtail-linux-amd64.zip
promtail
vim /opt/app/promtail.yaml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /var/log/positions.yaml
client:
url: http://localhost:3100/loki/api/v1/push
scrape_configs:
vim /etc/systemd/system/promtail.service
[Unit]
Description=promtail server
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/opt/app/promtail/promtail -config.file=/opt/app/promtail/promtail.yaml
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=promtail
[Install]
WantedBy=default.target
loki
vim /opt/app/loki/loki.yaml
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
ingester:
wal:
enabled: true
dir: /opt/app/loki/wal
lifecycler:
address: 127.0.0.1
ring:
kvstore:
store: inmemory
replication_factor: 1
final_sleep: 0s
chunk_idle_period: 1h
max_chunk_age: 1h
chunk_target_size: 1048576
chunk_retain_period: 30s
max_transfer_retries: 0
schema_config:
configs:
- from: 2022-10-12
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /opt/app/loki/boltdb-shipper-active
cache_location: /opt/app/loki/boltdb-shipper-cache
cache_ttl: 24h
shared_store: filesystem
filesystem:
directory: /opt/app/loki/chunks
compactor:
working_directory: /opt/app/loki/boltdb-shipper-compactor
shared_store: filesystem
limits_config:
reject_old_samples: true
reject_old_samples_max_age: 168h
chunk_store_config:
max_look_back_period: 0s
table_manager:
retention_deletes_enabled: false
retention_period: 0s
ruler:
storage:
type: local
local:
directory: /opt/app/loki/rules
rule_path: /opt/app/loki/rules-temp
alertmanager_url: http://localhost:9093
ring:
kvstore:
store: inmemory
enable_api: true
加入到systemctl管理
vim /etc/systemd/system/loki.service
[Unit]
Description=loki server
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/opt/app/loki/loki -config.file=/opt/app/loki/loki.yaml
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=loki
[Install]
WantedBy=default.target