方案概述:

对于ycache-client,如下图,在一致性hash环上的每个节点都有一个备用的节点。正常情况下slave节点不参与key的分配(冷备)。只有当master挂了,ycache client读取/监听了zk上的slaveof节点,从而得知那些cache实例是slave状态的,把slave实例排除掉。数据变更时,如果变更的redis实例当前自己在使用,就重新初始化这个pool的所有链接。
当master发生故障时,master、slave的切换时在yagent完成的。yagent定时将redis实例对应的master/slave关系写到zk的slaveof节点上。然后slave上会每5秒检查一次master的状态。如果master没有响应,就将slave升级为master。
yconsole负责master/slave关系的管理,可以将某个redis服务设置为slave状态,查看状态等。
  


实现说明:

  1. redis版本升级为3.0.1(也可以使用2.8.*的版本,但需要确保主、备版本是相同的)
    1. 打包新的redis rpm包
      1. redis使用开源的3.0.1的源码包
      2. 将https://github.com/zwChan/remirepo/tree/master/redis 拷贝到rpmbuild的source目录(/root/rpmbuild/SOURCES/),然后执行rpmbuild -bb redis.spec.
      3. 更新缺省的redis配置文件,支持aof(?)
    2. 检查命令的兼容情况
  2. yagent适配
    1. 读取自己管理的slave,定时更新一次这个信息(缺省10s,可配置)
    2. 定时检查一下slave对应的master是否正常,如果不正常,将自己设置为master,将原来的master设置为slave(缺省间隔为1s,连续检查5次失败后才算失败,所以延时5秒)
    3. 定时检查当前的master实例是否在zk上被配置为slave,如果是,将它转换为slave状态(5秒间隔)
    4. 每次一个redis实例重启后,如果它有slave且正常,都将正在起的实例变更为slave,将它原来的slave变更为master。这样做是为了避免redis实例快速重启导致数据丢失。详细的问题见: http://redis.io/topics/replication  “Safety of replication when master has persistence turned off”
    5. 如果redis实例的主备状态和zk上的状态不一样,修改为与zk上的一样。(5秒间隔)
  3. yconsole适配
    1. 添加slaveof命令,配置和删除redis之间的主从关系;yconsole { slaveof } slave master
    2. 添加slaves命令,显示主从关系;同时检查zk上的主从关系是否与redis真实的主从关系一致。
    3. 主从关系发生变化时,通过命令行slaveof动态通知redis做出对应改变;
    4. add命令计算容量时不计算slave
    5. add/app/mod命令将slave也自动写到cache id的内容里
    6. list命令显示主从关系
  4. ycache-client适配
    1. slaveof目录的子节点增加和删除时,要进行重新初始化pool的处理
    2. 初始化pool时,将slaveof下的slave状态的实例去除
    3. 当slave的master变化时,不需要处理
    4. 每个pool只初始化一个zkproxy
  5. 限制:
    1. 每个master最多只能有一个slave,slave不能作为master;

使用方法:

  1. ycache-client:此功能对ycache-client使用者透明,仅须升级为2.2.0及以上版本的;
  2. yconsole:添加了slaves和slaveof命令,请查看 yconsole help命令获取命令格式。
    1. slaves: 查看slave和master对应的关系,后面的状态“ok”标识现在zk上的主备关系与redis本身主备关系的是一致的。
    2. slaveof:添加或删除slave/master关系(master参数为‘none’时删除关系)

      刚配置后的几秒内,zk状态和redis状态可能不一致。等几秒后状态就一致了。
    3. 添加cache id时,如果一个redis实例已经被指定为slave,它所占用的资源不被计算到命令行指定的资源中;但如果分配后才配置slave/master关系的,cache id的容量会变少(因为slave是不参与使用)

      将master添加到test中,它的slave会自动加到test中。但是,如果你单独将slave添加到test中,不会带着master加到test。 这是一种错误的配置,slave不应该直接被使用(尽管没有被禁止)
  3. yagent:升级版本大于等于‘2015-06-02';升级redis版本为2.8.*。 使用方法不变。redis新的rpm包在svn上。

问题与改进

当前有性能问题: 
  1. 所有的redis 的client都监听slaveof目录,很容易造成惊群问题;
  2. 老版本的client不能在主从环境的redis上用。所以要确保client升级后,才能用yconsole设置主从关系。

这两个问题是可以避免的,只要在cache id的内容中不记录从节点的信息即可。/redis/pools/cache-id的内容仅是master的节点,/redis/slaveof下记录slave对应的slave->master关系。每次主从关系变化时,都要确保/redis/pools/cache-id下的内容都是master,不包含slave(而且cache实例排列顺序也不能改变,之前的设计主要是考虑到这个因素)。这样就能够使得老版本的client也能使用主从关系了。同时,由于每个pool只依然仅监听自己的cache-id,不会会有惊群的现象。yagent和yconsole要确保上面提到的关系转换正确。

当然其他方面也要相应修改,但修改后的架构更为清晰,当前架构反而不是很好。当前yhd使用redis的不多,而且主从很少变化,所以惊群问题还不明显。





