主从复制

  • 建立配置
  • 断开主从复制
  • 只读
  • 复制过程的原理


在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis副本。

建立配置

参与复制的Redis实例划分为主节点(master)和从节点(slave)。默认情况下, Redis都是主节点。每个从节点只能有一个主节点,而主节点可以同时具有多个从节点。复制的数据流是单向的,只能由主节点复制到从节点。

配置复制的方式有以下三种:
1.在配置文件中加入replicaof (masterHost) (masterPort)随Redis启动生效。
2.在redis-server启动命令后加入–replicaof (masterHost} (asterPort)生效。
3.直接使用命令:relicaof (masterHost) (masterPort)生效。

例如:
1、

[root@redis ~]# vim /usr/local/redis/redis.conf
replicaof 192.168.1.70 6379

2、

[root@redis ~]# redis-server /usr/local/redis/redis.conf --slaveof 192.168.1.70 6379

3、

127.0.0.1:6379> SLAVEOF 192.168.1.75 6379

验证:

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello   //从查看
"world"

Slaveof节点只保留主节点的信息,然后返回复制流程,以异步方式执行 Info replication

127.0.0.1:6379> info replication  //主节点查看
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.75,port=6379,state=online,offset=70,lag=1
master_replid:ed8d7f58ca00c3c200af689d8229e9200fdc10a3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:70
127.0.0.1:6379> info replication  //从节点查看
# Replication
role:slave
master_host:192.168.1.70
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:ed8d7f58ca00c3c200af689d8229e9200fdc10a3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14

在主从数据不同步的情况下,主创建数据不会同步成功
需要把主的dump.rdb传到从(dump.rdb是上一章redis持久化)

[root@redis ~]# scp /data/redis/dump.rdb 192.168.1.75:/data/redis/

断开主从复制

Slaveof命令不但可以建立复制,还可以从节点执行slaveof no one断开与主节点的复制关系

127.0.0.1:6379> SLAVEOF no one

断开复制主要流程:
1、断开与主节点复制关系
2、从节点晋升为主节点从节点断开复制后并不会抛弃原有数据,只是无法在获取主节点上的数据变化。

通过slaveof命令还可以切主
切主就是slaveof no one断开主从复制,现在就是双主;
在原主执行slaveof ip(要切换的主的IP) 端口号
就切换成功了

从75:slaveof no one
现在是双主情况
原主70:slaveof 192.168.1.75 6379
切主成功

1 断开与旧主的复制关系
2 与新主的节点建立关系
3 删除从节点当前的所有数据(为了生产安全不要操作!!!!!)
4 对新主节点进行复制操作

只读

默认情况下,从节点使用slave-read-only=yes配置为只读模式。
由于复制只能从主节点到从节点,对于从节点的任何修改主节点都无法感知,修改从节点会造成主从数据不一致。因此建议线上不要修改从节点的只读模式。

127.0.0.1:6379> set hello world
(error) READONLY You can't write against a read only replica.

复制过程的原理

1、保存主节点信息(master)信息

2、从节点内部通过每秒运行的定时任务维护,来复制相关的逻辑,当定时任务发现存在的新的主节点,从节点会尝试与该新主节点建立网络连接;从节点会建立一个socket套接字,专门用于接受主节点发送的复制命令。从节点无法建立链接,定时任务会无限重复,直到链接成功,或执行 slaveof no one

3、连接成功时,从节点发送ping命令,请求进行首次通信
(1)检测主从间网络套接字是否可用
(2)检测主节点当前是否接受处理命令如果发送ping命令后,从节点没有收到主节点的pong回复时,比如网络超时或者主节点正在阻塞无法响应命令,从节点会断开复制连接,下次定时任务会发起重连。

4、执行权限的验证,密码验证
5、同步数据集 psync同步,主节点全部发送给从节点
6、命令持续复制