【Redis的主从复制】

Redis主从复制

什么是主从复制

主从复制,是将数据库分为主节点和从节点,主节点源源不断地将数据复制给从节点,保证主从节点中存有相同的数据。有了主从复制,数据可以有多份副本,这带来了多种好处:

  • 提升数据库系统的请求处理能力

    主从同步,读写分离,可以提升Redis的性能和吞吐量,但需要注意主从数据一致性问题

  • 提升整个系统的可用性

    增强数据容灾能力,Redis主从复制,从机是主机的备份,主机宕机,从机可读不可写
    默认情况下主机宕机后,从机不可为主机
    利用哨兵可以实现主从切换,做到高可用

Redis支持主从复制功能,可以通过执行slaveof(Redis5以后改成replicaof)或者在配置文件中设置 slaveof(Redis5以后改成replicaof)来开启复制功能。

Redis的主从复制特点:

  • 主对外从对内,主可写从不可写
  • 主挂了,从不可为主

主从配置

主Redis配置: 无需特殊配置

从Redis配置:

修改从服务器上的 redis.conf 文件:

# slaveof <masterip> <masterport>
# 表示当前【从服务器】对应的【主服务器】的IP是192.168.10.135,端口是6379。 
replicaof 127.0.0.1 6379

搭建配置

在一台机器上采用伪分布式的方式部署。(生产环境应该是多台机器)

根据上面的部署方案搭建如下:

Redis-Master :127.0.0.1 6379

采用安装的方式,正常安装和配置

#1 安装redis5.0
mkdir redis-master
cd /var/redis-5.0.5/src/
make install PREFIX=/var/redis-ms/redis-master
cp /var/redis-5.0.5/redis.conf /var/redis-ms/redis-master/bin 
#2 修改redis.conf
# 将`daemonize`由`no`改为`yes` 
daemonize yes
# 默认绑定的是回环地址,默认不能被其他机器访问 
# bind 127.0.0.1
# 是否开启保护模式,由yes该为no 
protected-mode no

Redis-Slaver1:127.0.0.1 6380

