Redis主从复制及其原理

为什么要有主从复制

为了避免服务的单点故障,通过给主从复制可以把数据复制多个副本放在不同的服务器上,拥有数据副本的服务器可以用于处理客户端的读请求,扩展整体的性能

Redis的主从复制搭建

准备3台机器,主服务器ip为192.168.1.50,从服务器ip为192.168.1.60,192.168.1.70,端口号均为6379
1.修改redis.conf配置文件

* 3台redis都设置为后台运行
  `daemonize yes`
* 2台从服务器添加(若命令行来复制的话,重启之后会无效)
 `slaveof 192.168.1.50 6379`    

2.启动3台redis
redis-server /opt/redis-3.0.7/redis.conf
3.客户端连接redis

./redis-cli 
127.0.0.1:6379> ping
PONG

4.使用info replication命令查看主从关系

192.168.1.50:6379> info replication
Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.60,port=6379,state=online,offset=823,lag=1
slave1:ip=192.168.1.70,port=6379,state=online,offset=837,lag=0
master_repl_offset:837
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:836

192.168.1.60:6379> info replication
Replication
role:slave
master_host:192.168.1.50
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:893
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

192.168.1.70:6379> info replication
Replication
role:slave
master_host:192.168.1.50
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:767
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

a.在主服务器中写入数据,然后可以在其他的从服务器中读取数据

192.168.1.50:6379> set test 'Hello World'
OK

192.168.1.60:6379> get test
"Hello World"

192.168.1.70:6379> get test
"Hello World"

b.从服务器中写入数据,会提示不能在只读的从服务器中写入数据

192.168.1.60:6379> set test2 hello
(error) READONLY You can't write against a read only slave.

主从复制原理

Redis的主从复制过程大体上分3个阶段:建立连接数据同步命令传播

建立连接

从服务器发出slaveof命令之后,根据主服务器的ip地址和端口建立连接

数据同步

在主从服务器建立连接确认各自身份之后,就开始数据同步,从服务器向主服务器发送PSYNC命令,执行同步操作,并把自己的数据库状态更新至主服务器的数据库状态
Redis的主从同步分为:

全量同步

有两种情况下是完整重同步,一是slave连接上master第一次复制的时候;二是如果当主从断线,重新连接复制的时候有可能是完整重同步
全量同步的步骤:

  • 从服务器连接主服务器,发送SYNC命令
  • 主服务器接收到SYNC命名后,开始执行bgsave命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
  • 主服务器bgsave执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令
  • 从服务器载入RDB文件,同步执行来自主服务器缓冲区的写命令
增量同步

用于网络中断等情况后的复制,只将中断期间主服务执行的写命令发送给从服务器
只能执行全量同步的情况:
1.当主从服务器offset的差距过大超过复制积压缓冲区长度时,将无法执行部分复制,只能执行全量同步
2.主从服务器初次复制时,主服务器将自己的runid发送给从服务器,从服务器将这个runid保存起来;当断线重连时,从服务器会将这个runid发送给主服务器;主服务器根据runid判断能否进行部分复制,如果不一致,只能执行全量同步

命令传播

当完成数据同步之后,主从服务器的数据暂时达到一致状态,当主服务器执行了客户端的写命令之后,主从的数据便不再一致。为了能够使主从服务器的数据保持一致性,主服务器会对从服务器执行命令传播操作,即每执行一个写命令就会向从服务器发送同样的写命令

你可能感兴趣的:(redis主从复制)