分布式Redis深度历险

  • 时间:
  • 浏览:9
  • 来源:木木娱乐网_提供晓轩资源网技术_技术QQ网资讯

摘要

Redis角度历险分为十个 主次,单机Redis和分布式Redis。本文为分布式Redis角度历险系列的第一篇,主要内容为Redis的复制功能。Redis的复制功能的作用和大多数分布式存储系统一样,什么都有 为了支持主从设计,主从设计的好处有以下几点:读写分离,提高读写性能数据备份,减少数据丢失的风险高可用,避免单点故障旧版复制实现Redis的复制主要分为同步和命令传播十个 步骤:同步都上能 理解为全量,是将主

Redis角度历险分为十个 主次,单机Redis和分布式Redis。

本文为分布式Redis角度历险系列的第一篇,主要内容为Redis的复制功能。

Redis的复制功能的作用和大多数分布式存储系统一样,什么都有 为了支持主从设计,主从设计的好处有以下几点:

  • 读写分离,提高读写性能
  • 数据备份,减少数据丢失的风险
  • 高可用,避免单点故障

旧版复制实现

Redis的复制主要分为同步和命令传播十个 步骤:

同步都上能 理解为全量,是将主服务器某一时刻的所有数据完整版同步到从服务器。

命令传播都上能 理解为增量,当主服务器数据被修改时,主服务器向从服务器发送对应的数据修改命令。

同步

同步分为以下几条步骤:

