Redis Cluster

构建redis cluster。然后测试,操作redis cluster。redis集群中的data会自动被分片在跨多个reids nodeds.

参考官当点击这里

redis cluster 特点

  1. 自动分片dataset数据集到rediscluster的节点2中。自动哦!
  2. redis cluster提供持续使用操作数据功能,当出现集群中一些节点失败或者不能communicte和其它正常节点时。

搭建redis cluster

  • 下载

wget http://download.redis.io/releases/redis-5.0.5.tar.gz

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节点

  1. 首先节点得配置为cluster 模式,然后启动运行,端口不能与已存在的redis cluster 节点冲突。
  2. 然后执行以下命令:

    redis-cli --cluster add-node 127.0.0.1:your_new_port 127.0.0.1:7000

    这时候新节点就会处于myself,master 状态。
  3. 新节点目前的状态算是加入到了redis cluster,但是和其它节点不一样:首先,它是没有hash slots,即没有数据的;再,它是不会参加选举当一个slave想变为master时。
  4. 注意,当然可以通过重新分片,来给新节点分配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

  1. 使用 CLUSTER FAILOVER 去让master变为slave
  2. 等待master变为slave
  3. 然后就可以升级已经变成slave的节点
  4. 如果需要升级后再变为master,再触发一次cluster failover来转换

迁移到redis cluster

如果从单个master,或者其它情况要将数据迁移到redis cluster,那么就可能存在一些事务问题或者说是多key同时操作问题。

  1. 对于事务,多key操作,lua脚本,key都在用切不在同一个hash tag。这种情况redis cluster是无法解决的。
  2. 对于上述操作,如果是在同一个hash tag,这种redis cluster可以解决。
  3. 对于上述操作,如果多key其它并发连接没有被使用,这种redis cluster可以解决。

由于第一种情况无法解决,所以我们聚焦在2,3情况。

  1. 停止你的clients, 非自动实时迁移到redis cluster是可能的。你可能需要去编排一个实时的迁移在你的应用上下文幻境中。
  2. 生成一个 append only file 用于你的所有N master,利用 BGREWRITEAOF 命令, 然后等待AOF生成完成。
  3. 保存你的AOF 文件 从aof-1 到 aof-N , 到现在,你可以停止你的老的节点实例。
  4. 创建一个redis cluster 组成是 N master 0 slave,slave将后面来添加。确定你所有的节点使用aof开启。
  5. 停止所有的cluster节点,替换掉他们的AOF使用前面存在的AOF文件,aof-1 用于第一个节点,aof-2用于第二个节点, 知道aof-N。
  6. 重启所有的cluster节点使用新的aof文件。他们将完成 这些的keys不应该在这里 根据他们的配置。
  7. 使用 redis-cli --cluster fix 命令用于修复cluster,以至于所有的keys 将被迁移根据 the hash slots each node is authoritative or not
  8. 使用 redis-cli --cluster check 在最后,确定你的cluster 是ok的。
  9. 重启你所有的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的更多相关文章

  1. Redis for OPS 06:Redis Cluster 集群

    写在前面的话 前面的主从,HA 都只是解决我们数据安全性方面的问题,并没有解决我们业务瓶颈的问题.当业务并发到达一定瓶颈的时候,我们需要对服务进行横向扩展,而不是纵向扩展.这就需要引入另外一个东西,R ...

  2. Redis cluster学习 & Redis常识 & sort操作

    Redis中的5种数据类型String.Hash.List.Set.Sorted Set. Redis源码总代码一万多行. 这篇文章有一些Redis "常识" http://www ...

  3. 如何用docker部署redis cluster

    前言 由于本人是个docker控,不喜欢安装各种环境,而且安装redis-trib也有点繁琐,索性用docker来做redis cluster. 本文用的是伪集群,真正的集群放到不同的机器即可.端口是 ...

  4. Redis Cluster 4.0 on CentOS 6.9 搭建

    集群简介 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需 ...

  5. Redis Cluster 集群的实现和管理

    系统环境 CentOS 7 集群规划 在一台物理机(实际部署应当分散到多个物理机上),创建6个Redis节点,其中3个主节点.3个从节点. 节点表: IP 端口 主从 路径 192.168.1.21 ...

  6. Redis Cluster 分布式集群(下)

    Redis Cluster 搭建(工具) 环境准备 节点 IP 端口 节点① 172.16.1.121 6379,6380 节点② 172.16.1.122 6379,6380 节点③ 172.16. ...

  7. window下使用Redis Cluster部署Redis集群

    日常的项目很多时候都需要用到缓存.redis算是一个比较好的选择.一般情况下做一个主从就可以满足一些比较小的项目需要.在一些并发量比较大的项目可能就需要用到集群了,redis在Windows下做集群可 ...

  8. Redis Cluster 分区实现原理

    Redis Cluster本身提供了自动将数据分散到Redis Cluster不同节点的能力,分区实现的关键点问题包括:如何将数据自动地打散到不同的节点,使得不同节点的存储数据相对均匀:如何保证客户端 ...

  9. Redis Cluster

    使用 Redis Cluster Redis 3.0 在2015年出了Stable版本,3.0版本相对于2.8版本带来的主要新特性包括: 实现了Redis Cluster,从而做到了对集群的支持: 引 ...

