Redis-Cluster无中心架构

redis是单线程(对命令的处理和连接的处理都是在一个线程中),如果有慢查询的话,会阻塞住之后的操作
由于Redis的单线程模型,理论上每个redis实例只会用到一个CPU, 也就是说可以在一台多核的服务器上部署多个实例(实际就是这么做的)。
但是Redis的AOF重写是通过fork出一个Redis进程来实现的,所以有经验的Redis开发和运维人员会告诉你,在一台服务器上要预留一半的内存(防止出现AOF重写集中发生,出现swap和OOM)。

Redis-Cluster主从节点不要在同一个机器部署
Redis-Cluster是无中心的架构,判断节点失败是通过仲裁的方式来进行(gossip和raft),也就是大部分节点认为一个节点挂掉了,就会做fail判定。
如果某个节点在执行比较重的操作(flushall, slaveof等等)(可能短时间redis客户端连接会阻塞(redis单线程))或者由于网络原因,造成其他节点认为它挂掉了,会做fail判定。
Redis-Cluster提供了cluster-node-timeout这个参数(默认15秒),作为fail依据(如果超过15秒还是没反应,就认为是挂掉了)

AOF

本地持久化
是Redis的提供的一种持久化方式,它会将所有的写命令按照一定频率(no, always, every seconds)写入到日志文件中,当Redis停机重启后恢复数据库。
最终目标是一台机器一个时刻,只有一个redis实例进行AOF重写。
对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积
(1) 自动:让每个redis决定是否做AOF重写操作(根据auto-aof-rewrite-percentage和auto-aof-rewrite-min-size两个参数)
(2) crontab: 定时任务,可能仍然会出现多个redis实例
(3) remote集中式:以机器为单位,轮询每个机器的实例,如果满足条件就运行

AOF重写

(1) 随着AOF文件越来越大,里面会有大部分是重复命令或者可以合并的命令(100次incr = set key 100)
(2) 重写的好处:减少AOF日志尺寸,减少内存占用,加快数据库恢复时间。

RDB

在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
每次保存 RDB 的时候,Redis 都要 fork() 出一个子进程,并由子进程来进行实际的持久化工作。
在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb 的二进制文件中。
你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。你也可以通过调用 SAVE 或者 BGSAVE , 手动让 Redis 进行数据集保存操作。

redis内存占用飙升

redis-cluster某个分片内存飙升,明显比其他分片高很多,而且持续增长。并且主从的内存使用量并不一致。
存在个别大的key-value: 例如一个包含了几百万数据set数据结构(这个有可能)
主从复制出现了问题。
其他原因。
输出缓冲区占用内存较大,也就是有大量的数据从Redis服务器向某些客户端输出。(monitor命令的进程)

posted @ 2019-09-11 17:22  yueyuef  阅读(586)  评论(0编辑  收藏  举报