前情提要: 最近接了大数据项目的postgresql运维,刚接过来他们的报表系统就出现高峰期访问不了的问题,报表涉及实时数据和离线数据,离线读pg,实时读redis。然后自然而然就把redis也挪到我们这边优化了 -_-! 。在这次优化过程中也是再次深刻感受到redis的各种坑
现象: 大数据报表周末晚上高峰期实时报表打不开,基本上处于不能使用状态,实时报表主要访问redis数据,监控发现Redis CPU占用过高,高峰期2个从库实例的CPU达到100%,由于redis是单进程单线程结构,所以单核CPU达到100%导致查询阻塞
当前架构: 1主1从 ,应用手动读写分离,持久化主从默认都开启开启rdb持久化,没有做aof,参数基本走默认(灰常牛批 -_-!)
问题导致原因排查:
好了,整理出一大堆问题之后,开始各种分析: 首先看的网络问题,跟运维小伙伴沟通过,结合监控结果发现,网络基本上没有问题,网卡流量也远远没有到瓶颈,首先排除网络问题。但是,在redis从库的日志中,发现有个报错很频繁:
47960:S 16
Apr
12:05:36.951
#Connection with master lost.
47960:S 16
Apr
12:05:36.951
*
Caching the disconnected master state.
47960:S 16
Apr
12:05:37.799
*
Connecting to MASTER 192.168.63.2:6379
47960:S 16
Apr
12:05:37.799
* MASTER <-> SLAVE sync started
47960:S 16
Apr
12:05:37.799
*
Non blocking connect for SYNC fired the event.
47960:S 16
Apr
12:05:42.871
*
Master replied to PING, replication can continue...
47960:S 16
Apr
12:05:42.873
*Trying a partial resynchronization(request 2cf6338d2d3a72131d5f2f18a0bd8c271302e058:228189063173).
47960:S 16
Apr
12:05:43.085
*Full resync from master:2cf6338d2d3a72131d5f2f18a0bd8c271302e058:228814173990
47960:S 16
Apr
12:05:43.085
*
Discarding previously cached master state.
看字面意思就是主从连接断开了,从库尝试做增量同步还不成功,最后做了全量同步。 WTF???既然网络没问题,为什么连接断了。OK,引出主从问题
主从出现了频繁全量同步,如上面的日志显示,从库连接断开从连并尝试增量同步失败,结果做了全量同步。这个操作开销很大:主库bgsave->传到从库->从库加载rbd到内存(加载的时候是无法操作redis的)。出现这种情况又有几个原因。。。
replication backlog(master端):用于保存主从同步数据的一块内存缓冲区域(所有客户端共享该内存),达到限制将会重新进行全量同步,这部分内存会包含在used_memory_human中,设置值参考bgrewrite所需的内存RDB: 500 MB of memory used by copy-on-write
通过增大repl-backlog-size解决
replication buffer(master端):redis每个连接都分配了自己的缓冲区空间(从库也相当于是一个客户端连接)。处理完请求后,redis把响应数据放到缓冲区中,然后继续下一个请求。repl-buffer存放的数据是下面3个时间内所有master数据更新操作,设置值参考:每秒的命令产生大小*(以下3个时间之和) master执行rdb bgsave产生snapshot的时间 master发送rdb到slave网络传输时间 slave load rdb to memory 的时间
主要参数: client-output-buffer-limit normal client-output-buffer-limit slave client-output-buffer-limit pubsub
复制超时: repl-timeout
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。