随机推荐

  1. InfoQ一波文章:AdaSearch/JAX/TF_Serving/leon.bottou.org/Neural_ODE/NeurIPS_2018最佳论文

    和 Nested Partition 有相通之处? 伯克利提出 AdaSearch:一种用于自适应搜索的逐步消除方法 在机器学习领域的诸多任务当中,我们通常希望能够立足预先给定的固定数据集找出问题的答 ...

  2. js正则表达式常用方法总结

    1.test()  方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false. var patt = /e/; patt.test("The ...

  3. Python进阶-XIV 面向对象初步

    1.面向对象的引入 def Person(*args): ''' 定义一个人 :param args: 人的属性 :return: 人的所有属性的字典 ''' info = {} info['name ...

  4. Spring Cloud微服务安全实战_4-2_常见的微服务安全整体架构

    这个图适用于中小公司的微服务架构 微服务:SpringBoot 写的Rest服务 服务注册与发现:微服务所必备的.每个微服务都会到上边去注册.不管是微服务之间的调用,还是服务网关到微服务的转发,都是通 ...

  5. MySQL实战45讲学习笔记:第三十讲

    一.复习一下加锁规则 在第20和21篇文章中,我和你介绍了 InnoDB 的间隙锁.next-key lock,以及加锁规则.在这两篇文章的评论区,出现了很多高质量的留言.我觉得通过分析这些问题,可以 ...

  6. 区间DP(超详细!!!)

    一.问题 给定长为n的序列a[i],每次可以将连续一段回文序列消去,消去后左右两边会接到一起,求最少消几次能消完整个序列,n≤500. f[i][j]表示消去区间[i,j]需要的最少次数. 则; 若a ...

  7. 第09组 Beta冲刺(4/5)

    队名:观光队 链接 组长博客 作业博客 组员实践情况 王耀鑫 过去两天完成了哪些任务 文字/口头描述 学习 展示GitHub当日代码/文档签入记录 无 接下来的计划 完成短租车,页面美化 还剩下哪些任 ...

  8. 使用nodemon提高nodejs调试效率

    1.安装 nodemon 直接用npm安装既可,键入命令: npm -g install nodemon .如果不行,检查电脑有没有联网,联网后输入 sudo npm -g install nodem ...

  9. jq数字翻页效果,随机数字显示,实现上下翻动效果

    最近在做一个项目,需要实时展示一串数字,要有类似于日历翻页的效果,在网上找寻了一番,发现dataStatistics这个插件http://www.jq22.com/jquery-info8141能实现 ...

  10. Sitecore性化 - 您需要了解的4件事

    Sitecore非常强大,是一个数字体验平台.它可以帮助您取悦并留住客户.它可以帮助您衡量和评估广告系列.它使你成为一个更好的营销人员.它可以帮助您获得结果! 它结合了易于使用的网站内容管理系统和数字 ...