1.1 主从同步

  1、CPA原理

      1. CPA原理是分布式存储理论的基石: C(一致性);   A(可用性);  P(分区容忍性);

      2. 当主从网络无法连通时,修改操作无法同步到节点,所以“一致性”无法满足

      3. 除非我们牺牲“可用性”,也就是暂停分布式节点服务,不再提供修改数据功能,知道网络恢复

      一句话概括CAP: 当网络分区发生时,一致性 和 可用性 两难全

  2、redis主从同步介绍

      1. 和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。
      2. 为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构。
      3. Redis主从复制可以根据是否是全量分为全量同步和增量同步。

      注:redis主节点Master挂掉时,运维让从节点Slave接管(redis主从默认无法自动切换,需要运维手动切换)

      

  3、全量同步(快照同步)

      注:Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:

      1)从服务器连接主服务器,发送SYNC命令;

      2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;

      3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;

      4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;

      5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;

      6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

      7)完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。

      

  4、增量同步

      1. 主节点会将那些对自己状态产生修改性影响的指令记录在本地内存buffer中,然后异步将buffer中指令同步到从节点

      2. 从节点一边执行同步指令达到主节点状态,一边向主节点反馈自己同步到哪里(偏移量)

      3. 当网络状态不好时,从节点无法和主节点进行同步,当网络恢复时需要进行快照同步

  5、Redis主从同步策略

      1. 主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。

      2. 当然,如果有需要,slave 在任何时候都可以发起全量同步。

      3. redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

  6、注意点

      1. 如果多个Slave断线了,需要重启的时候,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的时候,可能会导致Master IO剧增宕机。

1.2 哨兵模式----sentinel

    参考博客:https://www.cnblogs.com/zhoujinyi/p/5569462.html

    参考博客2https://segmentfault.com/a/1190000002680804

  1、sentinel作用

      1. 当用Redis做主从方案时,假如master宕机,Redis本身无法自动进行主备切换

      2. 而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。

  2、sentinel原理

      1. sentinel负责持续监控主节点的健康,当主节挂掉时,自动选择一个最优的从节点切换成主节点

      2. 从节点来连接集群时会首先连接sentinel,通过sentinel来查询主节点的地址

      3. 当主节点发生故障时,sentinel会将最新的主节点地址告诉客户端,可以实现无需重启自动切换redis

  3、Sentinel支持集群

      1. 只使用单个sentinel进程来监控redis集群是不可靠的,当sentinel进程宕掉后sentinel本身也有单点问题

      2. 如果有多个sentinel,redis的客户端可以随意地连接任意一个sentinel来获得关于redis集群中的信息。

  4、Sentinel版本

      1. Sentinel当前稳定版本称为Sentinel 2,Redis2.8和Redis3.0附带稳定的哨兵版本

      2. 安装完redis-3.2.8后,redis-3.2.8/src/redis-sentinel启动程序 redis-3.2.8/sentinel.conf是配置文件。

  5、运行sentinel两种方式(效果相同)

      法1:redis-sentinel /path/to/sentinel.conf
      法2:redis-server /path/to/sentinel.conf --sentinel

      1. 以上两种方式,都必须指定一个sentinel的配置文件sentinel.conf,如果不指定,将无法启动sentinel。

      2. sentinel默认监听26379端口,所以运行前必须确定该端口没有被别的进程占用。

  6、sentinel.conf配置文件说明

      1. 配置文件只需要配置master的信息就好啦,不用配置slave的信息,因为slave能够被自动检测到

      2. 需要注意的是,配置文件在sentinel运行期间是会被动态修改的,例如当发生主备切换时候,配置文件中的master会被修改为另外一个slave。

      3. 这样,之后sentinel如果重启时,就可以根据这个配置来恢复其之前所监控的redis集群的状态。

