分布式Redis深度历险

  • 时间:
  • 浏览:2

摘要

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-20000共一万条数据。

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

2.主服务器新增20001,20002两条数据

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

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

5.主服务器新增数据20003,意味着分析网络断开,或多或少或多或少从服务器感受只能数据变化

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

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

从上述步骤中能够看过,当从服务器重新连接上主服务器时,会重新进行全量同步,造成极少量太久要的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中,所有服务器之间的数据传递都在以该种辦法 )。假设主服务器向从服务器发送四根写命令,但网络再次冒出异常,从服务器并越来越 收到该命令。



这就会意味着数据不一致的情况报告(你意味着分析想主服务器发送命令时,意味着分析从没返回失败,进行重发不就好何时能 能 ?意味着分析说从成功执行了命令,后来再回复主的后来再次冒出了现象,那主意味着分析重发就会造成数据异常了)。或多或少或多或少主服务器会根据心跳信息来决定要发送的数据。看个例子:

初始,主服务器和从服务器偏移量都在200。

主服务器收到客户端的写命令,将偏移量改成110,一并向从服务器发送写命令,但因网络意味着,从服务器并越来越 收到,其偏移量仍然是200。主服务器根据心跳发现从服务器的偏移量是200落后于买车人,或多或少或多或少会将200-110的数据进行重发。

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

意味着分析你有想到这些 现象,说明你是有在认真思考了~

真是 是不处在这些 情况报告的,意味着是redis是 单应用守护进程 的!记住 单应用守护进程 或多或少或多或少我字,再回头看过现象描述,相信你能想明白~

原文: Java架构笔记

本文由

lihong

发布在

ITPUB

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

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