1. 持久化
RDB(快照):
- 按一定规则(定时+修改量)进行备份 - 推荐使用独立的机械磁盘,因为是顺序写的
- 存在 丢失最后一份 数据的情况,会生成一个临时文件
- 从主进程fork一个子进程(copy-on-write)来独立备份临时文件,备份完成后压缩,再替换原有的文件
- 当开始dump rdb的时候, 如果cpu资源很紧张可能影响线上功能, 不在 master 上做快照, 由 slave replica 来做快照.
AOP(增量):
- 记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录(可以选择不同的同步策略)
- 当aof文件大于一个值的时候会rewrite, 主线程
fork
一个 带有副本的子线程 - 主线程在rewrite期间的写操作会同时保存在内存的aof buffer 和 aof rewrite buffer中,当子线程rewrite成功后, 向主线程发送一个 SIGTERM 信号, 主线程 block 住将
aof rewrite buffer
中的数据flush 到新的aof临时文件,将临时文件会代替AOF文件
2. 支持类型
- string (int/embstr/raw)
- list (ziplist/linkedlist)
- hash (hashtable/ziplist)
- set(无序) (hashtable/intset)
- zset(有序) (skiplist/ziplist) 通过double分数来排序
3. 单线程为什么快
- 操作基本都是基于内存,不消耗cpu,速度够快,不需要多进程
- 采用多路复用非阻塞I/O方式, 监听多个链接
- 内部采用
reactor模式
, 事件驱动 -
I/O多路复用处理器
会将产生事件的套接字入队列,文件事件分派器
会读队列, 将事件分配给对应的处理器
- 内部采用
- 单线程, 减少了上下文切换损耗
4. redis集群方案
4.1 主从复制
主master写,从slave读
初始化时,slave放松syn给master,master将快照传递给slave,slave加载
非初始化,每次master写都会sync给slave
4.2 哨兵
4.3 集群
- 自动将数据进行分片(slot),每个master上放一部分数据
- 提供内置的高可用支持,部分master不可用时,还是可以继续工作的
- 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽
现在要将Master A节点中编号为1、2、3的slot迁移到Master B节点中,在slot迁移的中间状态下,slot 1、2、3在Master A节点的状态表现为MIGRATING
(迁移),在Master B节点的状态表现为IMPORTING
(入口) - 而迁移过程中(不刷新node-slot的映射关系),还是有A节点提供服务,直到slot迁移完成
- 将A节点 键值空间dump下来
- 在B节点 将dump文件restore
- 将A节点 键值空间删除
- 刷新node映射关系
网友评论