基于loki的日志聚合系统部署文档

一,背景&目的

目前HRO系统日志分散于各个服务中,查看不方便,且需要服务器权限。因此需要搭建一个统一的日志聚合系统

目前热门方案有基于elasticsearch的ELK方案。

  1. Elastic Stack(ELK)

    ELK,即 Elasticsearch、Logstash 和 Kibana 简称,是最流行的开源日志聚合工具。它被 Netflix、Facebook、微软、LinkedIn 和思科使用。这三个组件都是由 Elastic 开发和维护的。 Elasticsearch 本质上是一个 NoSQL 数据库,以 Lucene 搜索引擎实现的。 Logstash 是一个日志管道系统,可以接收数据,转换数据,并将其加载到像 Elasticsearch 这样的应用中。 Kibana 是 Elasticsearch 之上的可视化层。

ELK 存在的问题

现有的很多日志采集的方案都是采用全文检索对日志进行索引(如 ELK 方案),优点是功能丰富,允许复杂的操作。但是,这些方案往往规模复杂,资源占用高,操作苦难。

很多功能往往用不上,大多数查询只关注一定时间范围和一些简单的参数(如 host、service 等),使用这些解决方案就有点杀鸡用牛刀的感觉了。

 

 

2.Loki

Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。项目受 Prometheus 启发,官方的介绍就是:Like Prometheus, but for logs.,类似于 Prometheus 的日志系统。

与其他日志聚合系统相比,Loki具有下面的一些特性

  • 不对日志进行全文索引。Loki中存储的是压缩后的非结构化日志,并且只对元数据建立索引,因此Loki 具有操作简单、低成本的优势。
  • 使用与 Prometheus 相同的标签。Loki通过标签对日志进行索引和分组,这使得日志的扩展和操作效率更高。
  • 特别适合储存 Kubernetes Pod 日志。诸如 Pod 标签之类的元数据会被自动删除和编入索引。
  • Grafana 原生支持。
  •  

Loki 日志系统由以下3个部分组成:

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

 

二、系统结构功能描述

架构图

yarnClient 获取聚合日志 日志聚合系统_Elastic

 

三、安装部署

1、安装docker

1.1、查看linux发行版,内核

1. [root@docker~]# cat /etc/redhat-release  #查看版本号
2.  
3. CentOS Linux release 7.1.1503 (Core)
4.  
5. [root@docker ~]# uname -r  #查看Linux内核
6.  
7. c3.10.0-229.el7.x86_64

1.2、替换阿里云yum源

    1. 1 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #下载阿里yum源2 
    2.  
    3. 2 yum makecache  #生成仓库缓存

    3、安装docker

    1. yum install docker -y

    4、启动docker

    1. systemctl start docker  #启动docker
    2. systemctl enable docker #开机启动docker
    3. systemctl status docker #查看docker状态

    2、安装docker-compose

      pip在centos也没有,如下处理

      1.查看是否安装依赖包,没安装先安装:

    sudo yum install epel-release

      2.更新文件库

    sudo yum -y update

      3.安装pip

    sudo yum -y install python-pip
    sudo pip install -U docker-compose

    查看docker compose的版本

    docker-compose version

    3,安装loki和grafana

    创建/usr/local/docker/loki目录

    创建docker-compose.yml 文件

    version: "3"
    
    networks:
      loki:
    
    services:
      loki:
        image: grafana/loki:latest
        ports:
          - "3100:3100"
        command: -config.file=/etc/loki/local-config.yaml
        volumes:
          - /data/loki:/loki
        networks:
          - loki
      grafana:
        image: grafana/grafana:master
        ports:
          - "3000:3000"
        networks:
          - loki

    查看docker-compose version

    执行命令安装启动 docker-compose up -d

     

    查看容器是否启动 

    docker ps 

    yarnClient 获取聚合日志 日志聚合系统_日志采集_02

    如图loki 和grafana已启动

     

    4,安装promtail

    创建软件文件夹

    1)下载promtail 日志采集端

     

    下载地址:https://github.com/grafana/loki/releases/

    选择promtail-linux-amd64.zip,复制链接地址wget即可:

     

     

    2)解压

     

    yarnClient 获取聚合日志 日志聚合系统_日志采集_03

    3)配置文件

     同级目录创建配置文件promtail-local-config.yaml

    clients:loki地址

    __path__: 需采集的日志文件目录

    server:
      http_listen_port: 9080
      grpc_listen_port: 0
    
    positions:
      filename: /tmp/positions.yaml
    
    clients:
      - url: http://10.23.14.1:3100/loki/api/v1/push
    
    scrape_configs:
    - job_name: cbas-service
      static_configs:
      - targets:
           - localhost
        labels:
          service: cbas-service
          env: dev
          __path__: /data/logs/cbas-service/*.log
    - job_name: social-service
      static_configs:
      - targets:
           - localhost
        labels:
          service: social-service
          env: dev
          __path__: /data/logs/social-service/*.log

     

    启动脚本

    echo "stop promtail"
    
    #开始循环5次,判断目标进程是否存在,如果存在安全退出 kill -15等待3秒 否则终止循环
    for((i=1;i<=5;i++));
    do
    pid=`ps -ef | grep promtail | grep config | grep -v grep | awk '{print $2}'`
    if [ -n "$pid" ]
    then
    echo “旧应用进程id:$pid”
    kill -15 $pid
    sleep 3
    else
    echo "安全退出"
    break
    fi
    done
    
    #判断循环是否安全退出,如果退出失败。强制退出kill -9  
    pid=`ps -ef | grep promtail | grep config | grep -v grep | awk '{print $2}'`
    if [ -n "$pid" ]
    then
    echo "安全退出失败强制退出kill-9"
    kill -9 $pid
    fi
    
    nohup ./promtail-linux-amd64 --config.file=promtail-local-config.yaml >pro.log &

    运行结果在pro.log