问题背景:
在做一个协同编辑的项目
所使用的技术栈:
nodejs + pm2 + socket.io + socket.redis.adapter.io + grpc
用户在进入对应节点时,客户端会发起websocket连接,并且告知当前用户信息,需要查看哪个节点等信息。
服务端接收到消息后执行对应的逻辑,执行完成后返回
watchroom -> websocket -> grpc -> emit
调用grpc 超时失败, 起初是认为grpc 的问题, 于是开了个python脚本 访问grpc,没有问题, 表示grpc 服务端正常。
在一起大规模断连的场景下,关注到日志
timeout reached while waiting for fetchSockets response
于是排查websocket + redis问题, 测试发现 redis本身的连接没有问题,只是某次差点寻会有问题。想到大key的问题,在测试环境复现,复制粘贴大量数据走 websocket 确实会出现断连的情况。
还需要进一步印证这个想法。
简单redis 监控。
我们本身是有prometheus 和 grafana 的,
# 创建docker compose 文件, 输出监控指标
docker-compose-redis-export.yaml
version: "3.2"
services:
redis-exporter:
image: oliver006/redis_exporter:v1.51.0
container_name: redis-exporter
restart: unless-stopped
command:
- "-redis.password-file=/redis_passwd.json"
volumes:
- /usr/share/zoneinfo/PRC:/etc/localtime
- ./redis_passwd.json:/redis_passwd.json
expose:
- 9121
ports:
- "9121:9121"
# redis 连接信息
touch redis_passwd.json
{
"redis://127.0.0.1:6379":"pwd" #如果没有密码 冒号后设置空字符串
}
访问 http://127.0.0.1:9121/ ,显示正常这一步则没有问题。
prometheus yml配置
- job_name: 'redis_exporter_targets'
static_configs:
- targets:
- redis://127.0.0.1:6379
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9121
## config for scraping the exporter itself
- job_name: 'redis_exporter'
static_configs:
- targets:
- 10.57.1.17:9121
grafna 配置 导入 17507
将.redis.adapter 使用单独的redis,避免大key的问题
修改前 redis1
修改后 redis 1
redis2
反而出现问题的频次更多了,还在排查中