• Redis多机常用架构-cluster


    Redis-cluster:去中心化,中间件,集群中任意节点平等,任一节点可获得全局的数据

    Redis-cluster 拓扑图:

    image

    架构演变及 cap 理论:

    单机 Redis 属于 cp 模型。

    Redis-cluster 属于 ap 模型

    Redis-cluster 核心参数:

    cluster-enabled yes
    cluster-config-file nodes-6379.conf
    cluster-node-timeout 50000(毫秒)
    cluster-migration-barrier 1
    cluster-require-full-coverage no
    cluster-slave-validity-factor
    (node-timeout * slave-validity-factor) + repl-ping-slave-period

    Redis-cluster 数据分布:预分槽(slot)

    预分配 16384(slot), 根据 crc16(key) mod 16384的值,决定key 存放在哪个 slot里。

    预分槽的方案介于“硬Hash”和“一致性Hash”之间,牺牲了一定的灵活性,但相比“一致性Hash“,数据的管理成本大大降低

    Redis-cluster M-S
    Redis-cluster 采用 一主多从 
    集群完整写的步骤:
    1. client 写数据到 master
    2. master 告知 client “ok”
    3. master 同步数据到 slave
    存在风险:
    第二步骤成功后, mater crash,照常主从数据不一致 

    Redis-cluster 解决了 我们什么问题?
    以前:
    1.  redis cpu 使用率>80%, 拆分redis实例,修改代码,指向新的redis实例。
    2   redis 内存使用超过标准,继续拆分实例!
    3   redis 流量增长,拆!
    4.  单实例的高可用问题。
    现在:
    只需要 分配一组新的redis实例 加入 cluster, 迁移 slot  即可解决 资源 使用率问题。

    Redis-cluster缺点:
    1.  无法查看 几号 slot 里 存有什么类型的keys,只能查看实例里存有多少slot 号。
    2.  当 redis-cluster  中 一组节点全部挂掉,  将 丢失 指向 已经挂掉节点的 keys。 (根据 crc16算法)

    Redis-cluster 无法处理的问题:
    A.   在遇到 被爬虫,强刷部分模块, 容易出现 redis 线程上涨,堵塞 响应请求, 其根因是  存储的redis key不合 理. 
    B.  部分hash key 存的过大,单个key里 存储数据 超过1W。降低 redis 响应时间。
    C.   程序逻辑问题, 导致 redis 实列 频繁刷新 部分业务key.
    D.   程序设计漏洞。

    cluster经典架构

    image

    节点:

    节点(Node)

    一个集群由一个或多个节点组成,其中主节点(master)负责储存键值对数据,而从节点(slave)则负责复制主节点。

    注意:从节点不提供任何读写操作

    image

    分片:

    分片(Sharding)

    集群将整个数据库分为16384(2 的 14 次方)个槽(slot)

    每个主节点可以负责处理0 个至 16384 个槽

    注意:集群只有在所有槽位均有主节点处理时,才能进入上线状态并处理数据命令

    image

    槽位计算方式

    image

    命令执行:

    槽位正确与槽位不正确

    槽位正确:命令处理的键所在的槽,正好由接收命令的节点负责

    槽位不正确:接收命令的节点并不包含键所在的槽位

    槽位正确:

    image

    槽位不正确:

    键 date 所在的槽 2022 并非由节点 7001 负责,7001向客户端返回Redirection。

    客户端根据Redirection的指引,转向至节点 7000,并重新发送命令。

    image

    Redirection的实现

    Gossip协议内部通信

    image

    Redirection的实现之槽表(Slot table)

    节点在接收到命令请求时,会通过槽表检查键所在的槽是否由本节点处理:

    如果是的话,那么节点直接执行命令;

    如果不是的话,那么节点就从槽表里面提取出正确节点的地址信息,然后返回客户端转向错误。

    image

    Failover

    集群中三个负责处理命令的主节点标记7000出现SDOWN

    image

    image

  • 相关阅读:
    URL中参数为数组
    POST请求出现中文乱码的问题
    获取请求Requst中访问请求的客户端IP
    配置mybatis解决log4j未正常打印sql的问题
    C++ 数组、二维数组、函数参数
    C++ cin.clear()使用示例
    C++ 十进制转二进制 ASCII码大小写转换
    C++ 函数中返回字符串的一个陷阱
    充分条件、必要条件、充分必要条件
    binary search by Python3
  • 原文地址:https://www.cnblogs.com/janehoo/p/6119175.html
Copyright © 2020-2023  润新知