• Redis 集群模式



    概述

    Redis 在 3.0 之后开始支持 Cluster(集群)模式,特点如下:

    • 支持节点的自动发现:可向集群动态添加节点,并自动融入
    • 支持 slave-master 选举和容错:多个 master 宕机后,选举出新的 master 继续工作
    • 在线分片:当有新的节点加入时,为新节点分配 slot 空间,从其他节点处获取,并携带数据

    在这里插入图片描述


    搭建

    以 Ubuntu 18.04.5,redis-7.0.4 为例,要想让集群正常运作至少需要三个 master 节点,为了高可用,每个 master 节点至少要有一个 slave 节点,这里以一台机器的六个端口作演示,分别是 7000、7001、7002、7003、7004、7005

    创建多个 redis 配置文件(以其中一个为例,区别在于端口号和部分配置文件命名)

    # 开启远程连接
    bind * -::*
    # 配置端口号,每个配置文件分别配置 7001/.../7005
    port 7000
    # 启用守护进程
    daemonize yes
    # 进程配置文件名,redis_7000/.../redis_7005
    pidfile "/var/run/redis_7000.pid"
    # rdb文件名,dump-7000/.../dump-7005
    dbfilename dump-7000.rdb
    # 开启 AOF 持久化
    appendonly yes  
    # aof文件名,appendonly-7000/./appendonly-7005
    appendfilename "appendonly-7000.aof"
    # 开启集群模式
    cluster-enabled yes
    # 节点配置文件名,nodes-7000/.../nodes-7005
    cluster-config-file nodes-7000.conf
    # 节点超时时间
    cluster-node-timeout 15000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    创建 7000-7005 文件夹,把对应的配置文件放进去

    在这里插入图片描述

    指定不同配置文件启动六个节点,例如

    ./redis-server 7000/redis.conf
    
    • 1

    将六个节点组合成集群,在组合之前,请确保以下条件:

    • 所有节点正常启动后
    • nodes-xxx.conf 文件都正常生成
    • 如果有开启防火墙,放行 7000-7005、17000-17005 端口,前者用于客户端通信,后者用于集群间通信
    # redis会自动规划集群部署,例如这里会以前三个为主节点,后三个分别作从节点
    redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    
    • 1
    • 2

    使用 redis-cli --cluster check 命令来查看节点信息

    # 后面的ip:port使用集群任一节点即可
    redis-cli --cluster check 127.0.0.1:7000
    
    • 1
    • 2

    也可以通过 redis-cli 连接任一节点,使用如下命令查看节点信息

    # 使用普通方式登录,存储数据时可能会出现MOVED重定向操作,所以应该加上-c以集群方式登录
    redis-cli -c -p 7000
    # 查看节点所在集群信息
    cluster nodes
    
    • 1
    • 2
    • 3
    • 4

    一般使用 cluster nodes 命令,信息更详细

    在这里插入图片描述

    以 7000 为例,讲解每项的含义:

    • id:28df8f39d35ad2ddaeddad2ef0b11c77f381a26a,节点 ID,这个值在节点启动时创建,作为唯一标识
    • ip:port:127.0.0.1:7000@17000,节点的通信地址
    • flags:myself,master:逗号分割的标记位,可能的值及含义如下:
      • myself:当前连接的节点
      • master:节点是 master
      • slave: 节点是 slave
      • fail?:当前节点无法联系,但逻辑上是可达的(非 FAIL 状态)
      • fail:节点处于 FAIL 状态.,大部分节点都无法与其取得联系,则会将该节点由 PFAIL 状态升级为 FAIL 状态
      • handshake:还未取得信任的节点,当前正在与其进行握手
      • noaddr:没有地址的节点(No address known for this node)
      • noflags:连个标记都没有(No flags at all)
    • master:28df8f39d35ad2ddaeddad2ef0b11c77f381a26a,这里是 7004 节点的信息,因为该节点是 slave 节点,所以会列出所属 master 节点的 ID,也就是 7000
    • ping-sent:-0,最近一次发送 ping 的时间,这个时间是一个 unix 毫秒时间戳,0 代表没有发送过
    • pong-recv:1661445823000,最近一次收到pong的时间,使用 unix 时间戳表示
    • config-epoch:1,节点的 epoch 值(如果该节点是从节点,则为其主节点的 epoch 值),每当节点发生失败切换时,都会创建一个新的且递增的 epoch 值,如果多个节点竞争同一个哈希槽,epoch 值更高的节点更容易抢夺到
    • link-state:connected,集群总线使用的链接的状态,我们使用这个链接与集群中其他节点进行通信,值可以是 connected 或 disconnected
    • slot:0-5460,哈希槽值或者一个哈希槽范围,有关哈希槽值的内容在下面讲解

    哈希槽(slot)

    Redis 集群把把所有的物理节点(向外提供服务的 master)映射到 [0 - 16383] slot 上,即所有 master 均分 16384 大小的 slot 空间,每个 master 占有一定的 slot 空间

    当存储数据时,首先会对 key 使用 CRC16 算法进行加密,将得到的值 mod 16384,这样一来 key 的值始终在 0-16383 之间,Redis 则根据 key 值将其放入对应范围的节点,比如算出来的 key 值是 3000,7000 节点的 slot 空间是 [0 - 5460],那么就会放到 7000 节点,平均集群的压力

    同理,当获取数据时,也会对 Key 进行同样的计算,根据得到的值去对应的节点获取数据

    注意:slot 不是值集群所能存储数据的容量,16384 也并不是说只能存 16384 个键,它仅仅表示每个节点的一个存储范围,key 值落到那个范围,就找对应范围的节点服务

    以之前搭建的集群为例,客户端连接 7000 节点,存储一个测试数据,Redis 会自动计算 Key 值,如果计算结果在 7001 节点的范围,则重定向到 7001 节点存储

    在这里插入图片描述

    获取值也是同理

    在这里插入图片描述


    其他命令

    向集群动态添加主节点,先启动 7006 服务,再执行以下命令:

    # redis-cli --cluster add-node [新加入节点] [原始集群中任意节点]
    redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
    
    • 1
    • 2

    向集群动态添加从节点,先启动 7007 服务,再执行以下命令:

    # redis-cli --cluster add-node --cluster-slave [--master-id master节点id] [新加入节点] [原始集群中任意节点]
    # 如果没有指定主节点,redis会随机给副本数少的主节点添加当前副本节点
    redis-cli --cluster add-node --cluster-slave 127.0.0.1:7007 127.0.0.1:7000
    
    • 1
    • 2
    • 3

    这个时候我们查看集群状态,会发现新添加的 7006 节点没有分配 slot

    在这里插入图片描述

    没有 slot 是不能处理数据的,所以需要重新分配集群 slot

    # redis-cli --cluster reshard [原始集群中任意节点] --cluster-from [源slot节点id,多个id用逗号分隔] --cluster-to [接收slot节点id] --cluster-slots [分配slot大小]
    redis-cli --cluster reshard 127.0.0.1:7000 --cluster-from 28df8f39d35ad2ddaeddad2ef0b11c77f381a26a --cluster-to a8e9320b93498f2dcdc689e61ffec73f79d3a6d6 --cluster-slots 1024
    
    • 1
    • 2

    删除节点

    # redis-cli --cluster del-node [集群中任意节点] [删除节点id]
    redis-cli --cluster del-node 127.0.0.1:7000 ac949f85aa8becb811d1f0a46d18f41075e63051
    
    • 1
    • 2

  • 相关阅读:
    电子学会2021年3月青少年软件编程(图形化)等级考试试卷(三级)答案解析
    手机微信里面的文件打印步骤
    OceanBase存储层代码解读(四):宏块的垃圾回收和坏块检查
    二叉搜索树的实现
    跨平台游戏引擎 Axmol-2.1.3 发布
    【Docker】Docker安装与入门
    ssh secure shell Client连接问题
    贪吃蛇QT c++设计
    等保测评各个级别的详细内容
    知识图谱问答技术实践与探索
  • 原文地址:https://blog.csdn.net/CSDN_handsome/article/details/126560061