分类: sentry

  • 增加 Swap 解决 Sentry 频繁死机的问题

    增加 Swap 解决 Sentry 频繁死机的问题

    我厂 Code.fun 近期进步不小,产品力顺应民意,需求导向,收获了不错的效果。欢迎有大量页面需求的朋友联系试用。

    但是随之而来产生一个问题:Sentry 不定时死机。通过腾讯云的日志分析,死机前多半会有大量的 IO 读操作,除此之外也没找到别的信息。Sentry 跑在 docker compose 里,很多组件我都不熟悉,docker 里面调试的技能我也不会,除了 docker compose logs 看日志以外,我也没有更好的办法。所以问题一直没有定位到。

    于是,最近几周就变成要查问题 -> sentry 挂了 -> 重启 -> 又要查问题 -> sentry 又挂了 -> 又重启……这样的状态。中间我试着降低 Kafka 的定时清理频率,也没有收到效果。

    后来有一天我挂着 ServerCat 看服务器状态,突然发现 Sentry 的内存好高,在 95%~98% 之间摇摆。我想起来默认的 ubuntu 好像没有配置虚拟内存,那么如果内存满了,会不会就死了呢?虽然想不到和磁盘 IO 有什么关系,不过我决定试一试。

    还好我之前搞 Sentry 磁盘优化比较成功,现在 80G 的硬盘占用基本稳定在 40G~50G 之间,有 30G 左右的富余,可以用作 swap。

    首先,使用 sudo swapon --show 查看已经挂在的 swap,果然为空。

    接着,创建一个 5G 的 swap 文件(我记得我用的不是这个命令,但是现在只能搜到这个,我周末再试一下):

    sudo fallocate -l 5G /swapfile

    改变它的权限为 600,仅供系统使用:

    sudo chmod 600 /swapfile

    将其配置为 swap:

    sudo mkswap /swapfile

    启动为 swap

    sudo swapon /swapfile

    再次使用 sudo swapon --show 即可查看使用情况:

    NAME       TYPE SIZE USED PRIO
    /swapfile1 file   5G 2.1G   -2

    配置 swap 之后几次查看,内存用量逐步降低到 80% 附近,swap 可以用满。但是死机的情况彻底消失,基本可以断定是内存的问题。之前买服务器的时候,可着最低系统要求,4C8G,看来生产环境用起来的确不太够。群里有同学还说可以偷偷改最低要求的配置,在更小的服务器上安装,那就真的只能是自己开发试着玩了。

    准备周日上午趁着人最少的时候再把 swap 调大到 8G,应该足够未来一段时间的使用。不知道将来人更多的时候会不会更挤,看来有必要把大家的取样率都下降到 2%。说不定将来都用 Sentry SaaS 会更经济呢,欢迎有经验的同学来分享。

    希望上面的内容对大家有帮助。如果你遇到其它使用 Sentry 的问题,不妨发出来,我们一起讨论,共同学习。

  • 升级 Sentry 自主部署实例

    升级 Sentry 自主部署实例

    Sentry 使用日历版本(CalVer)生成版本号,即按照特定时间来发布版本,比如今年是 2022 年,在刚刚过去的 10 月份,他们就发布了 22.10 版本。按照这种方式,很快 22.11 也会发布。

    每个版本都会有一些问题修复、新功能添加。而且,作为一个错误管理平台,里面存储数据,很多都跟我们的代码有关,所以我们也很关注它的安全问题。所以,我建议大家及时升级到新版本。

    按照 Sentry 的设计,升级其实很简单:

    1. 下载最新版本:https://github.com/getsentry/self-hosted/releases/
    2. 解压缩到目标文件夹
    3. 执行 ./install.sh 即可

    不过考虑到 清理 Sentry 磁盘占用 时需要安装 pg_repack 插件,这个过程实际要复杂一些。否则,可能会安装失败,到时候,恢复也很麻烦。

    升级 Sentry self-hosted 实例

    停用 pg_repack

    • 进入 sentry 配置目录,对于我来说,就是 ~/sentry
    • 登录 Postgresql 容器:sudo docker compose exec postgres bash
    • 之前我们已经装过 vim,所以不用再装。否则话,需要先安装一个文本编辑器:apt update && apt install vim
    • 修改配置:
      • su postgres
      • cd $PGDATA
      • vim postgresql.conf
      • shared_preload_libraries = 'pg_repack' <– 找到并注释这一句
      • 保存并退出 wq
    • 进入 postgresql shell:psql postgres
      • psql postgres
      • 执行 SQL:DROP EXTENSION pg_repack;

    更新配置文件

    • 下载新版本之后,解压缩到新目录 sentry_new
    • 备份之前的配置文件,对于我而言,需要备份三个文件:
      • ~/entry/docker-compose.yml 里面关于 Kafka 的配置
      • ~/sentry/sentry/config.yml 里的邮箱配置
      • ~/sentry/sentry/sentry.conf.py 最后面的其它配置
    • sentry_new 复制到原本的 sentry
    • 将备份的配置复制回去

    安装新版本

    接下来安装新版本:sudo ./install.sh

    安装脚本会自动停止服务,然后拉新的镜像,然后部署新的容器。这个过程会持续一段时间,与网络状态、机器性能都有关,需要提前做好准备。

    这个过程如果断开连接,会出错失败。所以建议用 screentmux 等工具保持进程运行。

    安装成功后,正常启动服务即可:sudo docker compose up -d,然后就可以使用新版本的 Sentry 了。

    清理老的镜像和容器

    一般来说,这个过程不是很必要,至少不用每次升级都做。为了避免未来的使用问题,可以先留一阵子,我建议最多清理一年前的残留镜像和容器。

    (过程方法待补充)

    常见更新失败及解决

    container for service "postgres" is unhealthy

    这就是我前面说到的原因:因为事前在 Postgresql 容器里启动过 pg_repack 插件,升级之后的容器里并没有这个插件,但因为继承了以前的存储卷(Volume),所以启动容器时还是会查找这个插件,因为容器里没有,就挂了。

    解决方案是:

    1. 回滚到之前的版本,其实就是把比老版本配置文件拷回来
    2. 因为我们并没有清理镜像和容器,所以此时老版本是可以正常启动的
    3. 不用完全启动,启动 postgresql 即可:sudo docker compose start postgres
    4. 然后登入 postgres 容器,执行前面的操作,清理 pg_repack 插件
    5. 退出并关闭 postgres 容器
    6. 重复上面的新版本安装过程

    总结

    作为一名土前端,我对 docker 不太熟悉,对 Kafka、Postgresql 也知之甚少。使用 Sentry 之后,迫不得已必须学习很多新知识,我觉得很有意思。如今我已经尽量使用 Docker Desktop 去使用和管理一些软件,我觉得很方便。接下来好好学习,争取把 Docker 生态的工具也为我所用。

    如果你有任何问题、建议,欢迎留言讨论。

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


    参考文档:

  • Ubuntu 22.04 部署 Sentry 笔记

    Ubuntu 22.04 部署 Sentry 笔记

    Sentry 可能是目前最流行的缺陷管理软件,它可以帮我收集线上产品的问题,帮我们发现各种缺陷。除了 SaaS 服务以外,它还提供独立部署版本,相信大多数用户跟我一样,都觉得独立部署比较安全,这里就分享下前阵子帮我厂搭建 Sentry 的经验。

    0. 准备

    Sentry 号称需要 4核 8G 以及 20G 硬盘,但 20G 其实完全不够,我厂产品接入一半,一周就产生 20+G 的数据量。建议至少准备 100G。

    1. 安装 Docker + Compose 插件

    Sentry 私有部署版使用 docker compose 作为部署方案,所以我们要先安装 Docker 和 Compose 插件。建议先阅读上面的文档,然后可以配合下面的步骤操作。

    卸载旧版本

    sudo apt-get remove docker docker-engine docker.io containerd runc

    配置 Docker 预编译包仓库

    推荐用这种方式来安装,方便日后升级。

    $ sudo apt-get update
    
    $ sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
    $ sudo mkdir -p /etc/apt/keyrings
    
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
    $ echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

    安装 Docker 和 Compose 插件

     $ sudo apt-get update
     $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

    测试 Docker

    此时,正常来说,Docker 和 Compose 插件均安装完毕,我们可以跑个 hello-world 测试一下:

    $ sudo service docker start # 启动 docker engine 服务
    $ sudo docker run hello-world

    安装 Sentry

    下载

    https://github.com/getsentry/self-hosted/releases/latest

    下载完成后,解压到安装目录。以后所有操作都在这个目录完成,建议修改下目录名,并且放在公共目录里,方便大家管理。

    我用的目录名是 ~/sentry

    安装

    执行 sudo ./install.sh。如果你的当前用户不是 root,那么 sudo 就非常重要,否则可能会报告各种奇奇怪怪的错误。

    注意:以后的 sudo 也都是必须的。

    安装过程会比较久,要拉很多个镜像并生成容器。这个过程建议保持网络畅通,或者使用 screentmux 等工具保活,否则不小心断联就可能会前功尽弃。

    启动

    安装完成之后,执行 sudo docker compose up -d 启动服务即可。

    配置 Nginx 反向代理 9000 端口

    这段不详细解释了,有人提问的话再补充。总之:

    1. Nginx 反向代理 9000 端口
    2. 使用 Certbot 启动 https
    3. 或者申请个免费证书然后启动 https

    配置邮箱

    修改 ~/sentry/sentry/config.yml,完成邮箱配置。我们用的是腾讯企业邮箱,配置不复杂,就按照 SMTP 教程即可。需要注意的是,mail.from 要跟用户名一致,否则会发不出去。

    修改配置之后,都要重启整个 compose 集群才能生效。

    配置项目

    进入 Sentry,完成首次登录配置。

    然后创建项目,选好项目类型,就能看到配置教程,非常方便。


    总结

    Sentry 开源搞得很好,文档健全,基本能解决大部分问题。

    可惜版本比较多,互联网上有很多内容已经过期,大家阅读时要稍加分辨。

    有其它部署和使用的问题,可以留言交流。