一、 LokiClickHouse 的详细介绍:

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 创建目录启动服务

  1. 创建持久化目录

    sudo mkdir -p /data/loki/{chunks,rules,tsdb-index,tsdb-cache}
    sudo chmod -R 755 /data/loki
    
  2. 设置用户组权限管理

    chown 10001:10001 /data/loki #其中10001是容器内 Loki 的用户 ID
    
  3. 创建并启动容器

    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 添加数据源

  1. 访问 http://<server-ip>:3000,登录 Grafana。
  2. 添加 Loki 数据源:URL 为 http://localhost:3100
  3. 添加 ClickHouse 数据源:使用 ClickHouse 插件

    使用 grafana-cli 工具从命令行为 ClickHouse 安装 Altinity 插件:

    grafana-cli plugins install vertamedia-clickhouse-datasource
    

    该插件将安装到您的 grafana 插件目录中;默认为 /var/lib/grafana/plugins。或者,您可以手动下载.zip 文件并将其解压到您的 grafana 插件目录中。

5.3 创建 Dashboard

  • Loki 日志实时查询:使用 LogQL 查询日志。
  • ClickHouse 分析:编写 SQL 统计日志级别、错误频率等。


6. 验证与优化

①、检查日志收集

  1. 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'
    

关键修改说明:

  1. 端点调整:从/query改为/query_range

  2. 时间范围

    • startend参数使用 Unix 时间戳(当前时间示例)
    • step参数控制时间间隔(可选,建议至少 1 秒)
  3. 查询方向direction=BACKWARD从当前时间向过去查询

其他注意事项:

  1. 若需查询历史数据,替换时间戳为具体数值:

       # 示例:查询过去1小时的数据
       --data-urlencode 'start=$(date --date="1 hour ago" +%s)' \
       --data-urlencode 'end=$(date +%s)'
    
  2. 验证时间戳格式:

       # 检查当前时间戳
       date +%s
    
  3. 完整查询示例:

       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 高效分析的完整日志系统。

Copyright © https://yan-jian.com 2023 all right reserved更新时间: 2025-03-20 18:38:54

results matching ""

    No results matching ""