Loki日志平台

Loki是一个Grafana的开源项目,用以低成本的构建日志系统。Loki只对日志的MetaData构建索引,日志的内容则会进行压缩存储。后端支持多种存储,官方比较推荐使用分布式对象存储MinIO。

部署方式

支持多种部署方式:包括k8s、docker部署,还有windows、linux、mac二进制部署。
还支持多种部署架构:单节点单磁盘、单节点多磁盘、多节点多磁盘。正式环境首选多节点多磁盘部署,具有高可用,企业级性能和可扩展性。由于高可用的需要,需要磁盘的数量需要为4的整数倍。
如下步骤都在centos7.9发行版进行

先决条件

官方硬件检查清单

  1. 网络和防火墙设置
  • 防火墙设置放行端口,或者关闭防火墙
  • 使用nginx做反向代理,使用“最少连接数”的负载策略
  1. 连续的主机名称和磁盘目录名称
  • 修改hosts,使用minio-1 , minio-2, minio-3 ,minio-4
  • 磁盘挂载目录使用 /data1,/data2, /data3, /data4
  1. 存储要求
  • 使用本地存储,最好是NVMe,SSD,我们的场景我估计机械硬盘也够了
  • 使用xfs格式化磁盘
  • 使用相同类型,想通大小的磁盘
  • 挂载目录使用有序的后缀
  • 修改/etc/fstab 确保在节点重新启动后驱动器到挂载点的映射一致
  1. 时间同步
  • 服务器间时间保持一致,不一致会导致节点间鉴权失败。
  1. 网络
  • 1GbE 网络链接最多支持125MB/s,或一个磁盘
  • 10GbE 网络可以支持约1.25GB/s, 潜在地支持10-12个磁盘
  • 25GbE 网络可以支持约3.125GB/s,潜在地支持约30个磁盘
  1. 内存

    下表列出了基于主机驱动器的数量和系统 空闲 RAM的最大并发请求数量:

    Number of Drives 32 GiB of RAM 64 GiB of RAM 128 GiB of RAM 256 GiB of RAM 512 GiB of RAM
    4 Drives 1,074 2,149 4,297 8,595 17,190
    8 Drives 840 1,680 3,361 6,722 13,443
    16 Drives 585 1,170 2,341 4,681 9,362

    下表提供了根据节点上本地存储的总量分配给MinIO使用的内存的一般指南:

    Total Host Storage Recommended Host Memory
    Up to 1 Tebibyte (Ti) 8GiB
    Up to 10 Tebibyte (Ti) 16GiB
    Up to 100 Tebibyte (Ti) 32GiB
    Up to 1 Pebibyte (Pi) 64GiB
    More than 1 Pebibyte (Pi) 128GiB

Linux多节点多磁盘部署

磁盘挂载

每台服务器必须挂载4块独立的磁盘,这样才能保证MinIO的高可用纠错码机制生效。而且为了便于后续配置,需要将磁盘的挂载目录名称后缀设定为连续的数字。例如:/data1 ,/data2 ,/data3,/data4。

1. lsblk查看磁盘挂载情况

磁盘挂载情况

可以看到sdb1、sdc1、sdd1、sde1磁盘,挂载到了相应的目录,这是已经挂载好的。没挂再好的不会看到sdb1这个分区,只会看到sdb磁盘。

对于未挂载好的磁盘,需要进行如下几步操作。

  1. 对sdb进行分区

    输入命令:fdisk /dev/sdb

    新建分区输入:n

    新建主分区输入:p

    接着输入分区号:1

    First sector和Last sector直接按回车,只建一个分区

    写入分区表输入:w

  2. 格式化分区 /dev/sdb1

    mkfs.xfs /dev/sdb1

  3. 挂载分区/dev/sdb1 到 /data1

    mount /dev/sdb1 /data1

    4块磁盘都要进行上述操作

  4. 在重新启动后保持驱动器挂载和映射不变

    vi /etc/fstab

    在文件末尾加上

    /dev/sdb1 /data1 xfs defaults 0 0

    /dev/sdc1 /data2 xfs defaults 0 0

    /dev/sdd1 /data3 xfs defaults 0 0

    /dev/sde1 /data4 xfs defaults 0 0

关闭防火墙

systemctl stop firewalld

systemctl disable firewalld

修改hosts

使用如下命令分别设置4台服务器的主机名称,也是和目录名称一样采用连续的后缀,方便后续服务配置。

vi /etc/hosts

10.18.10.1 minio-1

10.18.11.2 minio-2

10.18.12.1 minio-3

10.18.13.1 minio-4

MinIO安装

wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio

