redis主从复制原理
当启动一个slave node的时候,它会发一个PSYNC命令给master node。
如果这是slave node初次连接到master node ,那就会触发一次full resynchronization 全量复制。此时master会启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端client新接收到的所有命令缓存在内存中。RDB文件生成完毕后,master会将这个RDB发送给slave,slave会先写入本地磁盘,然后在从本地磁盘加载到内存中,接着master会将内存中缓存的写命令发送到slave,slave也会同步这些数据。slave node如果跟master node有网络故障,断开了连接,会自动重连,连接之后master node仅会复制给slave部分缺少的数据
复制的完整流程
slave node启动时,会在自己本地保存master node的信息,包括master node的host和ip,但是复制流程没开始。slave node内部有一个定时任务,每秒检查是否有新的master node 要连接和复制,如果发现,就跟master node 建立socket网络连接,然后slave node 发送ping 命令给 master node 。如果master设置了requirepass,那么slave node 必须发送masterauth的口令过去进行认证。master node第一次执行全量复制,将所有数据发送给slave node。而在后续master node 持续将写命令,异步复制给save node。
redis主从架构的实现(命令方式)
- 创建两个redis的服务实例 主服务器(6666)从服务器(7777)
- 进入从服务器(7777)执行命令设置主服务器的ip、port
- ./src/redis-cli -p 7777 命令:slaveof 127.0.0.1 6666
- 检查是否配置成功 info replication
- 从服务器的配置 slaveof 主节点的ip、端口
- slave-read-only yes 从节点设置为只读
redis哨兵原理
- 哨兵至少需要3个实例,来保证自己的健壮性
- 哨兵+redis主从的部署架构,是不会保证数据零丢失的,只能保证redis的高可用性
- 对于哨兵+redis主从这种复杂的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练
上述摘自中华石衫面试突击训练第一季(https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-sentinel.md)
哨兵的实现
- 准备3台redis服务器(实现一主两从)
- 6666(主服务器) 7777(从服务器) 8888(从服务器)
- 配置文件
- sentinel对应的配置文件信息
- 3台sentinel 26379 26380 26381