前言

Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到广泛的使
用。
Redis在2015年发布了3.0.0,官方支持了redis cluster。至此结束了redis没有集群的时代,之
前使用的redis cluster 最多的是twitter发布的Twemproxy
还有就是豌豆荚开发的codis

1 redis cluster 理论知识

** Redis Cluster设计要点**
redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点
都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和
其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个
节点,就可以获取到其他节点的数据。

那么redis 是如何合理分配这些节点和数据的呢?

Redis Cluster没有使用传统的一致性哈希来分配数据,而是采用另外一种叫
做 哈希槽(hash slot) 的方式来分配的。 redis cluster 默认分配了16384个 slot ,当我
们 set 一个 key 时,会采用 CRC16 算法来 取模 得到所属的 slot ,然后将这个 key 分到哈希槽
区间的节点上,具体算法就是: CRC16(key) % 16384 。
注意的是:必须要3个以上的主节点,否则创建集群时会失败。

所以,我们假设现在有3个节点已经部署成 redis cluster ,分别是:A,B,C三个节点,他们
可以是一台机器上的三个端口,也可以是三台不同的服务器,那么采用哈希槽 (hash slot) 的
方式来分配16384个slot,它们三个节点分别承担的 slot 区间是:
节点A覆盖0-5460;
节点B覆盖5461-10922;
节点C覆盖10923-16383.

那么,现在我想设置一个 key ,比如叫 my_name :

set my_name linux

按照 redis cluster 的哈希槽算法: CRC16(‘my_name’)%16384 = 2412 。 那么就会把这个
key 的存储分配到 A 上了。
同样,当连接(A,B,C)任何一个节点想获取 my_name 这个 key 时,也会这样的算法,然后内部
跳转到B节点上获取数据。
这种哈希槽的分配方式有好也有坏,好处就是很清晰,比如想新增一个节点
D, redis cluster 的这种做法是从各个节点的前面各拿取一部分 slot 到D上,会在接下来
的实践中实验。大致就会变成这样:
节点A覆盖1365-5460
节点B覆盖6827-10922
节点C覆盖12288-16383
节点D覆盖0-1364,5461-6826,10923-12287
同样删除一个节点也是类似,移动完成后就可以删除这个节点了。
所以redis cluster 就是这样的一个形状:

2 Redis Cluster主从模式

redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从
节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会
有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。

上面例子里, 集群有ABC三个主节点,如果这3个节点都没有加入从节点,如果B挂掉了,我们就
无法访问整个集群了。A和C的 slot 也无法访问。

所以在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点
A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。

B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地
提供服务。 当B重新开启后,它就会变成B1的从节点。

不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正常的提供服务了。

3 redis cluster 实践

