Loki 日志系统分布式部署实践三 redis

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Loki 日志系统分布式部署实践三 redis相关的知识,希望对你有一定的参考价值。

参考技术A 这里支持 redis 主从、哨兵、集群三种模式,我这里选择主从即可,集群模式测试异常,没能解决

安装 redis 主从模式:

编写配置文件:

安装:

查看密码:

连接 master:

连接 slave:

读写分离:
读写:

只读:

错误 1:

解决:
参考: https://github.com/helm/charts/issues/10666
参考: https://docs.bitnami.com/kubernetes/infrastructure/redis/administration/kernel-settings/
参考: https://github.com/helm/charts/tree/master/stable/redis/#user-content-host-kernel-settings

注意:Kubernetes 1.12+ 可以使用 securityContext.sysctls 来设置 pod 的 sysctl,而不需要 initContainer 了:

错误 2:

解决:
使用 initContainer 去修改 sysctl 的方案在生产环境正常,这里却报错了,应该是 securityContext 或 PSP 的问题,这里没有启用 PSP,那就剩下 securityContext 了:
我这里尝试写入如下权限,最终都被修改掉了:

这里暂时没有找到解决方案,但是发现虽然报错了,下面 sysctl 修改是生效了的,因为日志不再报错了

错误 3:

解决:
因为 bitnami/minideb:buster 镜像里没有 sysctl

方法一:替换镜像

方法二:直接安装包,但是这个比较慢

错误 4:

解决:
参考: https://github.com/docker-library/redis/issues/55
参考: https://github.com/prometheus/node_exporter/issues/703
注意:它将修改调度了容器的节点的内核设置,从而影响该节点上运行的其他容器。这就是为什么您需要运行特权的 initContainer 或设置 securityContext.sysctls 的原因。

错误 5:

解决:
因为将宿主机的 /sys 挂载到容器内的路径变成了 /host-sys

所以要修改路径:

错误 6:

解决:
这里暂时看不受影响

错误 7:

解决:
因为 master 挂掉了

错误 8:

解决:
Redis 提供两种相对有效的备份方法:

利用 RDB 快照的持久化方式不是非常可靠,当运行 Redis 的计算机停止工作、意外掉电、意外杀掉了 Redis 进程那么最近写入 Redis 的数据将会丢。对于某些应用这或许不成问题,但对于持久化要求非常高的应用场景快照方式不是理想的选择。
利用 AOF 文件是一个替代方案,用以最大限度的持久化数据。同样,可以通过配置文件来开闭 AOF。

打开 AOF 持久化功能后,Redis 处理完每个事件后会调用 write(2) 将变化写入 kernel 的 buffer,如果此时 write(2) 被阻塞,Redis 就不能处理下一个事件。
Linux 规定执行 write(2) 时,如果对同一个文件正在执行 fdatasync(2) 将 kernel buffer 写入物理磁盘,或者有 system wide sync 在执行,write(2) 会被 Block 住,整个 Redis 被 Block 住。
如果系统 IO 繁忙,比如有别的应用在写盘,或者 Redis 自己在 AOF rewrite 或 RDB snapshot(虽然此时写入的是另一个临时文件,虽然各自都在连续写,但两个文件间的切换使得磁盘磁头的寻道时间加长),就可能导致 fdatasync(2) 迟迟未能完成从而 Block 住 write(2),Block 住整个 Redis。
为了更清晰的看到 fdatasync(2) 的执行时长,可以使用下面命令跟踪,但会影响系统性能:

Redis 提供了一个自救的方式,当发现文件有在执行 fdatasync(2) 时,就先不调用 write(2),只存在 cache 里,免得被 Block。但如果已经超过两秒都还是这个样子,则会硬着头皮执行 write(2),即使 redis 会被 Block 住。
此时那句要命的 log 会打印:Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
之后用 redis-cli INFO 可以看到 aof_delayed_fsync 的值被加 1。

因此,对于 fsync 设为 everysec 时丢失数据的可能性的最严谨说法是:
如果有 fdatasync 在长时间的执行,此时 redis 意外关闭会造成文件里不多于两秒的数据丢失。
如果 fdatasync 运行正常,redis 意外关闭没有影响,只有当操作系统 crash 时才会造成少于 1 秒的数据丢失。

