
Redis
数据类型
String
-
SDS
-
embstr
- <=44byte
-
raw
-
44byte
-
-
int
- =8byte
-
-
每次扩容1倍
-
超过1M时每次扩容1M
List
- quicklist
- ziplist
Hash
-
hashtable
-
ziplist
-
filed个数不超过512
hash-max-ziplist-entries
-
value不大于64字节
hash-max-ziplist-value
-
遍历肯能差点,但是filed少的情况下问题不大
-
Set
-
hashtable
-
inset
- 只能存int
zset
- skiplist
- ziplist
集群(Cluster)
集群实现
-
哈希槽 16384
- CRC16算法
-
hashtag
容错
-
master
- 存储数据
- 节点状态
- solts和node的对应关系
- node id 不变
- 自动识别ip和port的变化
- Gossip 协议
-
save
-
节点失效检测
-
从节点选举
-
弱一致性
分布式
-
线性拓展
-
数据弱一致性
- master和save异步复制
- 网络分区
-
可用性
- replicas migration提高可用性
哨兵(Sentinel)
功能
- 监控
- 提醒
- 故障转移
主观下线SDOWN
Sentinel 实例对服务器做出的下线判断。
如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply), 那么 Sentinel 就会将这个服务器标记为主观下线。
客观下线ODOWN
指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。
- 只适用于主服务器
自动发现
和master建立两个连接__sentinel__:hello订阅频道
-
每10s会向master和save发送INFO命令,主要用于发现save和其他的sentinel
通过master发现save,和监控master的其他sentinel。
-
每2s向master和save的__sentinel__:hello发送自己的信息,主要用于发现新加入的sentinel
-
每1s向master、slave以及其他Sentinel发送PING命令
故障转移
-
发现master主观下线
-
发送is-master-down-by-addr命令判断是否客观下线
-
领头哨兵选取
-
Raft算法
-
领导选取
-
Leader
-
Follower
- 随机超时时间
-
Canidate
- 随机超时时间短的将发起投票
- 票数一样,触发重新选举
-
-
日志复制
- 心跳
-
安全性
- 拥有最新的log entry的follwer才有资格成为leader
-
日志压缩
-
-
-
故障恢复
- 标记为主观下线、已断线、或者最后一次回复 PING 命令的时间大于五秒钟的save服务器都会被淘汰
- 与失效master服务器连接断开的时长超过 down-after 选项指定的时长十倍的从服务器都会被淘汰
- 选出复制偏移量最大的作为master
- 复制偏移量相同,选择runid小的
持久化
持久化方式
-
RDB
-
触发原理
-
命令触发
-
save
-
bgsave
-
fork子进程处理
主进程和子进程共享内存快照,主进程可写,子进程只读。
-
copy-on-write
-
-
-
配置触发
-
save m n
m秒内有n个键发生变化执行快照
-
-
主从同步,全量触发
-
FLUSHALL
清空数据库
-
shutdown
-
故障恢复
-
-
优缺点
-
优点
- 数据为二进制,紧凑
- 故障恢复快
-
缺点
- fork进程需要复制数据,大数据集耗时比较长
- 可能导致数据丢失
-
-
-
AOF
-
触发原理
-
1.追加写入
写到内核缓冲区 AOF_BUF
-
2.刷新到磁盘
-
no
不使用fsync,交给内核刷新
-
always
每次都使用fsync函数刷新
-
everysec
-
-
3.重写AOF
主进程fork子进程 子进程进行AOF日志重写 新命令写到临时缓冲区 AOF日志重写完成后替代就旧的AOF日志 追加临时缓冲区日志到AOF文件
- fork子进程
- copy-on-write
-
-
优缺点
-
优点
- 数据安全性高
-
缺点
- fsync函数可能比较慢
-
-
-
混合持久化
-
持久化方案选择
-
master关闭持久化
fork函数复制内存数据比较耗费CPU性能,影响Redis命令的读写。
-
save开始RDB持久化
AOF的fsync函数实际上也是比较耗费性能的。
-
master关闭自动重启
-
可以容忍短暂的数据不一致
-
持久化相关命令
-
CONFIG GET
- dbfilename
持久化文件名
-
dir
持久化文件目录
-
logfile
日志目录
-
info Persistence
持久化信息
内存回收
LRU算法
-
淘汰策略
-
allkeys
- lru
- random
-
volatile
- lru
- random
- ttl
-
noeviction
-
过期淘汰策略
- 惰性删除
- 定时删除
- 定期删除
分布式锁
主从复制
复制原理
-
1.连接建立
通过saveof ip port和mater建立连接 save向master发送ping命令,检查master是否可用,如果可用返回pong。否则,重试。
-
2.数据同步
- 全量复制
- 增量复制
-
3.命令传播
save每秒向master汇报复制偏移量,master对比复制偏移量向save同步。
核心概念
- replication id
- psync命令
- 复制的积压缓冲区
- 复制偏移量
如何处理过期的key
- save不处理过期key
什么情况下会进行全量复制
- 初次进行复制
- svave的复制偏移量已经不在master的积压缓冲区内
- 发生故障转移后,replication id不同