Redis系列(三):Redis集群的水平扩展与伸缩
一、Redis集群的水平扩展
Redis3.0版本以后,有了集群的功能,提供了比之前版本的哨兵模式更高的性能与可用性,但是集群的水平扩展却比较麻烦,接下来介绍下Redis高可用集群如何做水平扩展,在原集群的6个节点的基础上新增2个节点,由原来的3主3从变成4主4从,原先的3主3从部署详见Redis系列(二):Redis高可用集群,如下图:

二、水平扩展具体操作
① 将redis-5.0.2文件夹拷贝到新的主机192.168.160.154上去,(1)scp -r /usr/local/redis-5.0.2 root@192.168.160.154:/usr/local/ 进去到192.168.160.154主机 (2)cd /usr/local

② 新启动2个redis实例,然后检查是否启动成功 (1)/usr/local/redis-5.0.2/bin/redis-server /usr/local/redis-5.0.2/redis-cluster/700*/redis.conf (2)ps -ef | grep redis 查看是否启动成功

③ 查看redis集群的命令帮助 (1)cd /usr/local/redis-5.0.2 (2)bin/redis-cli --cluster help
create:创建一个集群host1:port1 ... hostN:portN
call:可以执行redis命令
add-node:将一个节点添加到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
del-node:移除一个节点
reshard:重新分片
check:检查集群状态
④ 使用add-node命令新增一个主节点192.168.160.154:7001(master),前面的ip:port为新增节点,后面的ip:port为集群中已存在节点(1)/usr/local/redis-5.0.2/bin/redis-cli --cluster add-node 192.168.160.154:7001 192.168.160.146:7001

⑤(1)连接任意一个客户端即可:./redis-cli -c -h -p (-a访问服务端密码,-c表示集群模式,指定ip地址和端口号)如:/usr/local/redis-5.0.2/bin/redis-cli -c -h 192.168.160.146 -p 700* (2)进行验证: cluster info(查看集群信息)、cluster nodes(查看节点列表)

⑥ 使用redis-cli命令为192.168.160.154:7001分配slots槽位,找到集群中的任意一个主节点,对其进行重新分片工作。(1)/usr/local/redis-5.0.2/bin/redis-cli --cluster reshard 192.168.160.146:7001
How many slots do you want to move (from 1 to 16384)? 4000
(ps:需要多少个槽移动到新的节点上,自己设置,比如4000个hash槽)
What is the receiving node ID? 44b0bd6cf056af7dbbfa0dd9497def1cfc21eb6d
(ps:把这4000个hash槽移动到哪个节点上去,需要指定节点id)
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node 1:all
(ps:输入all为从所有主节点中分别抽取相应的槽数指定到新节点中,抽取的总槽数为4000个;或者输入原节点ID然后输入done,意思将输入的节点ID,抽取的总槽数为4000个)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:输入yes确认开始执行分片任务)
⑦ 查看下最新的集群状态

⑧ 添加从节点192.168.160.154:7002到集群中去并查看集群状态
(1)/usr/local/redis-5.0.2/bin/redis-cli --cluster add-node 192.168.160.154:7002 192.168.160.146:7001

(2)cluster nodes

(3)如上图所示,还是一个master节点,没有被分配任何的hash槽。我们需要执行replicate命令来指定当前节点(从节点)的主节点id为哪个,首先需要连接新加的192.168.160.154:7002节点的客户端,然后使用集群命令进行操作,把当前的192.168.160.154:7002(slave)节点指定到一个主节点下(这里使用之前创建的192.168.160.154:7001主节点)
(3-1)/usr/local/redis-5.0.2/bin/redis-cli -c -h 192.168.160.154 -p 7002

(3-2)cluster replicate 44b0bd6cf056af7dbbfa0dd9497def1cfc21eb6d #后面这串id为192.168.160.154:7001的节点id

(3-2)cluster nodes

三、水平伸缩具体操作
目的还原成原始集群,如下图:

① 删除192.168.160.154:7002从节点,用del-node删除从节点192.168.160.154:7002,指定删除节点ip和端口,以及节点id(192.168.160.154:7002节点id)
(1)/usr/local/redis-5.0.2/bin/redis-cli --cluster del-node 192.168.160.154:7002 564963541c243365cbb20aed69e98048d21d68fd

(2)cluster nodes

② 删除192.168.160.154:7001主节点,这个步骤相对麻烦一些,因为主节点的里面是有分配了slots槽位,所以必须先把192.168.160.154:7001里的slots槽位放入到其他的可用主节点中去,然后再进行移除节点操作,不然会出现数据丢失问题(目前只能把master的数据迁移到一个节点上,暂时做不了平均分配功能)
(1)/usr/local/redis-5.0.2/bin/redis-cli --cluster reshard 192.168.160.154:7001
How many slots do you want to move (from 1 to 16384)? 4000
(ps:需要多少个槽移动到新的节点上,自己设置,比如4000个hash槽)
What is the receiving node ID? e7f80ba80749904838b6d779a0646e7f22313624
(ps:把这4000个hash槽移动到哪个节点上去,需要指定节点id)
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node 1:44b0bd6cf056af7dbbfa0dd9497def1cfc21eb6d
Source node 1:done
(ps:输入all为从所有主节点中分别抽取相应的槽数指定到新节点中,抽取的总槽数为4000个;或者输入原节点ID然后输入done,意思将输入的节点ID,抽取的总槽数为4000个)
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:输入yes确认开始执行分片任务)
(2)cluster nodes 已经成功的把192.168.160.154:7001主节点的数据迁移到192.168.160.146:7001上去了