方法一:关闭 AOF
如果采用 redis 主从 + sentinel 方式的话,主节点挂了从节点会自己提升为主点,主节点恢复后全量同步一次数据就可以了,关系也不是太大

方法二:修改系统配置
原来是 AOF rewrite 时一直埋头的调用 write(2),由系统自己去触发 sync。默认配置 vm.dirty_background_ratio=10,也就是占用了 10% 的可用内存才会开始后台 flush
而我的服务器有 8G 内存,很明显一次 flush 太多数据会造成阻塞,所以最后果断设置了sysctl vm.dirty_bytes=33554432(32M) 问题解决

错误 9:

解决:
看着是启动的时候加载 AOF 文件到内存,然后被 liveness 杀掉了

随着命令不断写入 AOF,文件会越来越大,为了解决这个问题,redis 引入了 AOF 重写机制压缩文件。文件能缩小的原因是:

AOF 重写可以手动触发和自动触发:

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 16mb

所以这里处理下,控制 AOF 文件大小:

注意:这里依旧没能解决问题,文件依旧很大,而且会造成大量的磁盘 IO,最终导致 redis 失去响应

彻底解决:

之后 dump.rdb 文件一直稳定在 255M

loki日志收集系统部署

loki简介

介绍:Loki 由以下3个部分组成:

  • loki是主服务器,负责存储日志和处理查询。
  • promtail是代理,负责收集日志并将其发送给 loki 。
  • Grafana用于 UI 展示。

一、promtail 部署

下载地址:https://github.com/grafana/loki/releases/download/v2.4.1/promtail-linux-amd64.zip

1、解压,下载官方配置模板并修改

mkdir /data/promtail
unzip promtail-linux-amd64.zip
wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml
vim promtail-local-config.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://192.156.71.125:3100/loki/api/v1/push	## 此处lokiserver修改为服务器端地址

scrape_configs:
- job_name: application			# job名称,自定义
  static_configs:
  - targets:					# 如测试环境多个应用多个路径,从此行开始复制修改对应的标签
      - localhost
    labels:
      job: tomcat				# 监控类型
      project: tjhlwjg			# 项目名称自定义
      host: 192.156.71.125		# 建议修改为本机ip,方便过滤      
      __path__: /data/tomcat_tjjg/logs/catalina.out		# tomcat日志路径

2、启动promtail

cd /data/promtail
nohup ./promtail-linux-amd64 --config.file=promtail.yaml &

二、loki 部署

下载地址:https://github.com/grafana/loki/releases/download/v2.4.1/loki-linux-amd64.zip

1、解压,下载官方配置模板并修改

mkdir /data/loki
unzip loki-linux-amd64
wget https://raw.githubusercontent.com/grafana/loki/master/cmd/loki/loki-local-config.yaml
vim loki-local-config.yaml		# 这里不需要alertmanager,注释掉
auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  replication_factor: 1
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

# ruler:
#   alertmanager_url: http://localhost:9093

# 下面的配置为新增的,不配置日志太大会报错
limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h
  ingestion_rate_mb: 30  #修改每用户摄入速率限制,即每秒样本量,默认值为4M
  ingestion_burst_size_mb: 15  #修改每用户摄入速率限制,即每秒样本量,默认值为6M

2、启动loki

cd /data/loki
nohup ./loki-linux-amd64 --config.file=loki.yaml &

三、配置grafana

1、添加loki数据源

2、输入loki服务器的ip和端口(3100)、其他默认,然后Save&Test

3、在Explore中选择loki,可以根据自定义的标签进行过滤

4、loki的日志页面如下

以上是关于Loki 日志系统分布式部署实践三 redis的主要内容,如果未能解决你的问题,请参考以下文章

Loki日志系统分布式部署实践之 Cassandra

分布式日志系统Graylog、Loki及ELK的分析和对比

loki日志收集系统部署

loki日志收集系统部署

loki日志收集系统部署

微服务-分布式日志系统Logstash部署