本文参考书籍《redis设计与实现》
主要描述redis 2.8 以上的复制原理,因为在redis 2.8没有提供部分同步的功能(psync),所以当我们需要搭建redis主从时,需要使用2.8版本以上才能提高性能。
在redis中,用户可通过执行slave of 命令或者设置slave of选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器,而对主服务器进行复制的服务器则成为从服务器。
redis的复制功能分为同步与命令传播与心跳检测:
同步:即将从服务器的状态更新至主服务器的数据库状态
命令传播:即同步后,将redis主服务器所收到的每一条更新命令传递至从服务器
心跳监测:从服务器定时知会主服务器状态
完全同步过程
1.从发送psync命令
2.主收到命令后执行BGSAVE 命令存储快照,并使用一个缓冲区记录从当前时刻开始执行的所有更新命令
3.主将rdb文件传送给从,从进行备份
4.主将缓冲区的命令传递给从,从执行
部分同步
部分同步用户处理断线后重新复制的情况:当从服务器在断线后重新链接主服务器时,如果条件允许,主服务器可以将主从服务器链接断开期间执行的写命令发送给从服务器,从服务器只要接受并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态
其过程的表格如下:
部分重同步的实现由三个部分构成
主服务器的复制偏移量和从服务器的复制偏移量
主服务器的赋值积压缓冲区
服务器的运行id
重新链接时执行的逻辑
1.当从服务器断线后重新链接主服务器,首先会先判断再次链接时的主服务器是否是断线前的主服务器,如果是则进入2,否则进入4
2.判断主服务器的复制偏移量和从服务器的复制偏移量是否一致,一致则不做任何操作,否则进入3
3.判断偏移量的差是否大于赋值积压缓冲区的大小,如果超过了缓冲区的范围则进入4,否则主服务器将缓冲区里面的内容传递给从服务器
4.重新执行完全同步
心跳检测
在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令,主要有以下作用
检测主从服务器的网络链接状态
辅助实现min-slaves选项
检测命令丢失
解压源文件
tar -zxvf redis.tar.gz
将文件名重命名为redis-m,表示为主服务器
mv redis-3.0.7 redis-m
编译redis文件夹
cd redis-m;make && make install
修改主服务器配置文件,以下列出的只是与主从配置需要注意的配置文件项目
vim redis-m/redis.conf
daemonize yes #是否后台执行
pidfile /usr/local/redis-replication/redis-m/run/redis.pid #线程文件存放地址
port 10001 #端口
requirepass Link$2013 #配置链接时需要的密码
创建线程的存放文件夹
mddir -p redis-m/run
复制整份主服务器应用,命名为redis-s,作为从服务器
cp -ef redis-m redis-s
修改从服务器配置文件
vim redis-s/redis.conf
daemonize yes #是否后台执行
pidfile /usr/local/redis-replication/redis-s/run/redis.pid #线程文件存放地址
port 10002 #端口
requirepass Link$2013 #配置链接时需要的密码
slaveof 127.0.0.1 10001 #配置主服务器ip与端口
masterauth Link$2013 #配置链接主服务器时间需要的密码
分别启动redis-m,redis-s
/redis-m/src/redis-server /redis-m/redis.conf
/redis-s/src/redis-server /redis-s/redis.conf
使用redis-cli 链接看看主从情况
./redis-cli -p 10001 #进入到主服务器
127.0.0.1:10001> auth Link$2013
127.0.0.1:10001> info replication
会看到如下信息
# Replication
role:master #角色
connected_slaves:1 #从服务器
slave0:ip=127.0.0.1,port=10002,state=online,offset=967,lag=1 #上一次的心跳检测
master_repl_offset:967
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:966
如果在从服务器执行info replication 的话 会展示如下信息:
# Replication
role:slave
master_host:127.0.0.1
master_port:10001
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:1177
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
配置成功