sentry
Sentry是一个开源 的程序异常采集平台。它主要由两部分组成,一部分是用python实现的服务端,一个是各种平台下的SDK集合。
Sentry使用起来十分方便,部署和接入教程可以找到一大堆。github.com/getsentry/o…这个教程就介绍了如何使用docker技术快速部署一个Sentry服务端。
背景
疫情期间,公司的访问量出现了激增,原本毫无压力的一台4核8G ECS在复工的第二天就被汹涌的报错请求压垮了。我们失去了一个快速定位线上问题的好帮手。庆幸的是sentry挂掉并不会直接影响到用户的正常使用。
为了继续保证服务质量,不在关键时刻掉链子。团队决定申请机器,集群化部署Sentry服务。
Sentry平台一开始是我引入进来的,维护&扩容任务自然也要落到我的头上。
踩坑
接到任务以后搜遍了各大知识平台都没有找到Sentry集群部署相关的分享。只好自己踩坑,把经验分享给大家:
-
任务目标,Sentry平台扩展为集群部署,同时保留全部配置和数据,接入方无需任何修改即可自动回复服务,限时24小时上线。
-
为了方便数据迁移,继续采用docker平台,添加sentry001-004共4台机器
-
sentry服务端端模块有redis、postgres、memcached、stmp、sentry-web、sentry-worker、sentry-corn几个部分组成,功能分别为
-
redis,支持消息队列和任务调度
-
postgres,数据存储
-
memcached,kv存储,用于worker数据管理
-
stmp,邮件服务
-
sentry-cron,实现定时任务,如定时群发邮件
-
sentry-worker,处理数据解析等任务,完成异常的分类、入库等操作
-
sentry-web,网络服务,后台网站和报错接口
-
-
4台机器的服务分配为:
- sentry001作为主节点,部署postgres、redis、stmp、sentry-corn、memcached和少量sentry-worker、sentry-web。
- sentry002-004三台机器作为从节点,都部署sentry-worker、sentry-web、memcached,从节点可以随负载变化动态扩容
-
继续使用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
-
-
另外分布式部署以后,需要一个统一的存储服务,用于sourcemap等文件的存储。采用minio,部署在主节点。需要在config.yml内添加filestore信息:
filestore.backend: 's3' filestore.options: access_key: '***' secret_key: '***' bucket_name: '***' endpoint_url: 'http://172.16.1.100:6000'
-
数据迁移。由于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
-
启动服务的时候根据机器核数配置一下进程数
-
主节点启动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资源会比较厉害
-
-
通知运维同学,把流量均匀的分配到sentry001-004的9000端口,就完成上线了
最后
有条件的同学可以把redis迁移到独立集群上,考虑到sentry的数据不是那么重要,postgres可以搞得随意一点,这样可以省下一大笔RDS经费