前言
Redis:Remote Dictionary Server,redis是一个基于内存同时具备数据持久化能力的高性能、低时延的K/V数据库,value的数据结构可以是string、hash表、list(列表)、set(集合)、sortedset(有序集合)。
特点:
- 单线程异步架构(单线程收包、发包、解析、执行、多路io复用接收文件事件)
- 支持事务,操作是原子性,要么全部提交,要么全部不提交。
**适用于:**缓存、消息队列、会话存储、TTL过去等应用场景。
缓存场景
键值对场景(数据存储在内存)
Redis迁移原理
离线迁移原理(持久化机制)
AOF
AOF 以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到AOF文件,以此达到记录数据库状态的目的。
同步命令到AOF文件的整个过程:
- 命令传播:Redis将执行完的命令、命令的参数、命令的参数个数等信息发送到AOF程序中。
- 缓存追加:AOF程序根据接收到的命令数据,将命令转换为网络通讯协议的格式,然后将协议内容追加到服务器的AOF缓存中。
- 文件写入和保存:AOF缓存中的内容被写入到AOF文件末尾,如果设定的AOF保存条件被满足的话,fsync函数或者fdatasync函数会被调用,将写入的内容真正地保存到磁盘中。
三种AOF保存模式:
- AOF_FSYNC_NO: 不保存。
- AOF_FSYNC_EVERYSEC: 每一秒钟保存一次。
- AOF_FSYNC_ALWAYS: 每执行一个命令保存一次。
配置AOF
vim 6386.conf
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
dir /usr/local/src/redis-cluster/6386/
# 指定该文件,重启server生效
[root@k8s-node01 6386]# ls
6386.conf appendonly.aof dump.rdb
RDB
RDB 将当前进程中的数据生成快照(snapshot)以二进制的方式保存到磁盘中,保存的文件后缀是rdb。当Redis重新启动时,可以读取快照文件恢复数据。
在线迁移原理
PSYNC
三个重要概念:
- Runid: 每个Redis服务器都会有一个表明自己身份的ID。在PSYNC中发送的这个ID是指之前连接的Master的ID,如果没保存这个ID,PSYNC的命令会使用“PSYNC?-1”这种形式发送给Master,表示需要全量复制。
- Offset(复制偏移量): 在主从复制的Master和Slave双方都会各自维持一个offset,Master成功发送N个字节的命令后会将master的offset加上N,slave在接收到N个字节命令后同样会将Slave的offset增加N。Master和Salve如果状态是 一致的,那么他的offset也应该是一致的。
- 复制积压缓冲区: 复制积压缓冲区是由Master维护的一个固定长度的FIFO队列,它的作用是缓存已经传播出去的命令。当Master进行命令传播时,不仅将命令发送给所有的Slave,还会将命令写入到复制积压缓冲区里面。
同步流程:
- 发送 psync 命令(spync? -1);
- 主节点根据命令返回 FULLRESYNC;
- 从主节点记录主节点 ID 和 offset;
- 主节点 bgsave 并保存 RDB 到本地;
- 主节点发送 RDB 文件到 从节点;
- 从节点收到 RDB 文件并加载到内存中;
- 主节点在节点接受数据的期间,将新数据保存到“复制客户端缓冲区”,当从节点加载 RDB 完毕,再发送过去。(如果从节点花费时间过长,将导致缓冲区溢出,最后全量同步失败)
bgsave的使用(手动触发):
[root@k8s-node01 6386]# /usr/local/src/redis-5.0.8/src/redis-cli -c -p 6386
127.0.0.1:6386> BGSAVE
Background saving started
127.0.0.1:6386> quit
[root@k8s-node01 6386]# ls
6386.conf dump.rdb
save的使用(手动触发)(不推荐):
[root@k8s-node01 6386]# /usr/local/src/redis-5.0.8/src/redis-cli -c -p 6386
127.0.0.1:6386> set dfq duanfuqiang1
OK
127.0.0.1:6386> get dfq
"duanfuqiang1"
127.0.0.1:6386> save
OK
127.0.0.1:6386> quit
[root@k8s-node01 6386]# ls
6386.conf dump.rdb
[root@k8s-node01 6386]# cat dump.rdb
REDIS0009 redis-ver5.0.8
save的使用(自动触发)(不推荐):
vim 6386.conf
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
appendfsync everysec
dir /usr/local/src/redis-cluster/6386/
SCAN
Redis的部分在线全量同步工具使用SCAN原理,SCAN可以做到遍历Redis中的数据,但是不能做到对增量数据的处理,所以只能用于全量同步。
迁移(回退)流程
阶段一:准备数据同步
阶段二:业务停止写入
阶段三:停止迁移任务
阶段四:切换业务访问
回退阶段一:业务停止写入
回退阶段二:停止数据同步
回退阶段三:业务回切