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. Nginx配置中的log_format用法梳理

    nginx服务器日志相关指令主要有两条,一条是log_format,用来设置日志格式,另外一条是access_log,用来指定日志文件的存放路径.格式和缓存大小,一般在nginx的配置文件中日记配置( ...

  2. Number Of Permutations

    Number Of Permutations 思路:利用容斥,首先所有可能的排列肯定是fac[n],然后可能会有三种 bad 的情况: ①第一个元素的排列是非递减 ②第二种是第二个元素的排列是非递减 ...

  3. css基础(浮动 清除f浮动)

    文档流(标准流) 1.元素自上而下,自左而右  2.块元素,独占一行,行内元素在一行上显示,碰到父级元素的边框换行   浮动left 浮动的框可以向左或是向右移动,直到它的边缘碰到包含框或是另个浮动框 ...

  4. 0.2 IDEA配置

    一.IDEA配置maven 在启动配置设置清理方式:clean jetty:run maven版本以及本地setting和repository JRE版本以及编码格式:-Dfile.encoding= ...

  5. TCP发送窗口更新tcp_ack_update_window

    在tcp_ack接收ACK处理函数中,如果确认当前走慢速路径,那么会调用tcp_ack_update_window函数检查窗口是否需要更新并更新之,并且更新未确认数据的位置,即更新窗口左边沿: sta ...

  6. 修改PostgreSQL数据库的默认用户postgres的密码 并新建用户

    1.忘记了postgresql 安装时默认用户postgres 的密码,怎么办呢? linux shell命令下面输入: sudo -u postgres psql  (这样就可以直接登录进postg ...

  7. XPATH了解

    特殊标签 找SVG这种特殊标签可以使用[name()='svg'],如//[name()='svg']/[name()='line'][2] 文本 找标签内的文本时可以使用: //*[text()=' ...

  8. 最少步数&P1443 马的遍历

      1330:[例8.3]最少步数 s数组:记录(1,1)到达每一点需要的最少步数 s[1][1]自然为 0,其余初始化为 -1 que数组:que[#][1] 表示(1,1)可到达点的 x 坐标 q ...

  9. Leaflet - 实现按照路径方向旋转的 Marker

    在每帧动画时设置 Marker 的 transform 属性就行,zjffun/Leaflet.MovingMarker at zjf/feature-rotate 我在这个 Fork 中实现了一下. ...

  10. vue.js 三种方式安装

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...