标签: kafka

  • Sentry 清理磁盘经验分享

    Sentry 清理磁盘经验分享

    Sentry 使用一段时间之后,磁盘占用非常厉害,普通云服务器初始的 40/50G 云盘完全不够用,所以就得定时清理维护。

    通过阅读一些相关技术文档(见后),我们知道:

    • Sentry 使用 Postgresql 存储数据
    • Sentry 使用 Kafka 存储上传的日志
    • Kafka 默认的硬盘操作策略比较粗放,会占很多空间
    • Postgresql 也会存很多数据

    其实 Sentry 里的历史数据的价值不大:上周上报的错误,处理完也就没用了,我们可以放心大胆地把它们清理掉。Sentry 也提供了一些方案,大概来说两条:

    1. 限制 Kafka,让 Kafka 自动清理
    2. 清理 Postgres

    经过实践,我发现官方网站有一些内容不太具体;而因为历史悠久,网上信息噪音太多,所以我当时也折腾了不少时间。今天把经验分享出来,希望对大家有用。

    限制 Kafka 磁盘用量

    这个部分比较简单,我们有很多方案,目前我是把配置添加到 docker-compose.yml Kafka 的环境变量里,内容如下:

    kafka:
      environment:
        KAFKA_LOG_RETENTION_HOURS: "24"
        KAFKA_LOG_RETENTION_BYTES: "10737418240" # 10G
        KAFKA_LOG_SEGMENT_BYTES: "1073741824" #1G
        KAFKA_LOG_RETENTION_CHECK_INTERVAL_MS: "300000"
        KAFKA_LOG_SEGMENT_DELETE_DELAY_MS: "60000"

    这样做的坏处是必须重新部署环境才能生效。也可以修改 .env 文件,我没试过,所以略过不提。

    删除 Postgres 的老数据

    官方只说了这两句,清理掉 7 天之前的数据,然后使用 pg_repack 热重建 Postgres 的索引,即可。命令如下:

    // 在 web 容器里执行 `cleanup` 命令清除 7 天前的数据
    docker-compose run -T web cleanup --days 7 -m nodestore -l debug
    
    // 在 postgres 容器里使用 pg_repack 重建索引
    docker-compose run -T postgres bash -c "apt update && apt install -y --no-install-recommends postgresql-9.6-repack && su postgres -c 'pg_repack -E info -t nodestore_node'"

    实际我在操作时遇到不少问题。经过摸索,更完整的过程是这样的:

    1. docker-compose => sudo docker compose

    docker-compose 是 1.x 版本,我厂安装的是 docker + docker-compose-plugin,即 2.x 版本,所以不能使用 docker-compose,要用 docker compose。且因为云服务器的默认用户不是 root,所以一定要加 sudo

    2. 安装 pg_repack 插件

    安装配置好 Sentry 之后,要安装 pg_repack 和配置插件。

    # 登录 Postgres 容器,现在的云服务器,默认用户应该都不是 root,所以要注意加 sudo
    $ sudo docker compose exec postgres bash
    root@f615d8742634:/#
    
    # 安装 pg_repack 插件,同时,为编辑文件,需要安装 vim
    root@f615d8742634:/# apt update
    root@f615d8742634:/# apt install -y --no-install-recommends postgresql-9.6-repack
    root@f615d8742634:/# apt install vim
    
    # 切换到 postgres 用户
    root@f615d8742634:/# su postgres
    # 验证一下 pg_repack 插件
    postgres@f615d8742634:/$ pg_repack --version
    pg_repack 1.4.7 # 返回这个就是成功了
    
    # 将 pg_repack 加入 Postgres 启动配置
    postgres@f615d8742634:/$ cd $PGDATA
    postgres@f615d8742634:~/data$ vim postgresql.conf
    shared_preload_libraries = 'pg_repack'
    :wq!
    
    # 将 pg_repack 在仓库里注册
    postgres@f615d8742634:~/data$ psql postgres
    psql (9.6.24)
    Type "help" for help.
     
    postgres=# CREATE EXTENSION pg_repack;
    CREATE EXTENSION
    postgres=# \dx
                                      List of installed extensions
       Name    | Version |   Schema   |                         Description                          
    -----------+---------+------------+--------------------------------------------------------------
     citext    | 1.3     | public     | data type for case-insensitive character strings
     pg_repack | 1.4.7   | public     | Reorganize tables in PostgreSQL databases with minimal locks
     plpgsql   | 1.0     | pg_catalog | PL/pgSQL procedural language
    (3 rows)
     
    postgres=# \q

    最后,记得要重启容器才能生效:sudo docker compose restart postgres

    2. 执行清理

    可以按照官方建议,使用 sudo docker compose run,不过我一般会登录到 Postgres 容器,然后手动执行清理。

    $ sudo docker compose exec postgres bash
    root@f615d8742634:/# su postgres
    postgres@f615d8742634:/$ pg_repack -E info -t nodestore_node

    后续注意事项

    这样操作之后,会产生一个新问题:升级镜像之后,因为新镜像没有 pg_repack 插件,所以可能会无法启动。所以记得升级 sentry 前先把插件移除。

    方案基本相当于前面的逆操作:

    1. postgresql.conf 里移除配置
    2. 从数据库中移除插件

    具体命令就懒得敲了,兴许下次升级吧。


    如果各位读者老爷有关于 Sentry 的问题,敬请留言;有任何经验要分享也非常欢迎。希望这篇文章对大家有帮助。


    参考文档: