前言
通过 helm 部署的 Loki 默认都是采用一个副本,如果想部署集群方案直接将 Loki 副本数改成 3 或者其它数是不行的,网上集群相关的文档也比较少,不过在 Loki 官方仓库 production 目录下有相关的配置样例,具体参考 production。
Loki组件
- Distributor(分配器)
Distributor主要负责分发从客户端上报的日志, 在进行完日志的校验之后便会分发给ingester处理. Distributor使用了一致性哈希以及一个可以配置的副本数来决定不同的日志流的后端ingester. 哈希环信息的存储使用了Consul. Ingester会根据自身的状态注册在哈希环上来标识自身可提供服务的状态. Distributor会使用注册租户id和标签集时作为哈希的输入, 计算出对应的哈希环位置, 并找到对应的ingester. - Ingester(采集器)
Ingester是loki中比较核心的服务, 该服务将从Distributor发送来的日志进行转储到后端存储, 并给Querier提供仍在内存中未写盘的数据查询功能.
Ingester注册在哈希环上的状态有PENDING, JOINING, ACTIVE, LEAVING, UNHEALTHY, 除了ACTIVE状态外, 其余状态都只会提供部分服务。
在存储到真正的存储前, 日志流只有按顺序收到才会被处理, Ingester会按照标签的组合set构建若干压缩过的chunks, 间隔一段时间将chunks作为整体刷写到后端存储. 刷进后端存储的chunks被标记为只读. - Querier frontend
该服务是一个可选组件,在一组查询器前面,来负责在它们之间公平地调度请求,尽可能地并行化它们并缓存请求。 - Querier(查询器)
Querier则是用来提供查询服务, 他使用了LogQL, 一种类似于PromQL的语言作为用户界面. Querier会查询已经写入后端存储的chunks以及仍在ingester内存中的数据, 根据label查找数据后, 再遍历数据查找到满足条件的日志 - Chunk(块)存储
Chunk Store是Loki的后端存储框架, 可以支持多种存储方式, 存储分为两部分:索引的存储(Index)和日志数据存储.
Loki集群方案
- loki 核心服务 distributor、ingester、querier 没有分离,而是启动在一个实例当中;
- 是直接用 memberlist 在内存中维护集群状态;
- 使用 boltdb-shipper 替代其他日志索引方案
Loki集群配置
config:
ingester:
lifecycler:
ring:
kvstore:
# store 支持 consul, etcd, inmemory, memberlist
store: memberlist
# 设置副本数
replication_factor: 1
memberlist:
# 加入集群的节点地址列表
join_members: ["loki-1.loki-headless.loki", "loki-2.loki-headless.loki", "loki-0.loki-headless.loki"]
- 更多配置参考官方 configuration.
Loki helm安装
Promtail 配置注意事项
- vim charts/promtail/values.yaml
# Extra volumes to scrape logs from
volumes:
name: docker
hostPath:
# 修改为docker的实际路径
path: /home/docker/containers
# ...
volumeMounts:
name: docker
# 修改为docker的实际路径
mountPath: /home/docker/containers
readOnly: true
参考文档
- 参考文档:1