Sentry 使用一段时间之后,磁盘占用非常厉害,普通云服务器初始的 40/50G 云盘完全不够用,所以就得定时清理维护。
通过阅读一些相关技术文档(见后),我们知道:
- Sentry 使用 Postgresql 存储数据
- Sentry 使用 Kafka 存储上传的日志
- Kafka 默认的硬盘操作策略比较粗放,会占很多空间
- Postgresql 也会存很多数据
其实 Sentry 里的历史数据的价值不大:上周上报的错误,处理完也就没用了,我们可以放心大胆地把它们清理掉。Sentry 也提供了一些方案,大概来说两条:
- 限制 Kafka,让 Kafka 自动清理
- 清理 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 前先把插件移除。
方案基本相当于前面的逆操作:
- 从
postgresql.conf
里移除配置 - 从数据库中移除插件
具体命令就懒得敲了,兴许下次升级吧。
如果各位读者老爷有关于 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
欢迎吐槽,共同进步