搭建主从架构
单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。
5之前叫slave,之后叫replica好像
共包含三个节点,一个主节点,两个从节点。
这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下:
准备实例和配置
(1)创建目录
# 进入/tmp目录
cd /tmp
# 创建目录
mkdir 7001 7002 7003
(2)恢复原始配置
# 开启RDB
# save ""
save 3600 1
save 300 100
save 60 10000# 关闭AOF
appendonly no
这些都是默认的,如果你之前改过,需要改回来,在redis.conf中
(3)拷贝配置文件到每个实例目录
echo 7001 7002 7003 | xargs -t -n 1 cp redis-6.2.4/redis.conf
redis.conf目录你需要用你自己的
假设有A、B两个Redis实例,如何让B作为A的slave节点?
在B节点执行命令:slaveof A的IP A的port,如果主节点有密码的话需要加上密码
主从数据同步原理
master如何判断slave是不是第一次来同步数据?这里会用到两个很重要的概念:
Replication Id:
简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid
offset:
偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。
因此slave做数据同步,必须向master声明自己的replication id 和offset,master才可以判断到底需要同步哪些数据
简述全量同步的流程?
slave节点请求增量同步
master节点判断replid,发现不一致,拒绝增量同步
master将完整内存数据生成RDB,发送RDB到slave
slave清空本地数据,加载master的RDB
master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave
slave执行接收到的命令,保持与master之间的同步
主从第一次同步是全量同步 但如果slave重启后同步,则执行增量同步
repl_baklog大小有上限,写满后会覆盖最早的数据。如果slave断开时间过久,导致尚未备份的数据被覆盖,则无法基于log做增量同步,只能再次全量同步。
优化方案
在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。
Redis单节点上的内存占用不要太大,减少RDB导致的过多磁盘IO
适当提高repl_baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力
总结
简述全量同步和增量同步区别?
全量同步:
master将完整内存数据生成RDB,发送RDB到slave。
后续命令则记录在repl_baklog,逐个发送给slave。
增量同步:
slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave
什么时候执行全量同步?
slave节点第一次连接master节点时
slave节点断开时间太久,repl_baklog中的offset已经被覆盖时
什么时候执行增量同步?
slave节点断开又恢复,并且在repl_baklog中能找到offset时
思考
slave节点宕机恢复后可以找master节点同步数据,那master节点宕机怎么办?
提示(Redis哨兵),下集再说