• Linux下部署Sentry服务


    Ubuntu下Sentry部署

    Sentry作为一款常见以及使用人数较多的监控服务,在接口监控、错误捕捉、错误报警等方面是非常不错的,在此之前我也用过Prometheus监控,各有各的好处,有兴趣的同学可以对这些都了解一下。

    安装docker

    apt install curl -y
    sh -c "$(curl -fsSL https://get.docker.com)"
    systemctl start docker
    systemctl enable docker
    

    安装docker-compose

    # 下载 docker-compose 
    wget https://github.com/docker/compose/releases/download/1.26.0/docker-compose-Linux-x86_64
    # 移到 /usr/local/bin/docker-compose
    sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
    # 给 docker-compose 执行权限
    sudo chmod +x /usr/local/bin/docker-compose
    

    下载安装sentry

    wget https://github.com/getsentry/onpremise/archive/refs/tags/21.4.1.tar.gz

    tar -zxvf 21.4.1.tar.gz

    cd onpremise-21.4.1/

    修改 /sentry/config.yml,注意邮箱的tls和ssl只能一个为true

    mail.host: 'smtp.exmail.qq.com'
    mail.port: 465
    mail.username: 'xxx@xxx.com'
    mail.password: 'xxx'
    mail.use-tls: false
    mail.use-ssl: true
    #The email address to send on behalf of
    mail.from: 'xxx@xxx.com'
    

    修改.env文件,在末尾添加数据自动清理时间,默认90天太长了,不设置也没关系

    SENTRY_EVENT_RETENTION_DAYS=14
    

    执行 :

    ./install.sh
    

    中途会让创建用户

    然后执行:

    docker-compose up -d
    

    如果想停止sentry服务,执行:

    docker-compose down
    

    sentry数据清理

    sentry服务部署一段时间后发现剩余磁盘空间越来越小,寻找了很多解决方案,以下两个方案供参考。

    方法一

    实际上最大的数据是postgres里一个不断增长的表public.nodestore_node,一般发现的时候磁盘基本都被它满了,所以百度到的通用解决方案可能并没有办法执行,所以我们直接将它TRUNCATE掉即可,清空后不会影响后续的业务就行。

    #首先进入postgres容器
    docker exec -it sentry_onpremise_postgres_1  /bin/bash
    
    #切换用户
    su postgres
    
    #进入postgres
    psql
    
    #清空这个害人的表
    TRUNCATE public.nodestore_node;
    
    #在清理前后可以查看下这个表占用的空间
    SELECT
        table_schema || '.' || table_name AS table_full_name,
        pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
    FROM information_schema.tables
    ORDER BY
    pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC limit 20;
    

    方法二

    下方是百度到排名靠前的解决方案,在执行第二步时剩余磁盘空间不足会出现问题,在此记录作为参考。

    1、SENTRY数据软清理 (清理完不会释放磁盘,如果很长时间没有运行,清理时间会很长)

    #登录worker容器
    docker exec -it sentry_onpremise_worker_1 /bin/bash 
    
    #保留多少天的数据,cleanup使用delete命令删除postgresql数据,但对于delete,update等操作,只是将对应行标志为DEAD,并没有真正释放磁盘空间
    sentry cleanup --days 7
    

    2、POSTGRES数据清理 (清理完后会释放磁盘空间)

     #登录postgres容器
    docker exec -it sentry_onpremise_postgres_1  /bin/bash
    
    #运行清理
    vacuumdb -U postgres -d postgres -v -f --analyze
    vacuumdb -U postgres -d postgres -t nodestore_node -v -f --analyze
    

    3、定时清理脚本

    0 1 * * * cd /data1/onpremise && { time docker-compose run --rm worker cleanup --days 7; } &> /var/log/cleanup.log
    0 8 * * * { time docker exec -i $(docker ps --format "table {{.Names}}"|grep postgres) vacuumdb -U postgres -d postgres -v -f --analyze; } &> /data1/logs/vacuumdb.log
    

    4、异常处理

    因为磁盘已经被占满,所以上面的清理命令也执行不动了,没办法只能自己寻找大文件临时删除一些,于是找到了下面的大文件

    /var/lib/docker/volumes/sentry-kafka/_data/events-0/*.log

    看着是 .log结尾的文件,而且很大,就直接删除了,结果发现重启后,sentry无法正常收到上报了。

    参考:https://forum.sentry.io/t/sentry-disk-cleanup-kafka/11337

    没办法,只能重新安装

    cd /data1/onpremise
    ./install.sh
    重新启动生效,重新安装不会清理原有数据,所以不备份也没关系

    docker-compose down
    docker-compose build
    docker-compose up -d

    5、清理kafka占用磁盘过大的问题
    清理kafka占用磁盘过大的问题搜到可以配置 .env,如下,但是我的没有效果

    KAFKA_LOG_RETENTION_HOURS=24
    KAFKA_LOG_RETENTION_BYTES=53687091200 #50G
    KAFKA_LOG_SEGMENT_BYTES=1073741824 #1G
    KAFKA_LOG_RETENTION_CHECK_INTERVAL_MS=300000
    KAFKA_LOG_SEGMENT_DELETE_DELAY_MS=60000
    于是自己研究,首先进入kafka的容器

    docker exec -it sentry_onpremise_kafka_1 /bin/bash

    查看topics

    kafka-topics --list --zookeeper zookeeper:2181

    修改kafka配置文件

    vi server.propertyies

    修改为7小时 默认168

    log.retention.hours=7
    log.cleaner.enable=true
    log.cleanup.policy=delete
    log.cleanup.interval.mins=1

    重启

    kafka-server-stop
    kafka-server-start -daemon
    重启后过了一会也没效果,第二天才看到效果,具体原因有待研究,再去查看目录的大小,发小从20G下降到12G左右

    cd /var/lib/docker/volumes/sentry-kafka/_data/events-0
    du -h --max-depth=1
    ls -alh # 日期最小的是3天前的日志:00000000000000146071.log
    docker容器没有vi命令的解决方案

    apt-get update
    apt-get install vim

    6、官方解决方案
    其实官方已经提供了解决方案,修改 .env文件的以下配置

    SENTRY_EVENT_RETENTION_DAYS=7
    重新安装即可

    详情参考:https://github.com/getsentry/onpremise

    后记

    安装报错

    如果安装遇到了如下报错:

    ...
    Creating network "sentry_onpremise_default" with the default driver
    Cannot create container for service zookeeper: open /mnt/docker/volumes/sentry_onpremise_sentry-zookeeper-log/_data: no such file or directory
    An error occurred, caught SIGERR on line 3
    Cleaning up...
    ...
    

    解决思路:

    1. 先查看是否有文件操作的权限,可切换root用户重试。

    2. 有权限还出现这样问题,如果不是文件缺失,那可能就是挂载卷出了问题

      # 查看docker挂载卷
      docker volume ls
      # 删除无主挂载卷
      docker volume prune
      

      然后重新安装即可。

    数据备份

    上方有数据清理的方案,但只是本机操作,如果想从一台机器迁移到另一台机器还是有着不小的麻烦,直接拷贝挂载卷或许是一个可行的办法(我一开始就是这么干的),但实际上官方提供了更为简洁的数据备份方案,有兴趣可查看[说明文档](Self-Hosted Backup & Restore | Sentry Developer Documentation):

    • 快速备份:使用sentry提供的export命令,备份只包括配置数据,而不包括历史event数据
    • 完整备份:将’sentry-'开头的所有容器进行备份,这种备份方式能备份所有历史event数据

    一般来说,历史数据基本没有什么用,除非还要往前追责什么的,所以我们选择快速备份即可,生成的备份文件也非常地小。

    到处配置

    # 生成备份文件
    docker-compose run --rm -T -e SENTRY_LOG_LEVEL=CRITICAL web export > /home/backup.json
    # 将文件保存或发送到另一个服务器
    

    导入配置

    # 将配置文件导入容器内
    docker cp /home/backup.json sentry_onpremise_web_1:/home/backup.json
    # 进入容器
    docker exec -it sentry_onpremise_web_1 /bin/bash
    # 执行sentry命令
    sentry import /home/backup.json
    
  • 相关阅读:
    nyoj 42 一笔画 欧拉通路
    布丰投针实验1
    poj 1328 贪心
    uva 10026 贪心
    zoj 1375 贪心
    uva 103 经典DAG变形
    uva 11088 暴力枚举子集/状压dp
    jsp分页功能
    static静态变量的理解
    Vector & ArrayList 的主要区别
  • 原文地址:https://www.cnblogs.com/Du704/p/15843616.html
Copyright © 2020-2023  润新知