为什么要有主从复制
为了防止服务的单点故障,通过给主从复制能够把数据复制多个正本放在不同的服务器上,领有数据正本的服务器能够用于解决客户端的读申请,扩大整体的性能
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 台 redisredis-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 判断是否进行局部复制,如果不统一,只能执行全量同步
命令流传
当实现数据同步之后,主从服务器的数据临时达到统一状态,当主服务器执行了客户端的写命令之后,主从的数据便不再统一。为了可能使主从服务器的数据放弃一致性,主服务器会对从服务器执行命令流传操作,即每执行一个写命令就会向从服务器发送同样的写命令