# sentinel.conf 配置说明
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
'''1、sentinel monitor mymaster 127.0.0.1 6379 2'''
#1)sentinel监控的master的名字叫做mymaster,地址为127.0.0.1:6379
#2)当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了 '''2、sentinel down-after-milliseconds mymaster 60000'''
#1)sentinel会向master发送心跳PING来确认master是否存活,如果master在60000毫秒内不回应PONG
#2)那么这个sentinel会单方面地认为这个master已经不可用了 '''3、sentinel failover-timeout mymaster 180000'''
#1)如果sentinel A推荐sentinel B去执行failover,B会等待一段时间后,自行再次去对同一个master执行failover,
#2)这个等待的时间是通过failover-timeout配置项去配置的。
#3)从这个规则可以看出,sentinel集群中的sentinel不会再同一时刻并发去failover同一个master,
#4)第一个进行failover的sentinel如果失败了,另外一个将会在一定时间内进行重新进行failover,以此类推。 '''4、sentinel parallel-syncs mymaster 1'''
#1)在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步
#2)如果这个数字越大,就意味着越多的slave因为replication而不可用,这个数字越小,完成failover所需的时间就越长。
#3)可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。

sentinel.conf配置文件注释

  7、配置传播

      1. 一旦一个sentinel成功地对一个master进行了failover,它将会把关于master的最新配置通过广播形式通知其它sentinel,其它的sentinel则更新对应master的配置。

      2. 一个faiover要想被成功实行,sentinel必须能够向选为master的slave发送SLAVE OF NO ONE命令,然后能够通过INFO命令看到新master的配置信息。

      3. 当将一个slave选举为master并发送SLAVE OF NO ONE`后,即使其它的slave还没针对新master重新配置自己,failover也被认为是成功了的。

      因为每一个配置都有一个版本号,所以以版本号最大的那个为标准:

        1)假设有一个名为mymaster的地址为192.168.1.50:6379。

        2)一开始,集群中所有的sentinel都知道这个地址,于是为mymaster的配置打上版本号1。

        3)一段时候后mymaster死了,有一个sentinel被授权用版本号2对其进行failover。

        4)如果failover成功了,假设地址改为了192.168.1.50:9000,此时配置的版本号为2

        5)进行failover的sentinel会将新配置广播给其他的sentinel,发现新配置的版本号为2时,版本号变大了,
             说明配置更新了,于是就会采用最新的版本号为2的配置。

1.3 codis

  1、为什么会出现codis

      1. 在大数据高并发场景下,单个redis实例往往会无法应对

      2. 首先redis内存不易过大,内存太大会导致rdb文件过大,导致主从同步时间过长

      3. 其次在CPU利用率中上,单个redis实例只能利用单核,数据量太大,压力就会特别大

  2、什么是codis

      1. codis是redis集群解决方案之一,codis是GO语言开发的代理中间件

      2. 当客户端向codis发送指令时,codis负责将指令转发给后面的redis实例来执行,并将返回结果转发给客户端

  3、codis部署方案

      1. 单个codis代理支撑的QPS比较有限,通过启动多个codis代理可以显著增加整体QPS

      2. 多codis还能起到容灾功能,挂掉一个codis代理还有很多codis代理可以继续服务

      

  4、codis分片的原理

      1. codis负责将特定key转发到特定redis实例,codis默认将所有key划分为1024个槽位

      2. 首先会对客户端传来的key进行crc32计算hash值,然后将hash后的整数值对1024进行取模,这个余数就是对应的key槽位

      3. 每个槽位都会唯一映射到后面的多个redis实例之一,codis会在内存中维护槽位和redis实例的映射关系

      4. 这样有了上面key对应的槽位,那么它应该转发到那个redis实例就很明确了

      5. 槽位数量默认是1024,如果集群中节点较多,建议将这个数值大一些,比如2048,4096

  5、不同codis槽位如何同步 

      1. 如果codis槽位值存在内存中,那么不同的codis实例间的槽位关系得不到同步

      2. 所以codis还需要一个分布式配置存储的数据库专门来持久化槽位关系

      3. codis将槽位关系存储在zookeeper中,并且提供一个dashboard可以来观察和修改槽位关系

111111111111111111111111111111

04: redis集群的更多相关文章

  1. 04.redis集群+SSM整合使用

    redis集群+SSM整合使用 首先是创建redis-cluster文件夹: 因为redis最少需要6个节点(三主三从),为了更好的理解,我这里创建了两台虚拟机(192.168.0.109 192.1 ...

  2. Ubuntu16.04.1上搭建分布式的Redis集群

    为什么要集群: 通常为了,提高网站的响应速度,总是把一些经常用到的数据放到内存中,而不是放到数据库中,Redis是一个很好的Cache工具,当然了还有Memcached,这里只讲Redis.在我们的电 ...

  3. Ubuntu16.04.1上搭建分布式的Redis集群,并使用C#操作

    为什么要集群: 通常为了,提高网站的响应速度,总是把一些经常用到的数据放到内存中,而不是放到数据库中,Redis是一个很好的Cache工具,当然了还有Memcached,这里只讲Redis.在我们的电 ...

  4. Redis集群研究和实践(基于redis 3.0.5)

    前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的2.x的稳定版本是2.8.19,也是我们项目中普遍用到的版本. redis在年初发布了3.0. ...

  5. 使用Docker构建redis集群--最靠谱的版本

    1集群结构说明 集群中有三个主节点,三个从节点,一共六个结点.因此要构建六个redis的docker容器.在宿主机中将这六个独立的redis结点关联成一个redis集群.需要用到官方提供的ruby脚本 ...

  6. redis集群配置

    客户端分片 程序端实现 代理proxy,访问proxy,proxy指定redis保存位置. Twemproxy Redis cluster ,会造成一部分数据丢失,无中心化1.将数据自动切分(spli ...

  7. linux环境(CentOS-6.7)下redis集群的搭建全过程

    linux环境下redis集群的搭建全过程: 使用mount命令将光盘挂载到/mnt/cdrom目录下: [root@hadoop03 ~]# mount -t iso9660 -o ro /dev/ ...

  8. 【redis】 linux 下redis 集群环境搭建

    Redis集群 (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) 127.0.0.1:63791 ...

  9. redis 集群

    http://www.linuxidc.com/Linux/2015-08/121845.htm Redis3.0版本之后支持Cluster,具体介绍redis集群我就不多说,了解请看redis中文简 ...

随机推荐

  1. linux修改ulimit参数

    有如下三种修改方式: 1.在/etc/rc.local 中增加一行 ulimit -SHn 655352.在/etc/profile 中增加一行 ulimit -SHn 655353.在/etc/se ...

  2. C++的重载(overload)与重写(override)

    C++的重载(overload)与重写(override) 成员函数被重载的特征:(同一层级类中来实现)(1)相同的范围(在同一个类中):(2)函数名字相同:名称和返回类型相同(3)参数不同:(4)v ...

  3. 07.斐波那契数列 Java

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n<=39 思路 递归 若n<=2;返回n; 否则,返回Fibonacci ...

  4. vue事件.navtive 的使用

    我们可以直接在组件标签上绑定事件了 然后在 methods 的对象中调用这个方法了 正常情况下是不可以的,但是我们可以使用事件修饰符 .navtive 就可以实现了 props的对象写法

  5. FinalShell Mac OS版,Linux版安装及教程(Mac下的xshell)

    用户QQ群 342045988 Mac版安装路径/Applications/finalshelldata Linux版安装路径/usr/lib/finalshelldata 注意:1.FinalShe ...

  6. EvenBus源码分析

    概述 一般使用EventBus的组件类,类似下面这种方式: public class SampleComponent extends Fragment { @Override public void ...

  7. nginx配置443端口

    参照地址:    https://www.cnblogs.com/tianhei/p/7726505.html       https://blog.csdn.net/cjs5202001/artic ...

  8. php 通过mysqli 操作数据库mysql

    目录 php mysqli 操作数据库 连接数据库 通过mysqli 创建数据库 通过mysqi 创建数据表 通过mysqli向数据表中插入信息 通过mysqli 读取数据 where语句的应用 通过 ...

  9. XCTF (app1)

    打开app.一个文本框,随便输入提示如下图. 打开JEB反编译. v2调用getPackageInfo获取版本信息.一般 Android 通过 PackageInfo 这个类来获取应用安装包信息,比如 ...

  10. NJCTF (easycrack)

    安装app查看.一个输入框,输入随便输入显示Try again. 放入JEB反编译. 关于输入框监听是第一次见,具体可以看看这个博客https://www.jianshu.com/p/f976c677 ...