(3)最后我们直接使用del-node命令删除192.168.160.154:7001主节点即可

(4)最后执行cluster nodes

Redis系列(三):Redis集群的水平扩展与伸缩的更多相关文章
- 一文掌握Redis的三种集群方案
在开发测试环境中,我们一般搭建Redis的单实例来应对开发测试需求,但是在生产环境,如果对可用性.可靠性要求较高,则需要引入Redis的集群方案.虽然现在各大云平台有提供缓存服务可以直接使用,但了解一 ...
- redis系列--深入哨兵集群
一.前言 在之前的系列文章中介绍了redis的入门.持久化以及复制功能,如果不了解请移步至redis系列进行阅读,当然我也是抱着学习的知识分享,如果有什么问题欢迎指正,也欢迎大家转载.而本次将介绍哨兵 ...
- redis的三种集群方式
redis有三种集群方式:主从复制,哨兵模式和集群. 1.主从复制 主从复制原理: 从服务器连接主服务器,发送SYNC命令: 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用 ...
- Redis实战(十三)Redis的三种集群方式
序言 能聊聊redis cluster集群模式的原理吗 资料 https://www.cnblogs.com/51life/p/10233340.html Redis 集群分片原理
- Dubbo源码学习总结系列三 dubbo-cluster集群模块
Dubbo集群模块的目的是将集群Invokers构造一个透明的Invoker对象,其中包含了容错机制.负载均衡.目录服务(服务地址集合).路由机制等,为RPC层提供高可用.高并发.自动发现.可治理的S ...
- redis(三) 集群 codis
参考文档 http://blog.csdn.net/ztsinghua/article/details/48134377
- Redis系列(三)-Redis发布订阅及客户端编程
阅读目录 发布订阅模型 Redis中的发布订阅 客户端编程示例 0.3版本Hredis 发布订阅模型 在应用级其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易 ...
- Redis系列三 Redis数据类型
一 .Redis的五大数据类型 1.String(字符串) string是redis最基本的数据类型,可以理解成与 Memached一模一样的数据类型,一个key对应一个value. string 类 ...
- redis解决方案之三种集群模式的概念与部署
上篇文章为大家总结了redis命令并讲述了持久化,今天我们来看一下redis的三种集群模式:主从复制,哨兵集群,Cluster集群 本篇文章先介绍redis-cluster集群模式,然后再依次介绍它的 ...
随机推荐
- redis入门(二)
目录 redis入门(二) 前言 持久化 RDB AOF 持久化文件加载 高可用 哨兵 流程 安装部署 配置技巧 集群 原理 集群搭建 参考文档 redis入门(二) 前言 在redis入门(一)简单 ...
- egg-mongoose --- nodejs
项目 egg + mongoose 项目结构 配置 egg 安装模块 npm i egg-mongoose --save config/pulgin.js exports.mongoose = { e ...
- python:__name__的使用
1.python中__name__是什么意思? 很多python的初学者可能都会遇到一个问题:__name__是什么意思? 在刚开始学习python的时候,我们总会看到这样一句代码: if __nam ...
- 很详细很详细的gitLab使用具体流程
gitLab详细流程 先说一下整个流程,就是先建立一个项目-----拆分里程碑-----拆分issue----项目开发-----项目总结---关闭里程碑 下面是每个步骤具体的步骤,这个比较适合那种纯新 ...
- html中<button>标签的type
HTML的<button>标签的type主要有三种可选值,reset.submit.button. 其中reset为重置按钮,用于清除form表单的数据:submit为提交按钮,点击后会对 ...
- [考试反思]0924csp-s模拟测试51:破碎
总参赛人数:15 有点菜. 不知道是撞了什么大运没有滚出A层. 但是一回到A层就暴露出了一个大问题:码速. 不是调试速度,,就是纯粹码的速度... 边讲考试状态边说吧... 上来肝T1.一看,是个换根 ...
- CSPS模拟 95
T_T flag彻底倒了 虽然打一开始就没觉得能实现过 可是我好桑心T_T skyh那个没素质的还一直bb T_T
- RocketMQ 主从同步若干问题答疑
目录 1.初识主从同步 2.提出问题 3.原理探究 3.1 RocketMQ主从读写分离机制 3.2 消息消费进度同步机制 4.总结 温馨提示:建议参考代码RocketMQ4.4版本,4.5版本引入了 ...
- 自己实现 aop 和 spring aop
上文说到,我们可以在 BeanPostProcessor 中对 bean 的初始化前化做手脚,当时也说了,我完全可以生成一个代理类丢回去. 代理类肯定要为用户做一些事情,不可能像学设计模式的时候创建个 ...
- 安装cnpm遇到的问题
安装 cnpm时,用git安装时,安装好node环境后,测试版本号node -v和npm -v都没问题,可以输出版本号,但是安装cnpm时,使用淘宝镜像安装后,会出现如下警告: 这个是提醒你安装的版本 ...