ycache中redis主备功能设计及使用说明的更多相关文章

  1. 搭建和测试 Redis 主备和集群

    本文章只是自我学习用,不适宜转载. 1. Redis主备集群 1.1 搭建步骤 机器:海航云虚机(2核4GB内存),使用 Centos 7.2 64bit 操作系统,IP 分别是 192.168.10 ...

  2. 如何在DCS管理控制台将两个Redis主备实例建立全球灾备。

    华为云分布式缓存服务DCS,具有强大的功能,现在小编教大家如何在DCS管理控制台将两个Redis主备实例建立全球灾备. 建立全球灾备,会对主实例和备实例进行升级,实例进程会重启,连接会中断.同时备实例 ...

  3. 阿里云ECS部署Redis主备哨兵集群遇到的问题

    一.部署 详细部署步骤:https://blog.csdn.net/lihongtai/article/details/82826809 Redis5.0版本需要注意的参数配置:https://www ...

  4. Redis主备自动切换

    Sentinel(哨兵)是用于监控redis集群中Master状态的工具. 一.Sentinel作用  1.Master状态检测   2.如果Master异常,则会进行Master-Slave切换,将 ...

  5. 分布式Redis主备复制

    当数据落在不同节点上时,如何保证数据节点之间的一致性是非常关键的 Redis采用主备复制的方式保证一致性,所有节点中,只有一个节点为主节点(master),它对外提供写服务,然后异步的将数据复制到其他 ...

  6. Redis - Keepalived + redis 主备热备切换

    1. 热备方案 硬件:server两台,分别用于master-redis及slave-redis 软件:redis.keepalived 实现目标: 由keepalived对外提供虚拟IP(VIP)进 ...

  7. Redis主备复制

    Redis 支持 Master-Slave(主从)模式,Redis Server 可以设置为另一个 Redis Server 的主机(从机),从机定期从主机拿数据.特殊的,一个从机同样可以设置为一个 ...

  8. haproxy配置监控redis主备切换(转)

    环境前提:     redis sentinel配置,三台主机,且配置运行良好        配置文件中添加: frontend ft_redis  bind 0.0.0.0:6379 name re ...

  9. 请不要用SECONDS_BEHIND_MASTER来衡量MYSQL主备的延迟时间【转】

    本文来自:http://www.woqutech.com/?p=1116 MySQL 本身通过 show slave status 提供了 Seconds_Behind_Master ,用于衡量主备之 ...

随机推荐

  1. linux下Django Nginx+uwsgi 安装配置

    原文链接 在前面的章节中我们使用 python manage.py runserver 来运行服务器.这只适用测试环境中使用. 正式发布的服务,我们需要一个可以稳定而持续的服务器,比如apache, ...

  2. B站视频下载

    借助Chrome插件 bilibili哔哩哔哩下载助手 在谷歌应用商城下载安装后在在浏览器右上角显示如下图标 打开想要下载的视频,网页右下角会有如下图标,点击该图标 点击下面的合并下载按钮即可 htt ...

  3. hadoop中hive的属性

    1.在hive中是可以删除文件的: hive> dfs -rm -R /u2.txt > ; Deleted /u2.txt 2.hive 中的default数据库 <propert ...

  4. 批量kill指定名称的进程

     以Airflow举例: ps -ef | grep “airflow" | grep -v grep | cut -c 9-15 | xargs kill -9   分析: ps -ef  ...

  5. Django模型层:单表操作,多表操作,常用(非常用)字段和参数,Django-model进阶

    一.web应用 二.模板的导入与继承 三.静态文件相关 四.inclusion_tag:返回html片段 五.模型层 一.web应用 -s包括两个部分:web服务器+application -目前阶段 ...

  6. python : import详解。

    用户输入input() input()函数: 用于从标准输入读取数值. >>> message = input('tell me :') tell me :hahah >> ...

  7. 服务器上的UID按钮

    定位用的,比如你机柜上有很多台机器,你在前面按下UID灯,机器后面也有一个UID灯会亮起来,这样当你到后面去的时候你就知道刚才在前面看的是哪一台,另外,有人通过ILO远程端口连接到你的服务器的时候,U ...

  8. BZOJ5017 [Snoi2017]炸弹[线段树优化建边+scc缩点+DAG上DP/线性递推]

    方法一: 朴素思路:果断建图,每次二分出一个区间然后要向这个区间每个点连有向边,然后一个环的话是可以互相引爆的,缩点之后就是一个DAG,求每个点出发有多少可达点. 然后注意两个问题: 上述建边显然$n ...

  9. sqlite3.OperationalError: no such table: account_user

    你可能是在项目中安装了多个app, 首先删除相关app的migration文件中的子文件 执行建表的时候使用: python manage.py makemigrations appname pyth ...

  10. hbase实践之HFile结构

    本文目录如下所示: 目录 HFile在HBase架构中的位置 什么是HFile HFile逻辑结构 HFile逻辑结构的优点 HFile物理结构 HFile生成流程 HFile中Block块解析 多大 ...