`
carlosfu
  • 浏览: 571492 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Ba8b5055-9c58-3ab0-8a1c-e710f0495d2c
BigMemory实战与理...
浏览量:29988
53b2087e-c637-34d2-b61d-257846f73ade
RedisCluster开...
浏览量:149057
C9f66038-7478-3388-8086-d20c1f535495
缓存的使用与设计
浏览量:122658
社区版块
存档分类
最新评论

Redis-Cluster实战--8.Redis-Cluster水平扩容(redis-cli实现版)

阅读更多

 

转载请注明出处哈:http://carlosfu.iteye.com/blog/2240426


   

一、目的

Redis-Cluster是Redis的分布式解决方案,Redis Cluster提供了在线扩容(添加分片)功能,有效扩展存储能力和读写能力。

 

水平扩容思路如下:

1. 启动新的Redis实例。

2. 集群中的机器meet上述Redis实例,将其加入集群。

3. 由于新的实例没有指派槽,所以要将部分其他实例上面的槽迁移至新的实例。

 

 

二、具体实现:(已建立好的集群参考http://carlosfu.iteye.com/blog/2242578

准备数据,使用hashtag生成数据到指定slot上

for num in `seq 100 1000`
do
  redis-cli -c -p 8002 set {aa}${num} ${num}
done

  

 

1.  启动新的Redis实例,端口是8006:

sed 's/8000/8006/g' redis-8000.conf > redis-8006.conf
redis-server /opt/soft/redis/conf/redis-8006.conf

  

2.  将8006加入集群:

redis-cli -c -p 8000 cluster meet 127.0.0.1 8006

 

  

3. 迁移slot, 这个实现起来比较麻烦,具体步骤如下:将(8002上的slot-15495 slot-15496分配给8006)

对目标节点发送`CLUSTER SETSLOT <slot> IMPORTING <source_node_id>`命令,表示目标节点将从源节点迁移slot;
对源节点发送`CLUSTER SETSLOT <slot> MIGRATING <target_node_id>`命令,表示源节点将向目标节点迁移slot;
对源节点发送`CLUSTER GETKEYSINSLOT <slot> <count>`命令,表示从slot中取出count个key/value对的key;执行如下:
对源节点发送`MIGRATE <target_ip> <target_port> <key_name> 0 <timeout>`命令,表示将key迁移到目标
重复执行步骤3和4,直到该slot中所有的key都被迁移完毕;
向集群中的迁移双方节点发送`CLUSTER SETSLOT <slot> NODE <target_node_id>`,表示告诉集群,将该slot分配给目标节点
等待集群的状态变为OK;(cluster info中的cluster_state:ok

 

 

(1). 对目标节点发送`CLUSTER SETSLOT <slot> IMPORTING <source_node_id>`命令,表示目标节点将从源节点迁移slot

sh target-import.sh 8002 8006 15495 15496

  

   target-import.sh

source=$1
target=$2
startSlot=$3
endSlot=$4
for slot in `seq ${startSlot} ${endSlot}`
do
	redis-cli -c -p ${target} cluster setslot ${slot} IMPORTING `redis-cli -c -p ${target} cluster nodes | grep ${source} | awk '{print $1}'`
done

  

(2). 对源节点发送`CLUSTER SETSLOT <slot> MIGRATING <target_node_id>`命令,表示源节点将向目标节点迁移slot;

sh source-migrate.sh 8002 8006 15495 15496

 

    source-migrate.sh 

source=$1
target=$2
startSlot=$3
endSlot=$4
for slot in `seq ${startSlot} ${endSlot}`
do
	redis-cli -c -p ${source} cluster setslot ${slot} MIGRATING `redis-cli -c -p ${source} cluster nodes | grep ${target} | awk '{print $1}'`
done

  

(3). 对源节点发送`CLUSTER GETKEYSINSLOT <slot> <count>`命令,表示从slot中取出count个key/value对的key;执行如下:

    对源节点发送`MIGRATE <target_ip> <target_port> <key_name> 0 <timeout>`命令,表示将key迁移到目标

(4). 重复执行步骤3和4,直到该slot中所有的key都被迁移完毕

(5). 向集群中的迁移双方节点发送`CLUSTER SETSLOT <slot> NODE <target_node_id>`,表示告诉集群,将该slot分配给目标节点

sh migrate-data.sh 8002 8006 15495 15496

 

   migrate-data.sh

source=$1
target=$2
startSlot=$3
endSlot=$4
for slot in `seq ${startSlot} ${endSlot}`
do
    while [ 1 -eq 1 ]
    do
        allkeys=`redis-cli -c -p ${source} cluster getkeysinslot ${slot} 20`
        if [ !-z ${allkeys} ]
        then
            redis-cli -c -p ${source} cluster setslot ${slot} NODE `redis-cli -c -p ${source} cluster nodes | grep ${target} | awk '{print $1}'`
            redis-cli -c -p ${target} cluster setslot ${slot} NODE `redis-cli -c -p ${source} cluster nodes | grep ${target} | awk '{print $1}'`
            break
        else
            for key in ${allkeys}
            do
                echo "slot ${slot} key ${key}"
                redis-cli -c -p ${source} MIGRATE 127.0.0.1 ${target} ${key} 0 5000
            done
        fi
    done
done

  

(6). 等待集群的状态变为OK;(cluster info中的cluster_state:ok)

127.0.0.1:8000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:7
cluster_size:5
cluster_current_epoch:7
cluster_my_epoch:1
cluster_stats_messages_sent:193766
cluster_stats_messages_received:193765

  

 

分享到:
评论

相关推荐

    redis-cluster-5.0.7.tar.gz

    redis集群配置文件 redis-cluster

    docker-redis-cluster-master.tar.gz 集群

    初始化3主3从集群redis-cli --cluster create 192.168.0.224:6391 192.168.0.224:6392 192.168.0.224:6393 192.168.0.224:6394 192.168.0.224:6395 192.168.0.224:6396 --cluster-replicas 1 连接集群测试 redis-cli...

    redis5离线安装文件包,包含redis-5.0.14.tar.gz和redis-4.6.0.gem

    redis-5.0.14/src/redis-cli --cluster create 192.168.129.98:7000 192.168.129.99:7003 192.168.129.99:7002 192.168.129.126:7005 192.168.129.126:7004 192.168.129.98:7001 --cluster-replicas

    redis-cluster redis伪集群文件

    3、./redis-cluster-start-all.sh 开启reids 4、执行 ./redis-trib.rb create --replicas 1 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 127.0.0.1:7006 5、验证集群已经启动 ps -...

    Redis-5.0.0集群配置

     本文参考官方文档而成:http://redis.io/topics/cluster-tutorial,不适用redis-5.0.0以下版本,原因是从redis-5.0.0版本开始,redis-trib.rb的功能被redis-cli替代了。  redis-5.0.0以下版本的安装和部署,可...

    redis-4.0.11 已编译版本

    redis-4.0.11包通过centos7 make编译,在目录src下有redis-trib.rb、redis-cli、redis-server可以直接使用,搭建redis-cluster集群。

    redis-5.0.0.zip

    Check `redis-cli --cluster help` for more info. 5. New sorted set commands: ZPOPMIN/MAX and blocking variants. 6. Active defragmentation version 2. 7. Improvemenets in HyperLogLog implementations. 8....

    redis-5.0.2.tar.gz

    Redis 5.0 is the first version of Redis to introduce the new stream data type with consumer groups, sorted sets blocking pop operations, LFU/LRU info in RDB, Cluster manager inside redis-cli, active ...

    redis-cluster-in-docker-osx

    osx上Docker中的Redis集群使用7000〜7005的端口启动redis集群bash start.sh连接到集群 redis-cli -c -p 7000停止集群 docker-compose down安装redis-cli brew install redis-clicli中的示例输出 ○ → redis-cli -c ...

    Redis-Essentials.pdf

    Chapter 8, Scaling Redis (Beyond a Single Instance), introduces RDB and AOF persistence, replication via Redis slaves, and different methods of partitioning data across different hosts. This chapter ...

    redis-5.9.101(6.0-rc1)-x64-windows-bin.rar

    Redis 6 RC1 发布了,项目创建人 antirez 在博客中介绍,这是迄今最“企业”化的版本(SSL 与 ACL 等特性与企业极相关)...Redis Cluster 代理与 Redis 6 一起发布(不同仓库) Redis 6 发布 Disque 模块(不同仓库)

    redis-6.0.3 Release.rar

    redis-6.0.3 最新版exe可执行文件,redis6最大变化 就是加入了对多线程的支持。 一、对用户使用有直接影响的功能 ACL用户权限控制功能 RESP3:新的 Redis 通信协议 Cluster 管理工具 SSL 支持 二、Redis 内部的优化...

    redis-cluster-vagrant-example

    Redis Cluster Vagrant...无所事事地无所事事ssh redis01 redis-cli -a pass --cluster create 10.11.8.2:6379 10.11.8.3:6379 10.11.8.4:6379 10.11.8.5:6379 10.11.8.6:6379 10.11.8.7:6379 --cluster-replicas 1个

    linux部署redis集群遇到的问题

    1、在java程序中,连接不上redisCluster。 报错信息: no reachable node in cluster 原因:创建集群时,使用了127.0.0.1,要改为公网ip才行。 redis-cli –cluster create 127.0.0.1:7001 127.0.0.1:7002 解决方法...

    redis 5.0 rc1 windows

    通过`redis-cli --cluster help`以了解更多信息 新的 sorted set 命令:ZPOPMIN / MAX 和阻塞变量 主动碎片整理 V2 增强 HyperLogLog 实现 更好的内存统计报告 许多带有子命令的命令现在都有一个 HELP 子命令 ...

    Linux(Centos7)下redis5集群搭建和使用说明详解

    The cluster manager was ported from Ruby (redis-trib.rb) to C code inside redis-cli. check `redis-cli –cluster help ` for more info. 可以查看Redis官网查看集群搭建方式,连接如下 https

    docker-rediscluster:用于设置一次性 redis 集群以测试哨兵故障转移的 Docker 脚本

    docker-rediscluster 设置一次性 redis 集群以测试哨兵故障转移。 拓扑 redis_0 - 主 redis_1 - redis_0 的从属 sentinel_0 sentinel_1 sentinel_2 哨兵配置了具有以下属性的“测试”实例 - down-after-...

    redis-aof-to-plain-converter

    redis-aof-to-plain-converter 用于将数据从 aof 文件导入到具有不同配置的新 redis-cluster 的简单工具工具转换 *2$6SELECT$10*8$5HMSET$13HSET:USER:cms$8password$40fdaad7328c6da36e8cc63409d6acc5109bfa463b$10...

    Redis批量删除KEY的方法

    Redis 中有删除单个 Key 的指令 DEL,但...//如:/opt/redis/redis-cli keys “*” | xargs /opt/redis/redis-cli del 如果要指定 Redis 数据库访问密码,使用下面的命令: 代码如下: redis-cli -a password keys “*

    redis获取命令字典的方法及全部的group命令.txt

    本地安装redis,通过安装目录下的redis客户端程序可以连接任意Redis服务(只要服务端是启动着的),命令 redis-cli -h ip -p port。如果服务端要求认证资格,可能还要输入用户名密码等参数。 Redis命令十分丰富,...

Global site tag (gtag.js) - Google Analytics