redis主从复制原理
redis主从复制分为全量同步和增量同步,首次同步是全量同步,主从同步可以让从服务器从主服务器备份数据, 而且从服务还可以作为其他从节点提供数据同步,redis的主从同步是非阻塞的,redis master收到slave服务器的sync命令会fork一个子进程在后台执行bgsave命令,并将新写入的数据写入到一个缓存区里,bgsave执行完成之后并将生成的RDB文件发送给slave,slave将收到的RDB载入自己的内存,然后redis master将自己缓存区中的内容在全部发送给slave,之后的同步slave服务器会发送一个offset的位置(类似于mysql的binlog位置)给redis master, 主服务器检查后位置没有错误,将此位置之后的数据包括写在缓冲区的积压数据发送redis slave,slave将主服务器发送的积压数据写入内存,这样一次完整的数据同步就完成了。之后在同步的时候slave只要发送当前的offset位置给mater,然后master根据响应的位置将之后的数据发送给slave保存到期内存中。
redis全量复制一般发生在slave初始化阶段,这时slave需要将master节点上的所有数据都复制一份。过程如下:
1)slave服务器连接master服务器,发送SYNC命令;
2)master节点接收到SYNC命令后,fork一个字进程开始执行BGSAVE命令生产RDB快照文件并使用缓冲区记录被执行的写命令。
3)master服务器BGSAVE执行完成后,向所有slave服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)slave节点收到RDB快照文件后丢弃当前节点所有旧数据,载入收到的RDB快照文件。
5)master快照发送完成后开始向slave节点发送缓冲区中的写命令。
6)slave节点完成快照的载入,开始接收命令请求,并执行来自master缓冲区的写命令。
7)后期同步会先发送自己slave_repl_offset位置,只同步新增加的数据,不在全量同步。
192.168.2.239 redis master sentinel s1
192.168.2.240 redis slave1 sentinel s2
192.168.2.241 redis slave2 sentinel s3
1、配置redis主
vim /data/app/redis/etc/redis.conf
requirepass password
bind 192.168.2.239
loggile "/data/app/redis/logs/redis.log"
replicaof 192.168.2.239 6379
masterauth <master-password>
2、配置redis从(多个从节点配置方法相同)
vim /data/app/redis/etc/redis.conf
requirepass password
bind 192.168.2.240
replicaof 192.168.2.239 6379
masterauth <master-password>
loggile "/data/app/redis/logs/redis.log"
登录从节点redis查看slave状态
redis-cli -h 192.168.2.240 -p 6379 -a password
INOF Replication
image.png
image.png
3、验证主从数据同步
redis master添加数据
![image.png](https://img.haomeiwen.com/i10958113/ce0ead53dee81d69.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
redis slave查看数据同步情况
image.png
image.png
集群搭建后添加数据提示“没有分配槽”错误修复方法
image.png
redis-cli --cluster fix 192.168.2.239:6379 -a password
注意事项:
不同版本的redis之间存在兼容性问题,在搭建redis集群时各节点的redis版本必须保持一致。
基于sentinel(哨兵)搭建redis高可用集群
sentinel进程是用于监控redis集群中master服务的工作状态,在master服务发生故障时,可以实现master和slave服务器角色的切换,以此保证redis服务的高可用。
sentinel是一个分布式系统,可以在一个机构中运行多个sentinel进程,该进程使用流言协议(gossip protocols)来接收关于master是否在下线的消息,如果master下线则使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个slave作为新的master。集群中的每个sentinel进程会向其他的sentinel、master、slave定时发送消息,已确认对方是否存活,如果发现对方在指定配置时间内未得到响应,则暂时任务对方已下线,这就是所谓的“主观认为宕机”。
主观是每个成员都具有的独自的而且可能相同也可能不同的意识(subjective sown)简称SDOWN。
当sentinel集群中多数sentinel进程在对master主服务器做出down的判断,并且通过sentinel is-master-down-by-addr命令互相交流之后,得出的master server下线判断,这种方式就是“客观宕机”,客观是不依赖与某种意识而已经实际存在的一切事物(objectively down)简称ODOWN。
通过一定的vote算法,从剩下的slave从服务器节点中,选取一台提升为master,然后自动修改redis.conf sentinel.conf的相关配置,并开启故障转移。
当故障的redis master恢复后sentinel会将其作为slave角色加入集群中。
使用已搭建好的redis主从架构
1、192.168.2.239 redis主,sentinel server1配置
将源码目录下的sentinel配置文件复制redis程序目录的etc目录下
cp sentinel.conf /data/app/redis/etc/
修改sentinel配置文件
vim /data/app/redis/etc/sentinel.conf
bind 0.0.0.0
port 26379
daemonize yes
pidfile /data/app/redis/run/redis-sentinel.pid
logfile "/data/app/redis/logs/sentinel.log"
dir /data/app/redis
#法定人数限制(quorum),即有几个slave认为master down了就进行故障转移
sentinel monitor mymaster 192.168.2.239 6379 2
sentinel auth-pass mymaster 123456
#(SDOWN)主观下线的时间
sentinel down-after-milliseconds mymaster 30000
#发送故障转移同时向新master同步数据的slave数量,数字越小同步时间越长
sentinel parallel-syncs mymaster 1
#所有的slave指向新的master所需的超时时间
sentinel failover-timeout mymaster 180000
#禁止修改脚本
sentinel deny-scripts-reconfig yes
2、192.168.2.240 redis slave1,sentinel server2配置
vim /data/app/redis/etc/sentinel.conf
bind 192.168.2.240
port 26379
daemonize yes
pidfile /data/app/redis/run/redis-sentinel.pid
logfile "/data/app/redis/logs/sentinel.log"
dir /data/app/redis
#法定人数限制(quorum),即有几个slave认为master down了就进行故障转移
sentinel monitor mymaster 192.168.2.239 6379 2
sentinel auth-pass mymaster 123456
#禁止修改脚本
sentinel deny-scripts-reconfig yes
3、192.168.2.241 redis slave2,sentinel server2配置
vim /data/app/redis/etc/sentinel.conf
bind 192.168.2.241
port 26379
daemonize yes
pidfile /data/app/redis/run/redis-sentinel.pid
logfile "/data/app/redis/logs/sentinel.log"
dir /data/app/redis
#法定人数限制(quorum),即有几个slave认为master down了就进行故障转移
sentinel monitor mymaster 192.168.2.239 6379 2
sentinel auth-pass mymaster 123456
#禁止修改脚本
sentinel deny-scripts-reconfig yes
4、在所有节点上启动sentinel服务
/data/app/redis/bin/redis-sentinel /data/app/redis/etc/sentinel.conf
查看sentinel server1的日志
image.png
5、查看sentinel状态,停止redis master测试故障转移
redis-cli -h 192.168.2.239 -p 26379
image.png
停止redis master服务,查看集群信息
systemctl stop redis
查看sentinel日志,redis master由192.168.2.239切换为192.168.2.240
image.png
查看192.168.2.240角色状态和日志,240节点由redis slave切换至master
redis-cli -h 192.168.2.240 -p 6379
image.png
image.png
(切换的过程中sentinel会修改redis.conf sentinel.conf配置文件)
网友评论