Sentry的集群部署

2,800 阅读4分钟

sentry

Sentry是一个开源 的程序异常采集平台。它主要由两部分组成,一部分是用python实现的服务端,一个是各种平台下的SDK集合。

Sentry使用起来十分方便,部署和接入教程可以找到一大堆。github.com/getsentry/o…这个教程就介绍了如何使用docker技术快速部署一个Sentry服务端。

背景

疫情期间,公司的访问量出现了激增,原本毫无压力的一台4核8G ECS在复工的第二天就被汹涌的报错请求压垮了。我们失去了一个快速定位线上问题的好帮手。庆幸的是sentry挂掉并不会直接影响到用户的正常使用。

为了继续保证服务质量,不在关键时刻掉链子。团队决定申请机器,集群化部署Sentry服务。

Sentry平台一开始是我引入进来的,维护&扩容任务自然也要落到我的头上。

踩坑

接到任务以后搜遍了各大知识平台都没有找到Sentry集群部署相关的分享。只好自己踩坑,把经验分享给大家:

  1. 任务目标,Sentry平台扩展为集群部署,同时保留全部配置和数据,接入方无需任何修改即可自动回复服务,限时24小时上线。

  2. 为了方便数据迁移,继续采用docker平台,添加sentry001-004共4台机器

  3. sentry服务端端模块有redis、postgres、memcached、stmp、sentry-web、sentry-worker、sentry-corn几个部分组成,功能分别为

    • redis,支持消息队列和任务调度

    • postgres,数据存储

    • memcached,kv存储,用于worker数据管理

    • stmp,邮件服务

    • sentry-cron,实现定时任务,如定时群发邮件

    • sentry-worker,处理数据解析等任务,完成异常的分类、入库等操作

    • sentry-web,网络服务,后台网站和报错接口

  4. 4台机器的服务分配为:

    • sentry001作为主节点,部署postgres、redis、stmp、sentry-corn、memcached和少量sentry-worker、sentry-web。
    • sentry002-004三台机器作为从节点,都部署sentry-worker、sentry-web、memcached,从节点可以随负载变化动态扩容
  5. 继续使用docker-compose管理

    • 主节点配置

      version: '3.4'
      
      x-defaults: &defaults
        restart: unless-stopped
        build:
          context: .
        depends_on:
          - redis
          - postgres
          - memcached
          - smtp
        env_file: .env
        environment:
          SENTRY_MEMCACHED_HOST: memcached
          SENTRY_REDIS_HOST: redis
          SENTRY_POSTGRES_HOST: postgres
          SENTRY_EMAIL_HOST: smtp
        volumes:
          - sentry-data:/var/lib/sentry/files
      
      services:
        smtp:
          restart: unless-stopped
          image: tianon/exim4
          ports:
            - '172.16.1.100:25:25'
      
        memcached:
          restart: unless-stopped
          image: memcached:1.5-alpine
          ports:
            - '172.16.1.100:11211:11211'
      
        redis:
          restart: unless-stopped
          image: redis:3.2-alpine
          ports:
            - '172.16.1.100:6379:6379'
      
        postgres:
          restart: unless-stopped
          image: postgres:9.5
          ports:
            - '172.16.1.100:5432:5432'
          volumes:
            - sentry-postgres:/var/lib/postgresql/data
      
        web:
          <<: *defaults
          ports:
            - '172.16.1.100:9000:9000'
        cron:
          <<: *defaults
          command: run cron
      
        worker:
          <<: *defaults
          command: run worker -n sentry001
         
      
      
      volumes:
          sentry-data:
            external: true
          sentry-postgres:
            external: true
      
      
    • 从节点配置

      version: '3.4'
      
      x-defaults: &defaults
        restart: unless-stopped
        build:
          context: .
        env_file: .env
        environment:
          SENTRY_MEMCACHED_HOST: memcached
          SENTRY_REDIS_HOST: 172.16.1.100
          SENTRY_POSTGRES_HOST: 172.16.1.100
          SENTRY_EMAIL_HOST: 172.16.1.100
        volumes:
          - sentry-data:/var/lib/sentry/files
      
      
      services:
        web:
          <<: *defaults
          ports:
            - '172.16.1.102:9000:9000'
        memcached:
          restart: unless-stopped
          image: memcached:1.5-alpine
        worker:
          <<: *defaults
          command: run worker -c 3
      volumes:
          sentry-data:
            external: true
      
  6. 另外分布式部署以后,需要一个统一的存储服务,用于sourcemap等文件的存储。采用minio,部署在主节点。需要在config.yml内添加filestore信息:

    filestore.backend: 's3'
    filestore.options:
      access_key: '***'
      secret_key: '***'
      bucket_name: '***'
      endpoint_url: 'http://172.16.1.100:6000'
    
  7. 数据迁移。由于sentry001就是原有sentry节点,postgres数据无需迁移,只要把sentry-data volume内的文件迁移到minio就行了。

    cp -r volumes/sentry-data/_data/* volumes/minio-data/
    

    或者使用minio的客户端工具

    mc cp /var/lib/docker/volumes/sentry-data/_data/ local/sentry-data
    
  8. 启动服务的时候根据机器核数配置一下进程数

    • 主节点启动2个worker个实例和一个web实例 docker-compose up -d --scale worker=2

    • 从节点各自启动 4个worker实例和一个web实例 docker-compose up -d --scale worker=4

    • 其中每个worker实例有包含了1+3个worker进程,每个web实例包含2个进程(参见sentry.conf.py的配置文档)

    • 以上配置需要根据自己机器和流量的情况调整,以最大化利用机器资源。

    • 前端上传sourcemap文件较多时,worker耗费cpu资源会比较厉害

  9. 通知运维同学,把流量均匀的分配到sentry001-004的9000端口,就完成上线了

最后

有条件的同学可以把redis迁移到独立集群上,考虑到sentry的数据不是那么重要,postgres可以搞得随意一点,这样可以省下一大笔RDS经费