1.从服务器向主服务器发送 SYNC 命令(执行 SLAVE OF 命令的第一步也会执行 SYNC 

2.主服务器在收到从服务器命令时,会执行 BGSAVE ,也什么都有 新开十个 子任务管理器运行运行将内存中的数据保存到RDB文件中。同去使用十个 内存缓冲区记录从结束英语 英语 执行的写命令,该内存缓冲区的作用什么都有 记录RDB文件生成期间的增量。

3.向从服务器发送RDB文件

4.将缓冲区中的写命令发送给从服务器

同步都上能 分为并是否是 情况汇报,并是否是 是从服务器第一次连接主服务器,另并是否是 是从服务与主服务器的网络链接断开了,重新连上主服务器并重新同步。

命令传播

命令传播实现逻辑比较简单,当主服务器执行了写命令后,为了保证从服务器与主服务器数据的一致性,主服务器会将写命令发送给从服务器,从服务器执行完收到的写命令后其数据就能和主服务器保持一致了(当然会有延时),注意,从服务器对于客户端来说是只读的,有之前 从服务器的所有数据是否是 来自于主服务器的同步or命令传播。

旧版复制占据 的问題

假设Redis主从服务器之间的网络环境不太可靠,亲们来看看上述复制妙招会总出 那先 问題。假设有主服务器A和从服务器B,主服务器中目前占据 1-1000共一万条数据。

1.初始连接,从服务器第一次从主服务器同步数据,同步完成后,从服务器是否是 1-1000共一万条数据。

2.主服务器新增1001,1002两条数据

3.通过命令传播,从服务器也新增1001,1002两条数据

4.这之前 主从服务器之间的网络断开

5.主服务器新增数据1003,可能网络断开,什么都有从服务器感受不能数据变化

6.网络恢复,从服务器重新连接上主服务器,并发送SYNC命令,进行同步操作

7.主服务器将所有数据发送给从服务器(1-1003)

从上述步骤中都上能 都看,当从服务器重新连接上主服务器时,会重新进行全量同步,造成少许何必 要的IO开销,可能网络环境不稳定时,会意味着着主服务器一个劲将内存中的数据写到磁盘再发送给从服务器。

新版复制实现

为了避免老版复制问題,Redis2.8对于复制功能进行了优化。实现如下:

1.主服务器会维护十个 偏移量,每次向服务器传播N个字节的数据时,该偏移量就会添加N,比如说一结束英语 是0,接受到一根set key1 value1 后,其偏移量就为13(真实偏移可能是否是 13,什么都有 举个例子)。//这里可能要看下代码确认

2.从服务器也维护十个 偏移量,当从服务器收到到主服务器的N个字节数据时,该偏移量会添加N。

3.主服务器维护十个 固定大小的缓冲区,每次接受到客户端写命令后,后该 将对应 命令 往你这个缓冲区写入。当写入内容超出固定大小后,会覆盖原先的数据。

4.主服务器有十个 唯一id

5.从服务器连接上主服务时,会向主服务器发送上一次连接的主服务器的id以及偏移量,这里又分几种情况汇报:

  1. 可能从服务器没传id可能id与当前主服务器不匹配,那主服务器将传送全量数据
  2. 可能从服务器的offset在缓冲区中不能找到(落后太满意味着着缓冲区可能被新数据覆盖了),那也会进行全量同步
  3. 可能offset能在缓冲区找到,则主服务从offset结束英语 ,将缓冲区的数据依次发送给从服务器。(有做pipeline的优化吗)

以上什么都有 新版复制的大致思路,要注意的是,主服务器缓冲区的大小设置很关键,可能设置的太满会意味着着空间浪费,可能太小会意味着着网络环境不好时,其退化为老版复制。

之前 让他踩过原先的坑:在上云时,redis集群在十个 不同机房,主从之前 网络环境不太稳定,而redis机器上存储的value比较大,很容易就将缓冲区占满意味着着每次全量同步,形成恶性循环,从服务器落后不可读,主服务器不可写(当从Redis落后太满时,主Redis将拒绝写入,具体参数都上能 配置的,下文后该 提到)

什么都有建议将缓冲区大小设置为 平均重连间隔*每秒写入数据量*2

主从心跳机制

从服务器默认会每秒一次的频率向主服务器发送心跳: 

REPLCONF AÇK <replication_offset> , 

replication_offset代表从服务器当前的复制偏移量。

心跳有十个 作用:

1.检测主从服务器的网络连接

2.实现min-slaves功能

3.检测命令丢失

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

主服务器会记录从服务器上次发送心跳是那先 时间,根据你这个时间,亲们能知道主从服务器之间的连接是否是 总出 了故障

实现min-slaves功能

Redis为了保证数据的安全性,都上能 配置当从服务器小于 min-slaves-to-write 个可能 min-slaves-to-write 个从服务器的延迟都大于等于 min-slaves-max-lag 时,主服务器拒绝写。

检测命令丢失

主从之间的复制,我我随便说说是以主服务器作为从服务器的客户端来实现的(在Redis中,所有服务器之间的数据传递是否是 以该种妙招)。假设主服务器向从服务器发送一根写命令,但网络总出 异常,从服务器并没人 收到该命令。



这就会意味着着数据不一致的情况汇报(你可能想主服务器发送命令时,可能从没返回失败,进行重发不就好哪天?可能说从成功执行了命令,有之前 再回复主的之前 总出 了问題,那主可能重发就会造成数据异常了)。什么都有主服务器会根据心跳信息来决定要发送的数据。看个例子:

初始,主服务器和从服务器偏移量是否是 100。

主服务器收到客户端的写命令,将偏移量改成110,同去向从服务器发送写命令,但因网络意味着着,从服务器并没人 收到,其偏移量仍然是100。主服务器根据心跳发现从服务器的偏移量是100落后于当事人,什么都有会将100-110的数据进行重发。

都看这里,你可能对于上述方案的正确性感到质疑:在从服务器接收到100-110的数据前,它发送心跳包告诉主服务器当事人当前偏移为100,有之前 接收到了100-110的数据。这时下个心跳还没发出,主服务器认为从服务器落后于当事人,再次发送100-110的数据,意味着着从服务器再次写入100-110的数据,意味着着数据异常!

可能你有想到你这个问題,说明你是有在认真思考了~

我我随便说说是不占据 你这个情况汇报的,意味着着是redis是 单任务管理器运行 的!记住 单任务管理器运行 十个 字,再回头都看问題描述,相信你能想明白~

原文: Java架构笔记

本文由

lihong

发布在

ITPUB

,转载此文请保持文章完整版性,并请附上文章来源(ITPUB)及本页链接。

原文链接:http://www.itpub.net/2019/07/22/2468/