zoukankan      html  css  js  c++  java
  • Redis主从、哨兵、Cluster特性

    Redis主从复制

    特点:

    a、多个redis节点,有且仅有一个主节点master,多个从节点slave。

    b、只要网络正常,master节点会一直将自己的数据同步更新给所有slave节点(异步的方式)。

    c、master节点可读可写,slave节点只读

    优点:

    a、支持主从复制,maser节点会自动将数据同步给slaves节点,可以进行读写分离

    b、master是以非阻塞的方式为slaves提供服务。所以在同步期间,客户端仍然可以提交读写请求。

    缺陷:

    a、master节点宕机,宕机前有部分数据未能及时同步给slave,客户端重连到可用slave后,会出现数据不一致的问题。

    b、不具备故障自动转移,master节点宕机会导致整个集群不能执行写操作,需要等待机器从起或者客户端手动切换到可用slave。

    c、单个master节点内存有限且不易设置过大,否则会导致持久化文件过大,影响数据恢复和主从同步效率。

    Redis哨兵模式

    特点:

    a、redis提供了哨兵的命令,哨兵是一个独立的进程,独立运行。

    b、哨兵通过定时给每个redis节点发送命令,检查所有(包括master和slave)节点是否运行正常。

    c、也可以配置多哨兵模式,各个哨兵之间还会互相监控(客户端是连接的是哨兵,而不是master节点)。

    d、当哨兵检测到master宕机,它会自动进行选举,将其中一个slave升级为master,然后通过发布订阅模式通知其它slave,修改配置文件,让它们切换主节点。

    投票选举过程:当任何一个哨兵发现master下线时(主观下线),会询问其它哨兵,投票决定该master是否下线。如果超过半数哨兵投票,则进行failover操作,并通过发布订阅模式其它哨兵把自己监控的master切为slave(客观下线) 。最后在所有slave中选举一个新的master节点。

    优点:

    a、哨兵模式是基于主从模式的,具有主从的所有优点。

    b、当master宕机后,可实现故障自动转移。

    缺陷:

    a、当master节点宕机后,哨兵会判断是否下下线然后选举新的master节点,这个过程中会出现访问瞬断

    b、哨兵模式只有一个master节点对外提供写服务,没法支持很高的并发

    c、单个master节点内存有限且不易设置过大,否则会导致持久化文件过大,影响数据恢复和主从同步效率。

    Cluster模式

    特点:

    a、redis-cluster采用去中心结构,所有redis节点彼此互联(ping-pong机制)。

    b、主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。

    c、节点的fail是通过集群中超过半数节点检测失效时才失效

    d、客户端与redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

    e、redis-cluster把所有物理节点映射到 [0-16383] 上(不一定是平均分配),cluster负责维护node,slot、value。

    f、当需要在redis集群中放置一个key-value时,根据CRC16(key) % 16384 的值,决定将一个key放到哪个slot中。

    优点:

    a、具有主从的所有优点,同时也支持故障自动转移(投票机制)。

    b、可线性扩展到1000多个节点,节点可动态添加或删除。

    c、每个节点和其它节点连接,而且这些连接保持活跃,这样连接集群中任一节点就可以获取到其它节点数据。

    缺陷:

    a、只支持具有相同slot值的key执行批量操作。如:mset、mget。

    b、不支持多数据库空间。单机下Redis支持16个数据库,集群模式下只能使用一个数据库空间,即db 0。

    c、redis-cluster采用虚拟槽分区,可能存在数据倾斜问题。

    Twemproxy集群

    特点:

    通过 twemproxy 代理对 redis key 进行分片计算,分配到多个redis 实例中的其中一个。

    数据倾斜解决方案:

    a、如果是bigvalue,可以将这个 key 打散,然后分别对应一个个小value,再存放到redis集群中。

    b、将 hotkey 所在的节点的部分 slot 迁移到其它节点上。

    c、对于只读的 hotkey,可以采用不同 hotkey 前缀的多副本方法:

         比如有 N 个redis节点,计算出一个1~N的随机数,然后作为前缀与 hotkey 拼接得到 tempkey。程序会优先访问 tempkey,如果查不到数据,再访问原来的 hotkey,并将  hotkey 的值写给 tempkey。这样下一次访问 hotkey 时,压力就分散到不同redis节点上了。另外 tempkey 的过期时间是 hotkey 的过期时间加上一个较小的随机正整数,保证在 hotkey 过期后,所有 tempkey 不会同时过期而造成缓存雪崩。

     

    知识改变世界
  • 相关阅读:
    java学习笔记(三)
    JAVA 学习笔记(2)
    java学习笔记
    第二次作业完成情况
    第一次作业完成情况
    使用MarkDown标记语言发博客
    《Java高级程序设计》第一周作业
    纪逝去的毕业后的两年时光
    #这是来联系Markdown语法的
    CodeFirst初体验——问题三
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/14359046.html
Copyright © 2011-2022 走看看