如何主从复制
向redis服务器发送下面的命令
127.0.0.1:12345> slaveof 127.0.0.1:6379
那么127.0.0.1:12345将成为127.0.0.1:6379的从服务器,也就是说127.0.0.1:6379是127.0.0.1:12345的主服务器。
redis和mysql一样,也是异步复制。
redis 2.8之前得复制功能
- 复制方式
- 同步(sync)
从服务器启动时执行同步操作。 - 命令传播(command propagate)
主服务器有操作命令时会广播给从服务器;然后从服务器在本地执行操作命令。
- 同步
-
主从服务器断开后的恢复
redis 2.8以后恢复功能
psync代替了sync命令来执行复制时的同步操作。
- sync的同步模式
- 完整重同步
用于初次复制情况,跟sync命令执行步骤一样。 - 部分重同步
用于断线后重复制情况。
- 部分重同步的实现方式
- 复制偏移量
主从服务器都会维护一个复制偏移量。主服务器每次向从服务器传播N个字节数据时,就将自己的复制偏移量的值加上N;从服务器每次收到主服务器传播来的N个字节的数据库,就将自己的复制偏移量的值加上N。
- 复制偏移量
复制积压缓冲区
积压缓存区是主服务器维护的一个固定长度先进先出队列,默认大小为1M。当主服务器进行命令传播时,它不仅会将写命令发送给所有的服务器,还会将命令入队复制到积压缓冲区,复制缓冲区会记录每个字节相应的复制偏移量。
假如从服务器的offset在积压缓冲区中,就执行部分重同步;假如offset不在积压缓冲区中,则进行完整重同步。
复制积压缓冲区的大小= 从服务器恢复的秒数 * 每秒钟写的字节数大小服务器运行ID
每个redis服务器都有会自己的运行ID,运行ID在服务器启动时自动生成,由40个随机的16进制字符组成。当从服务器对主服务器进行初次复制时,主服务器会把自己的运行ID传送给从服务器,从服务器则会把主服务器ID存储下来。短线重连时,会根据主运行ID来判断主服务器是不是变化了,不变化就继续执行部分重同步;变化了则进行完整重同步。