按照官方的教程,全程再演示一次,官方教程是在一台机器上启动6个节点,3个主,3个从
(http://redis.io/topics/cluster-tutorial):
下载官方的redis 版本(3.2.5) :

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

解压

[root@web3 ~]# tar zxvf redis-3.2.5.tar.gz

安装

[root@web3 ~]# cd redis-3.2.5
[root@web3 ~]# make && make install

将redis-trib.rb 复制到/usr/local/bin

[root@web3 redis-3.2.5]# cd src/
[root@web3 src]# cp redis-trib.rb /usr/local/bin

开始集群搭建

[root@web3 redis-3.2.5]# vi redis.conf
#修改以下地方
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

新建6个节点:

将redis.conf 分别拷贝到这6个文件夹中,并修改成对应的端口号

[root@web3 redis-3.2.5]# mkdir -p /usr/local/cluster-test
[root@web3 redis-3.2.5]# cd /usr/local/cluster-test/
[root@web3 cluster-test]# mkdir 7000
[root@web3 cluster-test]# mkdir 7001
[root@web3 cluster-test]# mkdir 7002
[root@web3 cluster-test]# mkdir 7003
[root@web3 cluster-test]# mkdir 7004
[root@web3 cluster-test]# mkdir 7005

拷贝配置文件

[root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
luster-test/7000
[root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
luster-test/7001
[root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
luster-test/7002
[root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
luster-test/7003
[root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
luster-test/7004
[root@web3 cluster-test]# cp /root/redis-3.2.5/redis.conf /usr/local/c
luster-test/7005

修改端口号

[root@web3 cluster-test]# sed -i "s/7000/7001/g"
/usr/local/cluster-test/7001/redis.conf
[root@web3 cluster-test]# sed -i "s/7000/7002/g"
/usr/local/cluster-test/7002/redis.conf
[root@web3 cluster-test]# sed -i "s/7000/7003/g"
/usr/local/cluster-test/7003/redis.conf
[root@web3 cluster-test]# sed -i "s/7000/7004/g"
/usr/local/cluster-test/7004/redis.conf
[root@web3 cluster-test]# sed -i "s/7000/7005/g"
/usr/local/cluster-test/7005/redis.conf

启动这6个节点

[root@web3 cluster-test]# cd /usr/local/cluster-test/7000/
[root@web3 7000]# redis-server redis.conf
[root@web3 7000]# cd ../7001
[root@web3 7001]# redis-server redis.conf
[root@web3 7001]# cd ../7002
[root@web3 7002]# redis-server redis.conf
[root@web3 7002]# cd ../7003
[root@web3 7003]# redis-server redis.conf
[root@web3 7003]# cd ../7004
[root@web3 7004]# redis-server redis.conf
[root@web3 7004]# cd ../7005
[root@web3 7005]# redis-server redis.conf
[root@web3 7005]#

查看6个节点的启动进程情况:

[root@web3 7005]# ps -ef|grep redis
root 11380 1 0 07:37 ? 00:00:00 redis-server *:7000
[cluster]
root 11384 1 0 07:37 ? 00:00:00 redis-server *:7001
[cluster]
root 11388 1 0 07:37 ? 00:00:00 redis-server *:7002
[cluster]
root 11392 1 0 07:37 ? 00:00:00 redis-server *:7003
[cluster]
root 11396 1 0 07:37 ? 00:00:00 redis-server *:7004
[cluster]
root 11400 1 0 07:37 ? 00:00:00 redis-server *:7005
[cluster]
root 11404 8259 0 07:38 pts/0 00:00:00 grep redis

将6个节点连在一起构成集群

需要用到的命令就是redis-trib.rb,这是官方的一个用ruby写的一个操作redis cluster的
命令,所以,你的机器上需要安装ruby。我们先试一下这个命令:

redis-trib.rb create --replicas 1 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

因为我们要新建集群, 所以这里使用create命令. --replicas 1 参数表示为每个主节点创建
一个从节点. 其他参数是实例的地址集合。

[root@web3 7005]# yum install ruby ruby-devel rubygems rpm-build
[root@web3 7005]# gem install redis
Successfully installed redis-3.2.1
1 gem installed
Installing ri documentation for redis-3.2.1...
Installing RDoc documentation for redis-3.2.1...
[root@web3 7005]# redis-trib.rb create --replicas 1 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:7
005
>>> Creating cluster
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7004: OK
Connecting to node 127.0.0.1:7005: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
S: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003
replicates 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4
S: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004
replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c
S: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005
replicates dfa0754c7854a874a6ebd2613b86140ad97701fc
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: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
M: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003
slots: (0 slots) master
replicates 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4
M: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004
slots: (0 slots) master
replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c
M: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005
slots: (0 slots) master
replicates dfa0754c7854a874a6ebd2613b86140ad97701fc
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

期待下次的分享,别忘了三连支持博主呀~
我是 念舒_C.ying ,期待你的关注~

Redis集群研究和实践(基于redis 3.2.5)(一)的更多相关文章

  1. Redis集群研究和实践(基于redis 3.0.5)

    前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的2.x的稳定版本是2.8.19,也是我们项目中普遍用到的版本. redis在年初发布了3.0. ...

  2. Redis集群环境搭建实践

    0 Redis集群简介 Redis集群(Redis Cluster)是Redis提供的分布式数据库方案,通过分片(sharding)来进行数据共享,并提供复制和故障转移功能.相比于主从复制.哨兵模式, ...

  3. redis集群热扩展(基于4.0.9)

    1:环境说明,首先说一下要做的事情,我们要迁移redis集群槽位,现有redis集群环境如下 我们看一下集群的基本信息: > cluster nodes 8ea64a0049e0b193296a ...

  4. Spring集成Redis集群(含spring集成redis代码)

    代码地址如下:http://www.demodashi.com/demo/11458.html 一.准备工作 安装 Redis 集群 安装参考: http://blog.csdn.net/zk6738 ...

  5. dis集群研究和实践(基于redis 3.0.5) 《转载》

    https://www.cnblogs.com/wxd0108/p/5798498.html 前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的 ...

  6. [转载] Redis集群搭建最佳实践

    转载自http://blog.csdn.net/sweetvvck/article/details/38315149?utm_source=tuicool 要搭建Redis集群,首先得考虑下面的几个问 ...

  7. Redis集群搭建最佳实践

    要搭建Redis集群.首先得考虑以下的几个问题; Redis集群搭建的目的是什么?或者说为什么要搭建Redis集群? Redis集群搭建的目的事实上也就是集群搭建的目的.全部的集群主要都是为了解决一个 ...

  8. Redis集群(二):Redis的安装

    官方网站:http://redis.io/ 本系列撒使用的版本是:3.0.0 一.安装必要包 yum -yinstall gcc 二.linux下安装及使用(wget下载到当前目录) redis-3. ...

  9. Redis集群进阶之路

    Redis集群规范 本文档基于Redis 3.X或更高版本,讲解Redis集群算法以及设计原理.此官方文档长期更新且随着Redis新版本特性的变化变动,详细请留意官网. 官网地址:https://re ...

  10. Bash实践:抽样检测数据迁移至Redis集群后的数据一致性

    熟悉了一段时间的Bash编程,因此借此任务操作一把bash编程,主要涉及到Redis单节点与Redis集群的操作 1. 任务背景 近日有个任务需要将历史的Redis(主从节点)中的数据迁移至Redis ...

随机推荐

  1. 如何用 refcursor 返回结果集

    可以通过返回 Refcursor 类型的函数,或者out 类型的函数或 procedure 返回结果集. 一.返回refcursor 类型的函数 create or replace function ...

  2. STL再回顾(非常见知识点)

    目录 为人熟知的pair类型 再谈STL 迭代器的使用 常用的STL容器 顺序容器 vector(向量) 构造方式 拥有的常用的成员函数(java人称方法) string 构造方式 成员函数 dequ ...

  3. 跟羽夏学 Ghidra ——数据

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  4. [AI]-模型测试和评价指标

    模型测试 import cv2 from torchvision import transforms, datasets, models from torch.utils.data import Da ...

  5. Traefik开启监控,日志,追踪需要的参数

    监控 官方文档地址:https://doc.traefik.io/traefik/observability/metrics/overview/ 可以使用多种监控软件,比如Datadog,Influx ...

  6. Elasticsearch:mapping定制

  7. tcp_tw_recycle参数引发的系统问题

    文章转载自: https://blog.csdn.net/zhuyiquan/article/details/68925707

  8. Docker网络详解——原理篇

    安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络). none .host 网络模式 简介 Host 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP ...

  9. 18. Fluentd输出插件:out_stdout用法详解

    stdout即标准输出,out_stdout将收到的日志事件打印到标准输出. 如果Fluentd以daemon方式在后台运行,out_stdout会将事件输出到Fluentd的运行日志中. 这个插件在 ...

  10. PAT (Basic Level) Practice 1020 月饼 分数 25

    月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意:销售时允许取出一部分库存.样 ...