本机搭建注册步骤
在虚拟机中创建三个不同目录分别为7001,7002,7003
修改redis.conf
关闭AOF,开启RDB
#####切记一定要开启RDB持久化,关闭AOF
#save ""
appendonly no
将配置文件分别移动到创建目录
echo 7001 7002 7003 | xargs -t -n 1 cp /usr/local/src/redis-6.2.6/redis.conf
批量修改端口,和rdb备份目录
sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \tmp\/7001\//g' 7001/redis.conf
sed -i -e 's/6379/7002/g' -e 's/dir .\//dir \tmp\/7002\//g' 7002/redis.conf
sed -i -e 's/6379/7003/g' -e 's/dir .\//dir \tmp\/7003\//g' 7003/redis.conf
修改redis 实例对应ip地址
sed -i '1a replica-announce-ip 192.168.149.138' 7001/redis.conf
sed -i '1a replica-announce-ip 192.168.149.138' 7002/redis.conf
sed -i '1a replica-announce-ip 192.168.149.138' 7003/redis.conf
主从同步的逻辑
从节点的redis.conf 配置文件中指定主节点 redis5.0 之前叫:
#redis5.0之前
slaveof <masterip> <masterport>
#5.0及其以后
replicaof <masterip> <masterport>
临时生效的方案:redis-cli 连接上从节点,然后执行命令
replicaof <masterip> <masterport>
info replication命令 查看集群信息
关键术语:
Replication Id :简称replid,数据集标记,id一直说明是同一数据集,每个master都有一个唯一的replid,slave会保存master节点的replid.
offset:偏移量,随着记录在repl_backlog中的数据增多而逐渐增大,当slave完成同步时会记录当前同步的offset,从而标记同步的位置,当slave的offset小于master的offset时,表示从节点的数据需要更新。因次从节点每次同步数据的时候需要将replid 和自己的offset送给master节点,当上送的replid与master节点的replid不一致时说明是第一次同步,需要全量同步
同步逻辑:
1:执行replicaof命令之后,slave请求同步数据,psync replid offset
2:主节点判断从节点请求的replid是否和自己的一致,不一致则是第一次同步,将master的replid和offset返回给从slave,slave保存版本信息。
3:master执行bgsave命令,生成RDB文件,并将RDB文件发送给从节点
4:从节点清除本地数据,加载RDB文件
5:执行bgsave时,主节点如果有新的写命令,主节点会将这些命令记录到repl_baklog缓冲区中
然后将缓冲区(repl_baklog)的数据发送给slave节点,从节点执行命令,从而保证RDB期间的指令得到同步。
当一个从节点第一次请求主节点是全量同步数据(全量同步比较耗时,消耗cpu,因为要将RDB文件发送给slave,有磁盘io和网络io),后续就增量同步
增量同步:
savle发送offset,master直接从repl_baklog中获取offset之后的数据发送给slave,不需要生成和传输RDB文件
提高同步速度:
主从集群的优化:
主节点修改redis.conf文件的:repl-diskless-sync no 改为yes,启用无磁盘复制,减少一次磁盘读写,直接将数据写到网络中传输给slave(改方案的前提是我们的网络带宽要够大,不然会造成网络拥堵)
Redis单节点的内存不要占用过大,防止RDB文件过大,全部同步较慢
修改主节点中的repl_baklog (repl-backlog-size 1mb 默认为1m)大小,防止未同步的数据被覆盖而进行全量同步,发现slave宕机之后尽快恢复
限制一个master的从节点数量,避免同步数据给主节点带来过大压力,如果节点过多可以采用“主-从-从”的链式结构