一、 Loki 和 ClickHouse 的详细介绍:
1. Loki
- 定位:轻量级开源日志聚合系统,由 Grafana Labs 开发,专为云原生环境设计。
核心特点:
- 高效存储:通过压缩和索引优化,存储空间需求远低于传统日志系统(如 ELK)。
- Prometheus 生态集成:支持与 Prometheus、Grafana 无缝协作,便于监控与日志联合分析。
- LogQL 查询语言:提供强大的日志过滤和聚合功能,支持实时查询和报警。
- 多租户支持:适合大型企业或云服务场景,可隔离不同租户的日志数据。
- 分布式架构:通过微服务拆分实现水平扩展,高可用性。
适用场景:
- 容器化环境(Kubernetes)日志集中管理。
- 大规模日志实时监控与分析。
- 需要低成本、高扩展性的日志解决方案。
2. ClickHouse
- 定位:开源分析型数据库(OLAP),由俄罗斯 Yandex 公司开发,专注于实时数据分析。
核心特点:
- 列式存储:针对分析查询优化,支持快速聚合和过滤。
- SQL 兼容性:支持类 SQL 查询,学习门槛低。
- 超高性能:单节点每秒可处理数十亿行数据,支持分布式计算。
- 高压缩率:数据压缩比可达 10:1 以上,节省存储成本。
- 丰富数据类型:支持数组、JSON、IPv4/IPv6 等复杂类型。
- 云原生支持:可部署在 Kubernetes 或主流云平台(AWS、Azure 等)。
适用场景:
- 实时报表与仪表盘(如 BI 工具集成)。
- 用户行为分析、广告效果监测。
- 物联网(IoT)数据处理与监控。
- 需要处理 PB 级数据的高性能分析场景。
对比与选择建议
维度 | Loki | ClickHouse |
---|---|---|
核心功能 | 日志聚合与查询 | 实时数据分析 |
存储模型 | 日志文件(结构化 / 半结构化) | 列式存储(结构化数据) |
查询语言 | LogQL | SQL |
典型场景 | 日志监控、故障排查 | 实时报表、用户行为分析 |
扩展性 | 分布式架构,水平扩展 | 分布式集群,线性扩展 |
社区生态 | Grafana 生态,插件丰富 | 支持 ODBC、JDBC、Python 等 |
选择建议:
- 若需轻量级日志管理,优先选 Loki。
- 若需复杂实时分析(如多维统计、关联查询),优先选 ClickHouse。
- 两者可结合使用:例如用 Loki 处理实时日志,再将关键数据同步到 ClickHouse 进行深度分析。
二、在 Ubuntu Server 上部署 Loki 和 ClickHouse 构建日志分析系统
可以按照以下步骤进行。以下流程将 Loki 作为日志收集与查询工具,ClickHouse 作为长期存储和高性能分析引擎:
1. 环境准备
确保 Ubuntu Server 已更新:
sudo apt update && sudo apt upgrade -y
2. 安装并配置 ClickHouse
2.1 添加 ClickHouse 官方仓库
sudo apt-get install apt-transport-https ca-certificates dirmngr
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4
echo "deb https://repo.clickhouse.com/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list
sudo apt-get update
2.2 安装 ClickHouse Server 和 Client
sudo apt-get install clickhouse-server clickhouse-client
2.3 配置 ClickHouse
编辑配置文件 /etc/clickhouse-server/config.xml
:
允许远程访问(可选):
<listen_host>0.0.0.0</listen_host>
运行 HTML
- 设置数据存储路径(按需调整)。
启动服务:
sudo systemctl enable clickhouse-server
sudo systemctl start clickhouse-server
2.4 创建日志存储表
登录 ClickHouse 客户端:
clickhouse-client --user default --password xxxxxx
# 密码是安装clickhouse-server时自行设置
执行以下 SQL 创建表:
CREATE DATABASE logs;
CREATE TABLE logs.loki_logs (
timestamp DateTime,
log_labels String,
log_message String,
severity String
) ENGINE = MergeTree()
ORDER BY (timestamp, severity);
3. 部署 Loki
3.1 安装 Loki 和 Promtail
推荐使用 Docker 部署(需提前安装 Docker 和 Docker Compose)。
创建 docker-compose.yml
:
version: '3'
services:
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
command:
- "-config.file=/etc/loki/local-config.yaml"
- "-config.expand-env=true" # 启用环境变量解析(按需添加)
volumes:
- ./loki-config.yaml:/etc/loki/local-config.yaml
- /data/loki:/data/loki # 挂载持久化目录
promtail:
image: grafana/promtail:latest
volumes:
- /var/log:/var/log
- ./promtail-config.yaml:/etc/promtail/config.yaml
command: -config.file=/etc/promtail/config.yaml
3.2 配置 Loki
创建 loki-config.yaml
:
# loki-config.yaml
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /data/loki
storage:
filesystem:
chunks_directory: /data/loki/chunks # 日志块存储路径
rules_directory: /data/loki/rules # 规则存储路径
replication_factor: 1
ring:
instance_addr: 127.0.0.1
kvstore:
store: inmemory
schema_config:
configs:
- from: 2023-10-24 # 新 schema 起始时间
store: tsdb # 使用 TSDB 索引
object_store: filesystem # 指定存储类型为本地文件系统
schema: v13 # 使用 schema v13
index:
prefix: tsdb_index_
period: 24h
storage_config:
tsdb_shipper:
active_index_directory: /data/loki/tsdb-index # TSDB 索引活动目录
cache_location: /data/loki/tsdb-cache # TSDB 缓存目录
3.3 配置 Promtail
创建 promtail-config.yaml
:
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*.log
# 添加自定义标签
service: "syslog"
log_type: "auth"
3.4 创建目录启动服务
创建持久化目录:
sudo mkdir -p /data/loki/{chunks,rules,tsdb-index,tsdb-cache} sudo chmod -R 755 /data/loki
设置用户组权限管理
chown 10001:10001 /data/loki #其中10001是容器内 Loki 的用户 ID
创建并启动容器
docker-compose up -d
4. 集成 Loki 与 ClickHouse
4.1 使用 ClickHouse Sink 导出日志
首先安装logcli
# 下载二进制文件
wget https://github.com/grafana/loki/releases/download/v2.9.1/logcli-linux-amd64.zip
# 安装unzip
apt install -y unzip
# 解压文件
unzip logcli-linux-amd64.zip
# 赋予执行权限
chmod +x logcli-linux-amd64
# 移动到系统路径
sudo mv logcli-linux-amd64 /usr/local/bin/logcli
# 验证安装
logcli --help
通过工具或脚本将 Loki 的日志定期导入 ClickHouse。例如,使用 logcli
查询 Loki 日志并写入 ClickHouse:
logcli query '{job="varlogs"}' --limit=1000 --output=jsonl | \
jq -c '
. as $log |
{
timestamp: (
$log.timestamp
| sub("\\.[0-9]+"; "")
| sub("\\+[0-9:]+$"; "Z")
| strptime("%Y-%m-%dT%H:%M:%SZ")
| mktime
),
log_labels: ($log.labels | tojson),
log_message: (
$log.line
| sub("^[0-9T:-]+\\s\\w+\\s"; "") # 匹配带T和不带T的日期格式
),
severity: (
$log.line
| if test("\\berror\\b|\\bERROR\\b") then "error"
elif test("\\bwarn\\b|\\bWARN\\b") then "warning"
elif test("\\bsudo\\b|\\bCRON\\b") then "info"
else "info"
end
)
}
' | \
clickhouse-client \
--user default \
--password xxxxxx \
--query="INSERT INTO logs.loki_logs FORMAT JSONEachRow"
4.2 自动化脚本
编写定时任务(如 Cron Job)定期同步数据:
#!/bin/bash
logcli query '{job="varlogs"}' --since=1h --output=jsonl | \
jq -c '
. as $log |
{
timestamp: (
$log.timestamp
| sub("\\.[0-9]+"; "")
| sub("\\+[0-9:]+$"; "Z")
| strptime("%Y-%m-%dT%H:%M:%SZ")
| mktime
),
log_labels: ($log.labels | tojson),
log_message: (
$log.line
| sub("^[0-9T:-]+\\s\\w+\\s"; "") # 匹配带T和不带T的日期格式
),
severity: (
$log.line
| if test("\\berror\\b|\\bERROR\\b") then "error"
elif test("\\bwarn\\b|\\bWARN\\b") then "warning"
elif test("\\bsudo\\b|\\bCRON\\b") then "info"
else "info"
end
)
}
' | \
clickhouse-client \
--user default \
--password xxxxxx \
--query="INSERT INTO logs.loki_logs FORMAT JSONEachRow"
5. 使用 Grafana 可视化
5.1 安装 Grafana
1、添加 Grafana 软件源
打开终端并执行下面的命令来添加 Grafana 的 GPG 密钥:
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
之后,添加稳定版的 Grafana 软件源:
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
2、更新软件包列表
执行以下命令来更新本地的软件包列表:
sudo apt-get update
3、安装 Grafana
运行下面的命令来安装 Grafana:
sudo apt-get install grafana
4、启动并设置 Grafana 服务
启动 Grafana 服务:
sudo systemctl start grafana-server
设置 Grafana 服务在系统启动时自动启动:
sudo systemctl enable grafana-server
5、验证安装
你可以通过检查 Grafana 服务的状态来验证安装是否成功:
sudo systemctl status grafana-server
如果服务正常运行,你应该会看到服务处于 “active (running)” 状态。
5.2 添加数据源
- 访问
http://<server-ip>:3000
,登录 Grafana。 - 添加 Loki 数据源:URL 为
http://localhost:3100
。 添加 ClickHouse 数据源:使用 ClickHouse 插件。
使用 grafana-cli 工具从命令行为 ClickHouse 安装 Altinity 插件:
grafana-cli plugins install vertamedia-clickhouse-datasource
该插件将安装到您的 grafana 插件目录中;默认为 /var/lib/grafana/plugins。或者,您可以手动下载.zip 文件并将其解压到您的 grafana 插件目录中。
5.3 创建 Dashboard
6. 验证与优化
①、检查日志收集:
Loki API 要求使用范围查询而非即时查询。
sudo curl -G "http://localhost:3100/loki/api/v1/query_range" \ --data-urlencode 'query={job="varlogs"}' \ --data-urlencode 'start=$(date +%s)' \ --data-urlencode 'end=$(date +%s)' \ --data-urlencode 'step=60s' \ --data-urlencode 'direction=BACKWARD'
关键修改说明:
端点调整:从
/query
改为/query_range
时间范围:
start
和end
参数使用 Unix 时间戳(当前时间示例)step
参数控制时间间隔(可选,建议至少 1 秒)
- 查询方向:
direction=BACKWARD
从当前时间向过去查询
其他注意事项:
若需查询历史数据,替换时间戳为具体数值:
# 示例:查询过去1小时的数据 --data-urlencode 'start=$(date --date="1 hour ago" +%s)' \ --data-urlencode 'end=$(date +%s)'
验证时间戳格式:
# 检查当前时间戳 date +%s
完整查询示例:
sudo curl -G "http://localhost:3100/loki/api/v1/query_range" \ --data-urlencode 'query={job="varlogs"} | json' \ --data-urlencode 'start=1742448000' \ --data-urlencode 'end=1742451600' \ --data-urlencode 'step=60s' \ --data-urlencode 'direction=BACKWARD'
如果需要进一步处理返回结果,建议添加--compressed
选项提高传输效率,并配合jq
进行数据解析。
curl -G "http://localhost:3100/loki/api/v1/query" --data-urlencode 'query={job="varlogs"}'
②、查询 ClickHouse 数据:
sudo clickhouse-client --user default --password xxxxxx --query "SELECT timestamp, severity, log_message FROM logs.loki_logs LIMIT 5"
③、优化性能:
* 调整 ClickHouse 表的分区策略(如按天分区)。
* 增加 Loki 的索引缓存大小。
常见问题
- 权限问题:确保 Promtail 有权限读取
/var/log
。 - 网络配置:检查防火墙是否放行
3100
(Loki)、9000
(ClickHouse)等端口。 - 数据延迟:调整同步脚本的执行频率。
通过以上步骤,您将拥有一个结合 Loki 实时日志收集和 ClickHouse 高效分析的完整日志系统。