#安装redis-slaver1
mkdir redis-slaver1
cp -r /var/redis-ms/redis-master/* /var/redis-ms/redis-slaver1 #修改配置文件
vim /var/redis-ms/redis-slaver1/redis.conf
port 6380
replicaof 127.0.0.1 6379

查看redis:

登录redis-cli -p 6379  输入 info 可查看#Replication
登录redis-cli -p 6380  输入 info 可查看#Replication

出现问题:

主从配置的过程中总是不能成功,不知道什么原因

  • 在redis.conf中配置了日志输出对应的log文件

  • 在日志文件中查看到异常信息

    46077:C 22 May 17:45:25.115 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    46077:C 22 May 17:45:25.115 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=46077, just started
    46077:C 22 May 17:45:25.115 # Configuration loaded
    46078:M 22 May 17:45:25.118 * Increased maximum number of open files to 10032 (it was originally set to 256).
    46078:M 22 May 17:45:25.119 # Can't open the append-only file: Permission denied
    

    原来是append-only文件创建了但不能写,在当前文件夹下授予权限可正常启动:

    sudo chmod 777 ./bin 
    

原理与实现

在这里插入图片描述

1. 保存主节点信息

当客户端向从服务器发送slaveof/replicaof 主机地址(127.0.0.1) 端口(6379)时,从服务器将主机ip(127.0.0.1)和端口(6379)保存到redisServer的masterhost和masterport中。

Struct redisServer{
	char *masterhost;//主服务器ip 
  int masterport;//主服务器端口
};

从服务器将向发送SLAVEOF命令的客户端返回OK,表示复制指令已经被接收,而实际上复制工作是在 OK返回之后进行。

2. 建立socket连接

slaver与master建立socket连接

slaver关联文件事件处理器

该处理器接收RDB文件(全量复制)、接收Master传播来的写命令(增量复制)
在这里插入图片描述
主服务器accept从服务器Socket连接后,创建相应的客户端状态。相当于从服务器是主服务器的Client 端。
在这里插入图片描述

3. 发送ping命令

Slaver向Master发送ping命令

1、检测socket的读写状态

2、检测Master能否正常处理

Master的响应:
1、发送“pong” , 说明正常

2、返回错误,说明Master不正常

3、timeout,说明网络超时

在这里插入图片描述

4. 权限验证

主从正常连接后,进行权限验证
主未设置密码(requirepass=“”) ,从也不用设置密码(masterauth=“”)

主设置密码(requirepass!=“”),从需要设置密码(masterauth=主的requirepass的值) 或者从通过auth命令向主发送密码
在这里插入图片描述

5. 发送端口信息

在身份验证步骤之后,从服务器将执行命令REPLCONF listening-port ,向主服务器发送从服务器的监听端口号。
在这里插入图片描述

6. 同步数据

Redis 2.8之后分为全量同步和增量同步。

7. 命令传播

当同步数据完成后,主从服务器就会进入命令传播阶段,主服务器只要将自己执行的写命令发送给从服
务器,而从服务器只要一直执行并接收主服务器发来的写命令。

同步数据集

Redis 2.8以前使用SYNC命令同步复制

Redis 2.8之后采用PSYNC命令替代SYNC

旧版本

Redis 2.8以前

实现方式

Redis的同步功能分为同步(sync)和命令传播(command propagate)。

1)同步操作:

  1. 通过从服务器发送到SYNC命令给主服务器
  2. 主服务器生成RDB文件并发送给从服务器,同时发送保存所有写命令给从服务器
  3. 从服务器清空之前数据并执行解释RDB文件
  4. 保持数据一致(还需要命令传播过程才能保持一致)

在这里插入图片描述
2)命令传播操作:

同步操作完成后,主服务器执行写命令,该命令发送给从服务器并执行,使主从保存一致。

缺陷

没有全量同步和增量同步的概念,从服务器在同步时,会清空所有数据。

主从服务器断线后重复制,主服务器会重新生成RDB文件和重新记录缓冲区的所有命令,并全量同步到从服务器上。

新版

Redis 2.8以后

实现方式

在Redis 2.8之后使用PSYNC命令,具备完整重同步和部分重同步模式。

  • Redis 的主从同步,分为全量同步增量同步
  • 只有从机第一次连接上主机是全量同步
  • 断线重连有可能触发全量同步也有可能是增量同步( master 判断 runid 是否一致)。

在这里插入图片描述

除此之外的情况都是增量同步

全量同步

Redis的全量同步过程主要分三个阶段:

  • 同步快照阶段: Master 创建并发送快照RDB给 Slave , Slave 载入并解析快照。 Master 同时将此阶段所产生的新的写命令存储到缓冲区。
  • 同步写缓冲阶段: Master 向 Slave 同步存储在缓冲区的写操作命令。
  • 同步增量阶段: Master 向 Slave 同步写操作命令。

在这里插入图片描述

增量同步

  • Redis增量同步主要指Slave完成初始化后开始正常工作时, Master 发生的写操作同步到 Slave 的过程。
  • 通常情况下, Master 每执行一个写命令就会向 Slave 发送相同的写命令,然后 Slave 接收并执行。

心跳检测

在命令传播阶段,从服务器默认会以每秒一次的频率向主服务器发送命令:

replconf ack <replication_offset>
#ack :应答 #replication_offset:从服务器当前的复制偏移量

主要作用有三个:

  1. 检测主从的连接状态

    检测主从服务器的网络连接状态

​ 通过向主服务器发送INFO replication命令,可以列出从服务器列表,可以看出从最后一次向主发送命令距离

​ 现在过了多少秒。lag的值应该在0或1之间跳动,如果超过1则说明主从之间的连接有 故障。

  1. 辅助实现min-slaves

    Redis可以通过配置防止主服务器在不安全的情况下执行写命令

    min-slaves-to-write 3 (min-replicas-to-write 3 )

    min-slaves-max-lag 10 (min-replicas-max-lag 10)

    上面的配置表示:从服务器的数量少于3个,或者三个从服务器的延迟(lag)值都大于或等于10 秒时,主服务器将拒绝执行写命令。这里的延迟值就是上面INFOreplication命令的lag值。

  2. 检测命令丢失

    如果因为网络故障,主服务器传播给从服务器的写命令在半路丢失,那么当从服务器向主服务器发送REPLCONF ACK命令时,主服务器将发觉从服务器当前的复制偏移量少于自己的复制偏移量, 然后主服务器就会根据从服务器提交的复制偏移量,在复制积压缓冲区里面找到从服务器缺少的数据,并将这些数据重新发送给从服务器。(补发) 网络不断

    增量同步:网断了,再次连接时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值