#redis#

  1. 判断节点宕机

    * 主观下线:pfail, 断开 > cluster-node-timeout 默认15000ms 
    * 客观下线:fail, cluster-node-timeout*2 时间内, 有超过半数节点pfail, 则标记为fail
  2. 从节点资格检查
    对宕机的主节点,选择有资格切换的slave节点, 判断条件为从节点最后一次与主节点通信的时间间隔, 如果小于 cluster-node-timeoutcluster-slave-validity-factor(默认为15s10) ,那么就有资格

  3. 设置从节点的延迟选举时间
    对所有从节点进行排序,slave priority, 每个从节点根据自己对master复制数据的offset设置选举时间, offset越大,表明复制数据越多, 选举时间越靠前,优先进行选举

  4. 从节点发起选举流程
    从节点定时任务检测= failover_auth_time (故障选举时间) 后,发起选举流程

  • 更新配置纪元
    保存在clusterState.failover_auth_epoch 结构体变量里
  • 广播选举消息
    FAILOVER_AUTH_REQUEST,保证该从节点在一个配置纪元内只能发起一次选举
  1. 主节点选举投票
    只有持有槽的主节点才能处理FAILOVER_AUTH_REQUEST消息, 给从节点投票。当某个从节点收集到N/2 +1 个持有槽的主节点投票时, 从节点可以执行替换故障主节点的操作。

注意事项:
1、故障节点也算在N里面,所以要注意主节点的部署分布问题,有可能从节点一直拿不到N/2+1个选票
2、投票作废。 一个配置纪元代表一次选举周期,开始投票后的cluster-node-timeout*2 时间内,从节点没有获取到足够票数,则本次选举作废,从节点对配置纪元自增并发起下一轮投票

  1. 替换主节点
    收到N/2+1个选票的从节点发起替换主节点操作:
  • 当前从节点取消复制,变为主节点
  • 执行clusterDelSlot操作撤销故障主节点负责的槽, 并执行clusterAddSlot把这些槽委派给自己
  • 向集群广播自己的pong消息,通知集群内所有的节点当前从节点变为乐主节点卡并接管了故障主节点的槽信息

评论和共享

普通命令注意

  • 在使用 rename 命令的时候。由于重命名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能性,这点不要忽视。rename = del (old key) + rename (newkey)
  • Redis 不支持二级数据结构(例如哈希、列表)内部元素的过期功能。
  • append、setrange等命令会造成内存预分配,导致内存占用增加一倍, 尽量用set

    集群redis-cluster功能限制

  • key批量操作支持有限,如mget和mset,目前只支持具有相同slot值的key批量操作。
  • key事务操作支持有限,只支持多key在同一节点上的事务操作,当多个key分布在不同的节点上时无法使用事务功能
  • key作为数据分区的最小粒度,不能将一个大的键值对象如hash、list映射到不同节点
  • 不支持多数据库,只能使用一个数据库空间,db0
  • 复制结构只支持一层, 即从节点只能复制主节点,不支持嵌套树状复制结构
  • 当节点通信失败时间大于cluster-node-time(默认15000 =15s)时,会被标记为主观下线, 被超过半数的节点标记为主观下线则进行客观下线。 但是cluster-node-time*2 的时间内,每个节点自己的下线报告如果没有得到更新,那么下线报告会被删除,即得不到超过半数节点的主观下线标记。
    所以cluster-node-time 不要设置的过小,否则主观下线的速度赶不上下线报告的过期速度, 故障节点将永远无法被标记为客观下线,导致故障转移失败。

    redis-cluster关键参数

  • cluster-require-full-coverage
    1
    2
    no  当主节点不可用时,只影响主节点上的槽使用,整个集群在故障发现到转移期间其他节点仍可用
    yes 主节点不可用时,整个集群在故障发现到转移期间不可用

评论和共享

mysql的索引按照页来存储, 目前大多数操作系统,一个页的大小为16KB。

拿主键索引树举例,

如果主键为int

占4个字节, 一个指针(64位系统)占8个字节, 则根结点可存储16KB/(4+8) 约等于1300, 此时分叉数约为1300
当树高为3时, 可存储数据条数 1300^3 =2197000000

如果主键为bigint

占8个字节, 一个指针(64位系统)占8个字节, 则根结点可存储16KB/(8+8) 约等于1000, 此时分叉数约为1000
当树高为3时, 可存储数据条数 1000^3 =1000000000 ,即为10亿条
所以可以看出, 通常innodb 遍历索引树,最多遍历2~3层索引树,即可得到结果。

评论和共享

  • 第 1 页 共 1 页
作者的图片

Xiao Tengkun

这个博客主要还是写给自己看的,自己的一些总结和感悟,可能会比较杂,有技术的,也有生活的~


做过几年研发,后面转做dba了,目前在网易做dbsaas化的一些东西。


中国杭州