Loki是一个Grafana的开源项目,用以低成本的构建日志系统。Loki只对日志的MetaData构建索引,日志的内容则会进行压缩存储。后端支持多种存储,官方比较推荐使用分布式对象存储MinIO。
部署方式 支持多种部署方式:包括k8s、docker部署,还有windows、linux、mac二进制部署。 还支持多种部署架构:单节点单磁盘、单节点多磁盘、多节点多磁盘。正式环境首选多节点多磁盘部署,具有高可用,企业级性能和可扩展性。由于高可用的需要,需要磁盘的数量需要为4的整数倍。 如下步骤都在centos7.9发行版进行
先决条件 官方硬件检查清单
网络和防火墙设置
防火墙设置放行端口,或者关闭防火墙
使用nginx做反向代理,使用“最少连接数”的负载策略
连续的主机名称和磁盘目录名称
修改hosts,使用minio-1 , minio-2, minio-3 ,minio-4
磁盘挂载目录使用 /data1,/data2, /data3, /data4
存储要求
使用本地存储,最好是NVMe,SSD,我们的场景我估计机械硬盘也够了
使用xfs格式化磁盘
使用相同类型,想通大小的磁盘
挂载目录使用有序的后缀
修改/etc/fstab 确保在节点重新启动后驱动器到挂载点的映射一致
时间同步
服务器间时间保持一致,不一致会导致节点间鉴权失败。
网络
1GbE 网络链接最多支持125MB/s,或一个磁盘
10GbE 网络可以支持约1.25GB/s, 潜在地支持10-12个磁盘
25GbE 网络可以支持约3.125GB/s,潜在地支持约30个磁盘
内存
下表列出了基于主机驱动器的数量和系统 空闲 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磁盘。
对于未挂载好的磁盘,需要进行如下几步操作。
对sdb进行分区
输入命令:fdisk /dev/sdb
新建分区输入:n
新建主分区输入:p
接着输入分区号:1
First sector和Last sector直接按回车,只建一个分区
写入分区表输入:w
格式化分区 /dev/sdb1
mkfs.xfs /dev/sdb1
挂载分区/dev/sdb1 到 /data1
mount /dev/sdb1 /data1
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