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()
    
  • 相关阅读:
    MySQL中的排序
    为什么删除记录表文件不会减小?(记录的插入与删除在磁盘上的变化)
    Mysql 中的MDL
    Redis 基础知识点总结
    分布式系统中的CAP理论与Base理论
    Java基础篇(JVM)——Class对象
    Java基础篇(JVM)——类加载机制
    Java基础篇(JVM)——总领
    数据结构与算法小结——排序(八)
    数据结构与算法小结——排序(七)
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/9373620.html
Copyright © 2011-2022 走看看