zoukankan      html  css  js  c++  java
  • Redis 集群

    即使有了主从复制,每个数据库都要保存整个集群中的所有数据,容易形成木桶效应。

    使用Jedis实现了分片集群,由客户端控制哪些key数据保存在哪个数据库中,如果在水平扩容时必须手动进行数据迁移,而且需要将整个集群停止服务,这样做非常不好的。

    Redis3.0版本的一大特性就是集群,接下来一起来看看Redis集群。

    架构:

    Redis集群特征:

     1. 所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

    2. 节点的Fail时通过集群中超过半数的节点检测失效时才生效。

    3. 客户端与Redis节点直连,不需要通过中间Proxy代理层,客户端不需要连接集群所有节点,连接集群中任何一个节点可用即可。

    4. Redis-Cluster把所有的物理节点映射到[0-16383]Slot(插槽)上,Cluster负责维护Node -> Slot -> Value

    Redis集群配置文件设置:

    port 7001
    #所在内网ip,不可写127.0.0.1
    bind 192.168.1.4
    pidfile /var/run/redis_7001.pid
    cluster-enabled yes
    cluster-config-file /Users/fubin/Nutstore/workspace/code/redis/redis-cluster/nodes-7001.conf
    cluster-node-timeout 15000

    启动redis-cluster:

     创建集群:

    $ src/redis-cli --cluster create 192.168.1.4:7001 192.168.1.4:7002 192.168.1.4:7003 

    集群连接日志如下:                                                                                                                                             

    >>> Performing hash slots allocation on 3 nodes...  在三个Redis节点上分配哈希槽
    Master[0] -> Slots 0 - 5460
    Master[1] -> Slots 5461 - 10922
    Master[2] -> Slots 10923 - 16383
    M: c8fefd567b9ca13b8cca16e792ab04b272540488 192.168.1.4:7001
       slots:[0-5460] (5461 slots) master
    M: eec2b901068d2665f2e83afc0d6c79efb5318420 192.168.1.4:7002
       slots:[5461-10922] (5462 slots) master
    M: 24193054913119744a55f8a68b959029de197486 192.168.1.4:7003
       slots:[10923-16383] (5461 slots) master
    Can I set the above configuration? (type 'yes' to accept): yes
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node  为每个节点分配不同的配置单元
    >>> Sending CLUSTER MEET messages to join the cluster  发送CLUSTER MEET 信息来加入集群
    Waiting for the cluster to join 等待集群加入
    .
    >>> Performing Cluster Check (using node 192.168.1.4:7001)
    M: c8fefd567b9ca13b8cca16e792ab04b272540488 192.168.1.4:7001
       slots:[0-5460] (5461 slots) master
    M: eec2b901068d2665f2e83afc0d6c79efb5318420 192.168.1.4:7002
       slots:[5461-10922] (5462 slots) master
    M: 24193054913119744a55f8a68b959029de197486 192.168.1.4:7003
       slots:[10923-16383] (5461 slots) master
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.

      进入集群客户端:在启动参数加-c,否则会报错

    $ src/redis-cli -h 192.168.1.4 -p 7001                                                                       ‹system›
    192.168.1.4:7001> set test 1
    (error) MOVED 6918 192.168.1.4:7002

    正确命令如下:

    src/redis-cli -c  -h 192.168.1.4 -p 7001

     在命令行里查看集群节点信息: 【节点id,身份,连接数,插槽数】

    192.168.1.4:7001> cluster nodes
    eec2b901068d2665f2e83afc0d6c79efb5318420 192.168.1.4:7002@17002 master - 0 1575162459358 2 connected 5461-10922
    24193054913119744a55f8a68b959029de197486 192.168.1.4:7003@17003 master - 0 1575162458338 3 connected 10923-16383
    c8fefd567b9ca13b8cca16e792ab04b272540488 192.168.1.4:7001@17001 myself,master - 0 1575162458000 1 connected 0-5460

    插槽值的计算: Key的有效部分使用CRC16算法计算出哈希值,再将哈希值对16384取余,得到插槽值。

      有效部分是什么?如果Key中包含了{符号,且在{符号后存在}符号,并且{和}之间至少有一个字符,则有效部分是指 {和}之间的部分。比如,key={hello},有效部分是hello,如果不满足以上条件,整个key都是有效部分,如key=hello_redis 有效部分是全部

    查看集群信息:

    192.168.1.4:7001> cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:3
    cluster_size:3
    cluster_current_epoch:3
    cluster_my_epoch:1
    cluster_stats_messages_ping_sent:32619
    cluster_stats_messages_pong_sent:32595
    cluster_stats_messages_fail_sent:2
    cluster_stats_messages_sent:65216
    cluster_stats_messages_ping_received:32593
    cluster_stats_messages_pong_received:32616
    cluster_stats_messages_meet_received:2
    cluster_stats_messages_received:65211

     槽位信息:

    192.168.1.4:7001> cluster  slots
    1) 1) (integer) 10923
       2) (integer) 16383
       3) 1) "192.168.1.4"
          2) (integer) 7003
          3) "24193054913119744a55f8a68b959029de197486"
    2) 1) (integer) 0
       2) (integer) 5460
       3) 1) "192.168.1.4"
          2) (integer) 7001
          3) "c8fefd567b9ca13b8cca16e792ab04b272540488"
    3) 1) (integer) 5461
       2) (integer) 10922
       3) 1) "192.168.1.4"
          2) (integer) 7002
          3) "eec2b901068d2665f2e83afc0d6c79efb5318420"

    登录集群,并执行以下命令,添加节点7004:

    CLUSTER MEET 192.168.1.4 7004

     再次查看集群信息:

    192.168.1.4:7001> cluster nodes
    1717631d255481d276f21416b6a383723bd22b19 192.168.1.4:7004@17004 master - 0 1575168757818 0 connected  新添加的节点没有分配槽位
    24193054913119744a55f8a68b959029de197486 192.168.1.4:7003@17003 master - 0 1575168758842 3 connected 10923-16383
    c8fefd567b9ca13b8cca16e792ab04b272540488 192.168.1.4:7001@17001 myself,master - 0 1575168759000 1 connected 0-5460
    eec2b901068d2665f2e83afc0d6c79efb5318420 192.168.1.4:7002@17002 master - 0 1575168759861 2 connected 5461-10922

    附录:Redis集群命令

    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 槽中的键。
  • 相关阅读:
    ARM板卡ftp客户端应用
    vsftp移植(待续)
    /dev/null脚本中作用
    amazeui.css
    将td中文字过长的部分变成省略号显示的小技巧
    div非弹出框半透明遮罩实现全屏幕遮盖css实现
    重新定位svn地址的方法(windows和linux),svn switch(sw)的帮助信息
    linux 下启动SVN服务
    用SVN checkout源码时,设置账号
    svn提示out of date
  • 原文地址:https://www.cnblogs.com/fubinhnust/p/11960596.html
Copyright © 2011-2022 走看看