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集群模式,然后再依次介绍它的 ...
随机推荐
- Leetcode Tags(1)Linked List
1.知识点回顾 https://www.cnblogs.com/BigJunOba/p/9174206.html https://www.cnblogs.com/BigJunOba/p/9174217 ...
- Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类
一.String类 1.创建字符串对象 创建字符串对象有两种方法:直接用“=”或者使用“new String(...)” String aStr = "TMZ"; String b ...
- ORM之多表操作
一.创建模型 from django.db import models # Create your models here. class Book(models.Model): nid = model ...
- API 接口开发规范
整体规范建议采用RESTful 方式来实施. 协议 API与用户的通信协议,总是使用HTTPs协议,确保交互数据的传输安全. 域名 应该尽量将API部署在专用域名之下.https://api.exam ...
- Mongo 导出为csv文件
遇到需要从Mongo库导出到csv的情况,特此记录. 先贴上在mongo目录下命令行的语句: ./mongoexport -h 10.175.54.77 -u userName -p password ...
- 前端技术之:如何在vuex状态管理action异步调用结束后执行UI中的方法
一.问题的起源 最近在做vue.js项目时,遇到了vuex状态管理action与vue.js方法互相通信.互操作的问题.场景如下图所示: 二.第一种解决方法 例如,我们在页面初始化的时候,需要从服务端 ...
- USDT跑分系统开发
USDT跑分系统开发找[林生:178-7666-2415微/电],USDT跑分系统开发,USDT跑分系统解决方案,USDT跑分系统定制,小程序开发.APP.公众号等软件开发. 数字资产结算通道的特点: ...
- Java虚拟机之垃圾回收
简述 Java与那些较传统的语言比如C++有个很大不同就是垃圾回收策略了.前者通常是虚拟机自动帮我们做了,而后者就需要我们手动来完成. Java虚拟机帮我们完成了垃圾回收,是不是意味着我们就不用完全去 ...
- [考试反思]0922csp-s模拟测试50:谜朦
这辈子第5个rank1,是在长期状态低迷再度偶遇傻逼出题人然后总算在下午而不是晚上考了一场试 然后莫名其妙选对了头铁的题把其它暴力打满之后发现sdfz没有参加之后竞争减弱的综合结果. 说是在的其实这套 ...
- mine:dp
一个小的线性dp.方法很多,八仙过海各显神通. 我想讲一下我的: #include<cstdio> #define mod 1000000007 ];][][],n;//是不是雷,右边有没 ...