service注册文件minio.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[Unit]
Description=MinIO
Documentation=https://minio.org.cn/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
User=minio-user
Group=minio-user

EnvironmentFile=-/etc/default/minio/minio-env.conf
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

Restart=always

# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536

# Specifies the maximum number of threads this process can create
TasksMax=infinity

# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

# Built for ${project.name}-${project.version} (${project.name})

minio.service环境变量文件minio-env.conf

1
2
3
4
5
MINIO_VOLUMES="http://minio-{1...4}:9000/app/data{1...4}/minio" #配置各节点和存储目录URL
MINIO_OPTS="--console-address :9001" #配置管理界面地址
MINIO_ROOT_USER=admin #用户名密码
MINIO_ROOT_PASSWORD=admin123
MINIO_SERVER_URL="http://minio-1:60000" #nginx负载均衡地址,nginx安装在了minio-1上

初始化脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
systemctl disable firewalld
groupadd -r minio-user
useradd -d /home/minio-user -s /bin/bash -g minio-user minio-user
mkdir -p /app/data1/minio
mkdir -p /app/data2/minio
mkdir -p /app/data3/minio
mkdir -p /app/data4/minio
chown -R minio-user:minio-user /app/data1
chown -R minio-user:minio-user /app/data2
chown -R minio-user:minio-user /app/data3
chown -R minio-user:minio-user /app/data4
mkdir /etc/default/minio
chown -R minio-user:minio-user /etc/default/minio
cp minio-env.conf /etc/default/minio
chmod 777 /etc/default/minio/minio-env.conf
cp minio.service /usr/lib/systemd/system
chmod 777 /usr/lib/systemd/system/minio.service
cp minio /usr/local/bin/
chmod +x /usr/local/bin/minio

启动minio

systemctl enable minio

systemctl start minio

查看日志

systemctl status minio

journalctl -f -u minio

nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
upstream minio {
least_conn;
server minio-1:9000;
server minio-2:9000;
server minio-3:9000;
server minio-4:9000;
}

upstream minio_console {
least_conn;
server minio-1:9001;
server minio-2:9001;
server minio-3:9001;
server minio-4:9001;

}
server {
listen 60000;
server_name localhost;
location / {
proxy_pass http://minio;
proxy_set_header Host $http_host;
#client_max_body_size 1000m;
#添加了websocket支持,解决object browser loading 问题
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

location /minio/ui/ {
rewrite ^/minio/ui/(.*) /$1 break;
proxy_pass http://minio_console;
proxy_set_header Host $http_host;
#client_max_body_size 1000m;
#添加了websocket支持,解决object browser loading 问题
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}

访问MinIO

http://ip:60000

Loki

按照预估的数据量,考虑到可扩展性,我们选择Loki的Simple Scalable安装模式。此安装模式需要依赖容器平台,使用helm 3.15+版本。

chart配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
sidecar:
image:
repository: ip1:5000/kiwigrid/k8s-sidecar
tag: 1.24.3
global:
image:
registry: ip1:5000
loki:
schemaConfig:
configs:
- from: 2024-06-19
store: tsdb
object_store: s3
schema: v13
index:
prefix: loki_index_
period: 24h
ingester:
chunk_encoding: snappy
tracing:
enabled: true
querier:
max_concurrent: 4

storage:
type: s3
bucketNames:
chunks: "chunks"
ruler: "ruler"
admin: "admin"
s3:
endpoint: http://ip1:60000
region:
# AWS secret access key
secretAccessKey: admin
# AWS access key ID
accessKeyId: admin
# Allows insecure (HTTP) connections (true/false)
insecure: true
s3ForcePathStyle: true
http_config:
idle_conn_timeout: 90s
response_header_timeout: 0s
insecure_skip_verify: false
deploymentMode: SimpleScalable

backend:
replicas: 3
affinity: null
read:
replicas: 3
affinity: null
write:
replicas: 3
affinity: null
memcached:
image:
repository: ip1:5000/memcached
memcachedExporter:
image:
repository: ip1:5000/prom/memcached-exporter
chunksCache:
allocatedMemory: 512
resultsCache:
allocatedMemory: 512
# Disable minio storage
minio:
enabled: false

# Zero out replica counts of other deployment modes
singleBinary:
replicas: 0

ingester:
replicas: 0
querier:
replicas: 0
queryFrontend:
replicas: 0
queryScheduler:
replicas: 0
distributor:
replicas: 0
compactor:
replicas: 0
indexGateway:
replicas: 0
bloomCompactor:
replicas: 0
bloomGateway:
replicas: 0

安装命令

1
2
3
kubectl create -n loki

helm install -f values.yaml loki loki-6.6.3.tgz -n loki