Distributor 收到 HTTP 请求,用于存储流数据
通过 hash 环对数据流进行 hash
Distributor将数据流发送到对应的Ingester及其副本上
Ingester 新建 Chunk 或将数据追加到已有Chunk 上
Distributor通过 HTTP连接发送响应信息
Loki 日志系统由以下3个部分组成:
loki是主服务器,负责存储日志和处理查询。
promtail是专为loki定制的代理,负责收集日志并将其发送给 loki 。
Grafana用于 UI展示。
四种安装方式
Promtail收集并将日志发送给Loki的 Distributor 组件
Distributor会对接收到的日志流进行正确性校验,并将验证后的日志分批并行发送到Ingester
Ingester 接受日志流并构建数据块,压缩后存放到所连接的存储后端
Querier 收到HTTP查询请求,并将请求发送至Ingester 用以获取内存数据 ,Ingester 收到请求后返回符合条件的数据 ;
如果 Ingester 没有返回数据,Querier 会从后端存储加载数据并遍历去重执行查询 ,通过HTTP返回查询结果。
Loki与ELK比较
ELK功能丰富,但是架构复杂,资源占用高,很多功能系统用不上,造成很多资源浪费。
ELK进行全文索引。安装部署复杂。
Loki不对日志全文索引。通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本。
Loki通过使用与 Prometheus 相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高。
Loki安装部署简单快速,且受 Grafana 原生支持。
假如系统依赖于ES,建议使用ELK作为日志系统。若系统不依赖ES,选择用Loki。
https://github.com/grafana/loki/blob/v1.5.0/docs/installation/README.md
我选择 Installing Loki with Docker or Docker Compose
docker-compose.yml
version: "3"
services:
loki:
image: grafana/loki:1.5.0
restart: always
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
volumes:
- loki-config:/etc/loki
networks:
- loki
promtail:
image: grafana/promtail:1.5.0
restart: always
volumes:
# promtail 采集日志的目录(宿主机的目录) /root/log 也可以直接采集容器目录
- /var/log:/var/log #挂载到宿主机的/var/log
- /mnt/config/docker-config.yaml:/etc/promtail/docker-config.yaml #配置文件拷贝到宿主机挂载到容器
- promtail-config:/etc/promtail
command: -config.file=/etc/promtail/docker-config.yaml
networks:
- loki
grafana:
image: grafana/grafana
restart: always
ports:
- "3000:3000"
depends_on:
- loki
- promtail
volumes:
- grafana-storage:/var/lib/grafana
networks:
- loki
networks:
loki:
volumes:
loki-config:
promtail-config:
grafana-storage:
启动
docker cp 0d0a90b5b7fa:/etc/promtail/docker-config.yaml /mnt/config/
docker-compose up -d
http://ip:3000/
登录密码admin/admin
- 部署
本篇通过目前最新版微服务架构进行部署,部署工具是helm
需要一套k8s集群,客户端,helm工具
helm repo资源
https://barrett0828.com/%E6%9E%84%E5%BB%BAloki%E6%97%A5%E5%BF%97%E7%B3%BB%E7%BB%9F/
helm repo add grafana https://grafana.github.io/helm-charts
grafana/grafana
grafana/loki-distributed
grafana/promtail
kubectl create ns loki
helm pull grafana/loki-distributed
helm pull grafana/promtail
helm pull kubectl create ns loki
helm upgrade --install loki --namespace=loki ./loki-distributed
helm install promtail -n loki grafana/promtail --set config.clients[0].url=http://loki-loki-distributed-gateway/loki/api/v1/push
helm install loki-grafana --namespace=loki grafana/grafana
https://artifacthub.io/packages/helm/grafana/promtail #日志收集配置文件参考地址
mkdir -p /promtail/ci/test
vi promtail/ci/test/values.yaml
config:
snippets:
extraScrapeConfigs: |
# Add an additional scrape config for syslog
- job_name: journal
journal:
path: /var/log/journal
max_age: 12h
labels:
job: systemd-journal
relabel_configs:
- source_labels:
- __journal__hostname
target_label: hostname
# example label values: kubelet.service, containerd.service
- source_labels:
- __journal__systemd_unit
target_label: unit
# example label values: debug, notice, info, warning, error
- source_labels:
- __journal_priority_keyword
target_label: level
# Mount journal directory and machine-id file into promtail pods
extraVolumes:
- name: journal
hostPath:
path: /var/log/journal
- name: machine-id
hostPath:
path: /etc/machine-id
extraVolumeMounts:
- name: journal
mountPath: /var/log/journal
readOnly: true
- name: machine-id
mountPath: /etc/machine-id
readOnly: true
更新升级
helm upgrade promtail ./promtail -f ./promtail/ci/test/values.yaml -i -n loki
查看admin密码
kubectl get secret --namespace loki loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
添加数据源
http://loki-loki-distributed-gateway
查询日志