集群
【Redis学习笔记-集群-主从复制】结构上:单台redis会发生单点故障,同时需要承受所有请求。
容量上:单台redis内存有限,容易出现存储瓶颈,需要进行数据分片。
复制 数据库分类:
- 主数据库:可读可写,数据变化时会自动将数据同步给从数据库
- 从数据库:只读,接收主数据库同步来的数据
# --port 指定redis端口
# --slaveof 指定主数据库的ip和端口
$ redis-server --port 6380 --slaveof 127.0.0.1 6379
# 查看集群信息
> INFO replication
# 运行时修改主数据库
> SLAVEOF 127.0.0.1 6379
# 从数据库转换成主数据库
> SLAVEOF NO ONE# redis.conf
# 配置从数据库可写
slave-read-only no
# 集群同步过程中,默认情况下,从数据库会用同步前的数据对客户端响应,但也可以配置其阻塞
slave-serve-stale-data no# 乐观复制策略的配置项
# 允许从数据库最长失去连接的时间(默认注释的配置)
min-slaves-max-log 10
# 仅当在线的从数据库达到的配置的数量后,主数据库才可写(默认注释的配置)
min-slaves-to-write 3# 增量复制的配置项
# 积压队列大小
repl-backlog-size
# 所有从数据库与主数据库断开连接后,经过多长时间释放积压队列的内存空间
repl-backlog-ttl
原理 复制初始化:
- 从数据库启动后,会向主数据库发送SYNC命令
- 主数据库接收到SYNC后,在后台保存快照(RDB持久化),并将快照保存过程中接收到的命令缓存起来
- 快照完成后,主数据库将快照和缓存的命令发给从数据库
- 从数据库接收到快照和命令后,载入快照并执行缓存命令
- 初始化结束后,主数据库执行的任何改变数据的命令都会异步发给从数据库
- 容忍一定时间内主从数据库的数据差异,但最终的数据是一致的
- 2.6版本及之前的版本,无论数据差异多大,都会做复制初始化,效率低
- 2.8版本及之后的版本,增加了
增量复制
,大大提高了效率
- 实现前提
- redis每次启动都会生成一个新的运行ID
- 复制同步阶段,主数据库每次同步命令给从数据库,都会将命令放入一个积压队列中,并记录当前积压队列中存放的命令的偏移量范围
- 从数据库接收到主数据库传来的命令时,会记录该命令的偏移量
- 增量复制过程:
- 主数据库会判断从数据库发来的运行ID是否和自己的运行ID相同
- 判断从数据库最后同步成功的偏移量是否在积压队列中,如果在则可以执行增量复制,将积压队列中的命令发给从数据库,否则,只能执行全量复制
- 在从数据库中使用 SLAVEOF NO ONE 命令将从数据库提升成主数据库继续服务
- 启动之前崩溃的主数据库,然后使用 SLAVEOF 命令将其设置成新的主数据库的从数据库,即可将数据同步回来
附录
# 积压队列大小计算方式
估计主从数据库断线的时间中主数据可能执行的命令的大小
参考 本文参考自李子骅老师的《Redis 入门指南》
推荐阅读
- Redis|redis原理之布隆过滤器(Bloom Filter)
- redis安装与基本使用
- java|图解四种 IO 模型
- Redis|Redis性能解析--Redis为什么那么快()
- java|你跳一次涨多少(今天见识到跳槽天花板!!)
- java|送你一份大厂都这么解决Redis缓存问题,面试官必问!
- (免费领取红包封面)【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
- redis优化(bigkey、hotkey)
- redis高可用(主从、哨兵、集群)
- 【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知