06. redis cluster
Redis Cluster
构建redis cluster。然后测试,操作redis cluster。redis集群中的data会自动被分片在跨多个reids nodeds.
参考官当点击这里
redis cluster 特点
- 自动分片dataset数据集到rediscluster的节点2中。自动哦!
- redis cluster提供持续使用操作数据功能,当出现集群中一些节点失败或者不能communicte和其它正常节点时。
搭建redis cluster
- 下载
tar xf redis-5.0.5.tar.gz
- 编译
cd redis-5.0.5
make
- 安装
make install PREFIX=/server/redis # PREFIX指定将编译好的redis相关二进制文件安装到指定目录。
- 安装后二进制文件路径
二进制文件将在PREFIX/bin目录下
- 构建redis cluster集群
1. 重新创建一个redis_cluster目录,用于部署每一个redis节点实例
2. 在redis_cluster目录下创建redis节点实例目录,已官网例子,6个节点实例,3主3从。
3. cd redis_cluster && mkdir 700{0,1,2,3,4,5} # 在集群目录中创建6个实例目录。
4. 然后在7000-7005 每个目录下创建一个redis.conf文件,作为每个节点的配置文件。
5. 集群节点最小配置项如下,添加到每个redis.conf文件中,但是要修改port为对应的目录号。
------redis.conf配置文件内容如下---------
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
------分割线----------------------------
6. 拷贝刚才安装的二进制路径bin下的redis-server到每个7000-7005目录下
7. 然后每个目录下执行 ./redis-server ./reids.conf 启动每个redis cluster 节点实例
8. 如果是redis 5 版本及以上。就直接可以利用redis-cli程序来构建new cluster,并检测和重新分片我们的redis集群数据。如果是5以下的版本参考[点击这里](https://redis.io/topics/cluster-tutorial)或者google, 我们都是用5版本来做。
9. 通过redis-cli命令来执行: redis-cli --cluster create 127.0.0.1:7000 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 --cluster-replicas 1
10. 集群的构建配置过程是一个自动化配置的过程,但是最后会询问是否配置,然后键入yes就可以了。
11. 当然在redis的源码目录的utils下有一个目录叫create-cluster 里面就包含了方便创建集群的工具,参考其中的README文件
12. 至此,redis cluster的简单搭建就完成了。
下面是执行redis-cli命令的输出
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7004 to 127.0.0.1:7000
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7003 to 127.0.0.1:7002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: cb891554949583a7a54edf59e33bec838a230274 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
M: cffc46853e7b8187172ccbfe2694065084eda1e7 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
M: 8756a8eb3b7803aa917be509d54a1294fbbf6be1 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
S: 558a8e71c5d7a41813539653ab3c8bd2ed98e8dc 127.0.0.1:7003
replicates 8756a8eb3b7803aa917be509d54a1294fbbf6be1
S: d30fa58dd88767dbc7b393f1cf8f51765562c30d 127.0.0.1:7004
replicates cb891554949583a7a54edf59e33bec838a230274
S: bcf8db2410a78b3aff9b071035e168bcfbd28e28 127.0.0.1:7005
replicates cffc46853e7b8187172ccbfe2694065084eda1e7
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
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: cb891554949583a7a54edf59e33bec838a230274 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: cffc46853e7b8187172ccbfe2694065084eda1e7 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 558a8e71c5d7a41813539653ab3c8bd2ed98e8dc 127.0.0.1:7003
slots: (0 slots) slave
replicates 8756a8eb3b7803aa917be509d54a1294fbbf6be1
S: bcf8db2410a78b3aff9b071035e168bcfbd28e28 127.0.0.1:7005
slots: (0 slots) slave
replicates cffc46853e7b8187172ccbfe2694065084eda1e7
S: d30fa58dd88767dbc7b393f1cf8f51765562c30d 127.0.0.1:7004
slots: (0 slots) slave
replicates cb891554949583a7a54edf59e33bec838a230274
M: 8756a8eb3b7803aa917be509d54a1294fbbf6be1 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
访问redis cluster
无论python,java, ruby还是go,node.js,都有额外客户端库访问redis cluster。这里就使用redis-cli来访问,特别处就是加上-c参数,就可以了。
redis-cli 访问redis cluster
1. redis-cli -c -p 7000 # 就可以通过7000的访问redis cluster集群了
不过redis-cli 是一个比较简单的客户端。比较好的客户端应该是缓存了hash slots与对应节点的地址,直接访问对应的node,而不用通过redirect
重新分片数据
新加master节点
- 首先节点得配置为cluster 模式,然后启动运行,端口不能与已存在的redis cluster 节点冲突。
- 然后执行以下命令:
redis-cli --cluster add-node 127.0.0.1:your_new_port 127.0.0.1:7000
这时候新节点就会处于myself,master 状态。 - 新节点目前的状态算是加入到了redis cluster,但是和其它节点不一样:首先,它是没有hash slots,即没有数据的;再,它是不会参加选举当一个slave想变为master时。
- 注意,当然可以通过重新分片,来给新节点分配hash slots。
新加一个复制slave节点
增加一个复制节点有两种方式:
方式一
redis-cli --cluster add-node 127.0.0.1:your_new_slave_port 127.0.0.1:7000 --cluster-slave
注意, 我们这里没有指定作为slave的master。这种情况,redis-cli将会添加这个新的slave到一个随机的master ,这个master缺少slave.
如果指定master,执行下面:
redis-cli --cluster add-node 127.0.0.1:your_new_slave_port 127.0.0.1:7000 --cluster-slave --cluster-master-id the_id_of_master
方式二
其实就是讲新节点通过添加为master的方式,然后命令行登录该节点,然后执行CLUSTER REPLICATE命令来指定变为slave.
执行命令如下:
>cluster replicate the_id_of_master
这条命令也可以将一个slave成为另一个master的slave.
删除一个节点
删除一个slave节点:
redis-cli --cluster del-node 127.0.0.1:7000 node-id
对于master节点的删除,master节点必须是空的,如果不是空,那么需要重新分片数据,将其数据重新分片到其它的master中。然后再删除已经变为空的master节点。
还有一种方案是,通过执行一个手动的failover操作,让它的slave变为master,再删除已经变为slave的节点。
灾备节点
如果每一个master都有slave,那么我们还可以在实例几个灾备slave节点,用于当一个master挡掉,只有一个slave时,这个slave变为master,而灾备的slave就会变为新master的slave,从而避免单master故障。
节点变为灾备节点通过:migration
升级或者需要重启节点
对于slave
很简单,只需要重启升级即可,没有其它影响。
对于master
- 使用 CLUSTER FAILOVER 去让master变为slave
- 等待master变为slave
- 然后就可以升级已经变成slave的节点
- 如果需要升级后再变为master,再触发一次cluster failover来转换
迁移到redis cluster
如果从单个master,或者其它情况要将数据迁移到redis cluster,那么就可能存在一些事务问题或者说是多key同时操作问题。
- 对于事务,多key操作,lua脚本,key都在用切不在同一个hash tag。这种情况redis cluster是无法解决的。
- 对于上述操作,如果是在同一个hash tag,这种redis cluster可以解决。
- 对于上述操作,如果多key其它并发连接没有被使用,这种redis cluster可以解决。
由于第一种情况无法解决,所以我们聚焦在2,3情况。
- 停止你的clients, 非自动实时迁移到redis cluster是可能的。你可能需要去编排一个实时的迁移在你的应用上下文幻境中。
- 生成一个 append only file 用于你的所有N master,利用 BGREWRITEAOF 命令, 然后等待AOF生成完成。
- 保存你的AOF 文件 从aof-1 到 aof-N , 到现在,你可以停止你的老的节点实例。
- 创建一个redis cluster 组成是 N master 0 slave,slave将后面来添加。确定你所有的节点使用aof开启。
- 停止所有的cluster节点,替换掉他们的AOF使用前面存在的AOF文件,aof-1 用于第一个节点,aof-2用于第二个节点, 知道aof-N。
- 重启所有的cluster节点使用新的aof文件。他们将完成 这些的keys不应该在这里 根据他们的配置。
- 使用 redis-cli --cluster fix 命令用于修复cluster,以至于所有的keys 将被迁移根据 the hash slots each node is authoritative or not
- 使用 redis-cli --cluster check 在最后,确定你的cluster 是ok的。
- 重启你所有的clistes 被改为使用redis cluster aware client library.
这里有另一个方式去import data 从已存在的instances到redis cluster, 就是使用 redis-cli --cluster import 命令。
命令删除所有的keys 在运行中的instanc 到指定 已存在的 redis cluster. 然而,注意 如果你使用redis 2.8 实例作为这个source instance 操作可能慢,因为2.8 没有实现migrate 连接缓存,所以你可能想重启你的source instance使用reids 3.x before to perform such operation。
06. redis cluster的更多相关文章
- Redis for OPS 06:Redis Cluster 集群
写在前面的话 前面的主从,HA 都只是解决我们数据安全性方面的问题,并没有解决我们业务瓶颈的问题.当业务并发到达一定瓶颈的时候,我们需要对服务进行横向扩展,而不是纵向扩展.这就需要引入另外一个东西,R ...
- Redis cluster学习 & Redis常识 & sort操作
Redis中的5种数据类型String.Hash.List.Set.Sorted Set. Redis源码总代码一万多行. 这篇文章有一些Redis "常识" http://www ...
- 如何用docker部署redis cluster
前言 由于本人是个docker控,不喜欢安装各种环境,而且安装redis-trib也有点繁琐,索性用docker来做redis cluster. 本文用的是伪集群,真正的集群放到不同的机器即可.端口是 ...
- Redis Cluster 4.0 on CentOS 6.9 搭建
集群简介 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需 ...
- Redis Cluster 集群的实现和管理
系统环境 CentOS 7 集群规划 在一台物理机(实际部署应当分散到多个物理机上),创建6个Redis节点,其中3个主节点.3个从节点. 节点表: IP 端口 主从 路径 192.168.1.21 ...
- Redis Cluster 分布式集群(下)
Redis Cluster 搭建(工具) 环境准备 节点 IP 端口 节点① 172.16.1.121 6379,6380 节点② 172.16.1.122 6379,6380 节点③ 172.16. ...
- window下使用Redis Cluster部署Redis集群
日常的项目很多时候都需要用到缓存.redis算是一个比较好的选择.一般情况下做一个主从就可以满足一些比较小的项目需要.在一些并发量比较大的项目可能就需要用到集群了,redis在Windows下做集群可 ...
- Redis Cluster 分区实现原理
Redis Cluster本身提供了自动将数据分散到Redis Cluster不同节点的能力,分区实现的关键点问题包括:如何将数据自动地打散到不同的节点,使得不同节点的存储数据相对均匀:如何保证客户端 ...
- Redis Cluster
使用 Redis Cluster Redis 3.0 在2015年出了Stable版本,3.0版本相对于2.8版本带来的主要新特性包括: 实现了Redis Cluster,从而做到了对集群的支持: 引 ...
随机推荐
- InfoQ一波文章:AdaSearch/JAX/TF_Serving/leon.bottou.org/Neural_ODE/NeurIPS_2018最佳论文
和 Nested Partition 有相通之处? 伯克利提出 AdaSearch:一种用于自适应搜索的逐步消除方法 在机器学习领域的诸多任务当中,我们通常希望能够立足预先给定的固定数据集找出问题的答 ...
- js正则表达式常用方法总结
1.test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false. var patt = /e/; patt.test("The ...
- Python进阶-XIV 面向对象初步
1.面向对象的引入 def Person(*args): ''' 定义一个人 :param args: 人的属性 :return: 人的所有属性的字典 ''' info = {} info['name ...
- Spring Cloud微服务安全实战_4-2_常见的微服务安全整体架构
这个图适用于中小公司的微服务架构 微服务:SpringBoot 写的Rest服务 服务注册与发现:微服务所必备的.每个微服务都会到上边去注册.不管是微服务之间的调用,还是服务网关到微服务的转发,都是通 ...
- MySQL实战45讲学习笔记:第三十讲
一.复习一下加锁规则 在第20和21篇文章中,我和你介绍了 InnoDB 的间隙锁.next-key lock,以及加锁规则.在这两篇文章的评论区,出现了很多高质量的留言.我觉得通过分析这些问题,可以 ...
- 区间DP(超详细!!!)
一.问题 给定长为n的序列a[i],每次可以将连续一段回文序列消去,消去后左右两边会接到一起,求最少消几次能消完整个序列,n≤500. f[i][j]表示消去区间[i,j]需要的最少次数. 则; 若a ...
- 第09组 Beta冲刺(4/5)
队名:观光队 链接 组长博客 作业博客 组员实践情况 王耀鑫 过去两天完成了哪些任务 文字/口头描述 学习 展示GitHub当日代码/文档签入记录 无 接下来的计划 完成短租车,页面美化 还剩下哪些任 ...
- 使用nodemon提高nodejs调试效率
1.安装 nodemon 直接用npm安装既可,键入命令: npm -g install nodemon .如果不行,检查电脑有没有联网,联网后输入 sudo npm -g install nodem ...
- jq数字翻页效果,随机数字显示,实现上下翻动效果
最近在做一个项目,需要实时展示一串数字,要有类似于日历翻页的效果,在网上找寻了一番,发现dataStatistics这个插件http://www.jq22.com/jquery-info8141能实现 ...
- Sitecore性化 - 您需要了解的4件事
Sitecore非常强大,是一个数字体验平台.它可以帮助您取悦并留住客户.它可以帮助您衡量和评估广告系列.它使你成为一个更好的营销人员.它可以帮助您获得结果! 它结合了易于使用的网站内容管理系统和数字 ...