zoukankan      html  css  js  c++  java
  • redis基础之redis-cluster(集群)(七)

    前言

    redis的主流高可用集群模式为redis-cluster.从redis3.0+版本后开始支持,自带集群管理工具redis-trib.rb。

    安装redis

    安装ruby支持

    • redis-trib.rb工具需要ruby环境的支持。
    apt -y install ruby # 安装ruby
    gem install redis # 加入redis
    

    启用redis-cluster集群模式

    • 修改redis.conf文件
    # 启用集群参数
    cluster-enabled yes
    cluster-config-file nodes-6379.conf
    cluster-node-timeout 15000
    
    • 相关的配置参数详解
    cluster-enabled <yes/no>:如果想在特定的Redis实例中启用Redis群集支持就设置为yes。 否则,实例通常作为独立实例启动。
    
    cluster-config-file <filename>:请注意,尽管有此选项的名称,但这不是用户可编辑的配置文件,而是Redis群集节点每次发生更改时自动保留群集配置(基本上为状态)的文件,以便能够 在启动时重新读取它。 该文件列出了群集中其他节点,它们的状态,持久变量等等。 由于某些消息的接收,通常会将此文件重写并刷新到磁盘上。
    
    cluster-node-timeout <milliseconds>:Redis群集节点可以不可用的最长时间,而不会将其视为失败。 如果主节点超过指定的时间不可达,它将由其从属设备进行故障切换。 此参数控制Redis群集中的其他重要事项。 值得注意的是,每个无法在指定时间内到达大多数主节点的节点将停止接受查询。
    
    cluster-slave-validity-factor <factor>:如果设置为0,无论主设备和从设备之间的链路保持断开连接的时间长短,从设备都将尝试故障切换主设备。 如果该值为正值,则计算最大断开时间作为节点超时值乘以此选项提供的系数,如果该节点是从节点,则在主链路断开连接的时间超过指定的超时值时,它不会尝试启动故障切换。 例如,如果节点超时设置为5秒,并且有效因子设置为10,则与主设备断开连接超过50秒的从设备将不会尝试对其主设备进行故障切换。 请注意,如果没有从服务器节点能够对其进行故障转移,则任何非零值都可能导致Redis群集在主服务器出现故障后不可用。 在这种情况下,只有原始主节点重新加入集群时,集群才会返回可用。
    
    cluster-migration-barrier <count>:主设备将保持连接的最小从设备数量,以便另一个从设备迁移到不受任何从设备覆盖的主设备。有关更多信息,请参阅本教程中有关副本迁移的相应部分。
    
    cluster-require-full-coverage <yes / no>:如果将其设置为yes,则默认情况下,如果key的空间的某个百分比未被任何节点覆盖,则集群停止接受写入。 如果该选项设置为no,则即使只处理关于keys子集的请求,群集仍将提供查询。
    
    • 注意:
    1. 启用redis-cluster集群模式后,所有的数据只能使用db0,其他的数据库是不可用的。

    2. slaveof简单的主从复制模型不可用。

    3. redis-cluster集群使用16384个散列槽存取数据,因此需要为新增的主节点分配散列槽,没有的话无法存取数据,从节点不需要分配散列槽。

    redis-trib.rb工具命令

    # 添加主节点
    redis-trib.rb add-node 新节点ip和port 旧的任意主节点
    # 添加从节点
    redis-trib.rb add-node --slave --master-id 主节点id 新节点ip和port 旧的任意主节点   
    
    # 查看所有的节点信息
    redis-trib.rb info 节点ip和port
    
    # 移除一个节点的散列槽
    redis-trib.rb reshard ip:port
    

    redis-cluster命令

    //集群(cluster)  
    CLUSTER INFO 打印集群的信息  
    CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。   
      
    //节点(node)  
    CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。  
    CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。  
    CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。  
    CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。   
      
    //槽(slot)  
    CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。  
    CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。  
    CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。  
    CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。  
    CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。  
    CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。  
    CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。   
      
    //键 (key)  
    CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。  
    CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。  
    CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
    

    客户端连接redis-cluster集群

    # 带上一个-c参数
    redis-cli -h ip -c -p port
    
    127.0.0.1:6380> set name caiwp
    -> Redirected to slot [5798] located at 172.17.0.3:6380
    OK
    # 键值被重定向
    
    • 注意:集群后如果单独连接redis实例,无法重定向,可能无法获取相关的键值。

    python连接redis-cluster集群

    • 安装
    pip install redis-py-cluster
    
    • 创建连接
    import rediscluster
    
    def redis_cluster():
        # 所有的节点列表
        redis_nodes =  [{'host': '192.168.1.21','port':6380,},
                        {'host': '192.168.1.21', 'port': 6381,},
                        {'host': '192.168.1.21', 'port': 6382,},
                        {'host': '192.168.1.21','port':6383,},
                        {'host': '192.168.1.21', 'port': 6384,},
                        {'host': '192.168.1.21', 'port': 6385,},
                       ]
        try:
            redisconn = rediscluster.StrictRedisCluster(startup_nodes=redis_nodes)
        except Exception as e:
            print(e)
    
        else:
            print(redisconn.get("name"))
    
    if __name__ == "__main__":
        redis_cluster()
    
  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/9373620.html
Copyright © 2011-2022 走看看