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 的问题,敬请留言;有任何经验要分享也非常欢迎。希望这篇文章对大家有帮助。


参考文档:

  • https://github.com/getsentry/self-hosted/issues/540
  • https://develop.sentry.dev/self-hosted/troubleshooting/#reducing-disk-usage
  • https://stackoverflow.com/questions/52970153/kafka-how-to-avoid-running-out-of-disk-storage/52970982#52970982
  • https://forum.sentry.io/t/sentry-disk-cleanup-kafka/11337?u=byk
  • https://forum.sentry.io/t/database-cleanup/370
  • https://forum.sentry.io/t/unable-to-run-sentry-cleanup-due-to-lack-of-disk-space/574
  • https://forum.sentry.io/t/manual-clean-up/10631

Posted

in

by

Comments

《“Sentry 清理磁盘经验分享”》 有 1 条评论

  1. […] 清理 Sentry 磁盘占用 时需要安装 pg_repack […]

欢迎吐槽,共同进步

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

%d 博主赞过: