Redis集群教程(Redis cluster tutorial)
本博文翻译自Redis官网:http://redis.io/topics/cluster-tutorial
不管怎么样,本教程尝试从最终用户的角度来提供关于Redis 集群 可用性和一致性的信息。
注意:本教程需要Redis 3.0版本或者更高.
如果你计划运行一个重要的Redis 集群部署,更多的正规说明书建议阅读下,虽然不严格要求. 不管怎样,这是一个好的建议从本文档开始玩转Redis 集群一段时间,稍后阅读Redis 集群详细说明书.
一、Redis集群101
Redis集群提供一个将数据通过多个Redis节点自动分片的方式来安装Redis.
Redis集群也通过分区提供可用性程度,那就是在实践中当一些节点down掉或失去联系,仍然可以继续工作的能力. 不管怎样,大量节点出现故障时(例如当大多数的主节点不可用)Redis集群会停止工作.
- 在多个节点中数据自动分片的能力.
- 当一部分节点失败或者不能与集群其余节点通信 ,集群仍然可以工作的能力.
二、Redis集群TCP端口
每个Redis集群节点需要开通两个TCP 连接。正常的Redis TCP端口被用作服务端的端口,例如6379,服务端口加上10000得到的作为数据端口,例如16379。
- 命令行端口对需要访问集群的客户端可达, 加上所有其余的集群节点(使用命令行端口做keys转移)。
- 集群总线端口(命令行端口+10000)对集群中的所有节点可达.
三、Redis集群和Docker
networking mode ),请在Docker文档是查看更多关于--net=host选项的信息.
四、Redis集群数据分片
每个Redis集群节点负责hash
slots总数的的一个子集,举个例子,你拥有三个节点的Redis集群:
- 节点A包含0~5500个hash slots.
- 节点B包含5501~11000个hash slots.
- 节点C包含11001~16383个hash slots.
这使得添加和和删除节点在Redis集群中变得容易.例如,如果我想加个节点D,我需要从节点A、B、C移动一些hash slot到D节点上. 同样的,如果我想从集群中移除节点A,我只需要把服务于A节点的hash slot移动到B和C.当节点A没有任何的hash slot时,就可以完全的删除节点A了.
因为从一个节点移动hash slots到另一个节点不需要停止操作、添加和删除节点、或者改变节点间持有hash slot的百分比,也不需要任何的服务停止.
五、Redis集群主从模型
六、Redis集群一致性保证
- 你的客户端写数据到主节点B.
- 主节点B回应你的客户端一切OK.
- 主节点复制写的数据到副节点B1、B2、B3.
七、Redis集群配置参数
- cluster-enabled <yes/no>
:如果是设置为yes,Redis集群将支持一个指定的Redis实例;否则这个实例将作为一个普通单独的实例。
- cluster-config-file <filename>:注意不要管这个选项的名称,这不是一个用户编辑的配置文件,而是Redis集群自动存留的Redis配置(状态,基本的)每当集群发生变化时,为了在启动时再次读取. 这个文件列出了其他节点在集群中的状态、持久性变化等等。这个文件常常在磁盘上重写、刷新作为一些消息接收的结果.
- cluster-node-timeout <milliseconds>:Redis集群中的点不用,被认为失败节点的的最大等待时间。如果一个主节点在指定的时间段内不可达,就会被他的副节点做失败处理. 这个参数控制Redis集群中其它重要事情。尤其,每个节点不能在指定时间内与主节点中的大多数通信,该节点将会停止查询。
- cluster-slave-validity-factor <factor>:如果设置成0,一个副节点总是尝试FailOver主节点,不管主节点和副节点保持断开连接多长时间。如果这个值设置为正数,一个最大失联时间将会被计算出来,node-timeout 乘以这个选项配置的factor,
如果这个节点是副节点,它将不会启动Failover当失联超过计算出的指定时间。 例如,如果node-timeoutt设置为5秒,validity factor 设置为10,一个副节点与主节点失去联系超过50秒后,副节点将不会尝试Failover它的主节点。注意,任何不同于0的值将导致集群不可用,当一个主节点失败后, 没有副节点可以替换它。在那个例子中,集群将返回可用,只要原始的主节点重新加入到集群中. - cluster-migration-barrier <count>: 一个主节点最少副节点连接数目,另一个移动到一个不被任何副节点覆盖的主节点。阅读本教程更多关于对于副本迁移恰当分区的信息.
- cluster-require-full-coverage <yes/no>:如果设置为yes,默认的,如果一定比例的key空间不被任何节点覆盖,集群将停止消息的写入;如果设置为no,集群仍然支持查询服务即使只有一部分key处理请求.
八、创建和使用一个Redis集群
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
就你所知,使集群模式工作只需要一个简单的cluster-enabled指令。每个实例也包含该节点配置信息被存储的文件的路径,默认是nodes.conf。 该配置文件不会被手动更改,它仅仅在Redis 集群实例启动的时候生成,每次需要的时候更新这个文件。
注意期望最小集群工作,要求至少三个主节点。对于你第一次测试,强烈建议你开启一个6个节点的集群,包含3个主节点和3个副节点。
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005
cd 7000
../redis-server ./redis.conf
你可以看见每个实例的日志,由于nodes.conf
文件不存在,每个节点分配一个新的ID.
[82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1
这个ID将被指定的Redis 实例永远使用,为了让这个实例在Redis上下文中有一个唯一的名字. 每一个节点都是通过ID来记录其余的节点,而不是通过IP地址或端口。 IP地址和端口可以改变,但是这个节点唯一的节点标识在节点生命周期内永远不会改变。我们把这个标识简单的称之为节点ID.
1、创建集群
gem install redis
创建集群的简单类型
./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
这里使用的命令是creat,因为我们想创建一个新的Redis集群。 --replicas 1这个选项的意思是我们想要为每个master节点创建一个slave节点,其余参数是我想创建集群实例要使用的地址列表。
Redis-trib将会提出一个配置,输入yes,集群将会被配置和加入,这意味着,Redis实例将会被引导至互相交互。最后,你将看到一个信息:
[OK] All 16384 slots covered
上面这条信息意味着,至少有一个master节点实例服务于16384 slot 中的每一个。
2、使用create-cluster脚本创建Redis集群
1、create-cluster start
2、create-cluster create
第二步的时候,当redis-trib工具想让你接受redis集群布局时,请输入yes。
create-cluster stop.
请阅读目录下面的README 文件查看更多关于运行该脚本的信息.
3、玩转Redis集群(Playing with the cluster)
redis-rb-cluster is a Ruby implementation written by me (@antirez) as a reference for other languages. It is a simple wrapper around the original redis-rb, implementing the minimal semantics to talk with the cluster efficiently.
redis-py-cluster A port of redis-rb-cluster to Python. Supports majority of redis-py functionality. Is in active development.
The popular Predis has support for Redis Cluster, the support was recently updated and is in active development.
The most used Java client, Jedis recently added support for Redis Cluster, see the Jedis Cluster section in the project README.
StackExchange.Redis offers support for C# (and should work fine with most .NET languages; VB, F#, etc)
thunk-redis offers support for Node.js and io.js, it is a thunk/promise-based redis client with pipelining and cluster.
redis-go-cluster is an implementation of Redis Cluster for the Go language using the Redigo library client as the base client. Implements MGET/MSET via result aggregation.
The redis-cli utility in the unstable branch of the Redis repository at GitHub implements a very basic cluster support when started with the -c switch.
一个简单的方式来测试你的集群是使用上面任何一种客户端或者简单的命令行工具redis-cli。
$ redis-cli -c -p 7000
redis 127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
redis 127.0.0.1:7002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
redis 127.0.0.1:7000> get foo
-> Redirected to slot [12182] located at 127.0.0.1:7002
"bar"
redis 127.0.0.1:7000> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"world"
Redis集群教程(Redis cluster tutorial)的更多相关文章
- [个人翻译]Redis 集群教程(中)
上一篇:http://www.cnblogs.com/li-peng/p/6143709.html 官方原文地址:https://redis.io/topics/cluster-tutorial 水 ...
- [个人翻译]Redis 集群教程(上)
官方原文地址:https://redis.io/topics/cluster-tutorial 水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我会尽快修改,谢谢. 这是 ...
- [个人翻译]Redis 集群教程(下)
[个人翻译]Redis 集群教程(上) [个人翻译]Redis 集群教程(中) 官方原文地址:https://redis.io/topics/cluster-tutorial 水平有限,如果您在阅读过 ...
- redis集群之REDIS CLUSTER
redis集群之REDIS CLUSTER 时间 2016-04-11 17:05:00 NoSQL_博客园 原文 http://www.cnblogs.com/zhanchenjin/p/537 ...
- Redis 集群:CLUSTERDOWN The cluster is down
1.错误 (error)CLUSTERDOWN The cluster is down 2.问题表现 Java项目使用redis集群时报错, HTTP Status 500 - Could not g ...
- Redis集群模式(Cluster)部署
1. 安装依赖包 注意:本节需要使用root用户操作 1.1 安装ruby yum install ruby -y yum install ruby-devel.x86_64 -y 1.2 安装rub ...
- Redis集群~StackExchange.redis连接Twemproxy代理服务器
回到目录 本文是Redis集群系列的一篇文章,主要介绍使用StackExchange.Redis进行Twemproxy(文中简称TW)代理服务的连接过程,事务上,对于TW来说,我们需要理解一下它的物理 ...
- 在虚拟机上安装redis集群,redis使用版本为4.0.5,本机通过命令客户端可以连接访问,外部主机一直访问不了
在虚拟机上安装了redis 4 ,启动后本机客户端可以连接访问,但是外部主机一直访问不了,在使用java代码连接redis集群时报:no reachable node in cluster,原因:在r ...
- redis高可用、redis集群、redis缓存优化
今日内容概要 redis高可用 redis集群 redis缓存优化 内容详细 1.redis高可用 # 主从复制存在的问题: 1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个sl ...
随机推荐
- [SCOI 2009]windy数
Description 题库链接 找出在 \([A,B]\) 间满足相邻位差值至少为 \(2\) 的正整数个数. \(1\leq A,B\leq 2\cdot 10^9\) Solution 数位 \ ...
- [HAOI2008]圆上的整点
题目描述 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. 输入输出格式 输入格式: r 输出格式: 整点个数 输入输出样例 输入样例#1: 4 输出样例#1: 4 说明 n ...
- ●POJ 2187 Beauty Contest
题链: http://poj.org/problem?id=2187 题解: 计算几何,凸包,旋转卡壳 一个求凸包直径的裸题,旋转卡壳入门用的. 代码: #include<cmath> # ...
- ●SPOJ 8222 NSUBSTR - Substrings(后缀数组)
题链: http://www.spoj.com/problems/NSUBSTR/ 题解: 同届红太阳 --WSY给出的后缀数组解法!!! 首先用倍增算法求出 sa[i],rak[i],hei[i]然 ...
- C++变量和基本类型——2.3.1引用
引用:为对象起了另外一个名字,通常将申明符写成&d的形式来定义引用类型,其中d是申明的变量名: int ival =1024; int &refVal=ival 一般在初始化变量时,初 ...
- (转载)总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法
总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法以及SQL语句中日期格式的表示(#).('')在Delphi中进行字符变量连接相加时单引号用('' ...
- jmeter正则表达式书写
在测试过程中,经常会有以下几种场景,如A接口的返回值,用于B接口中,而且A登陆的账户,每次登陆,这个sid值还是变化的.那么在实际工作中,如何才能A接口中提取参数到B接口中?接下来我们就可以用正则表达 ...
- jsvascript === 和==的区别
== 用于比较 判断 两者相等 ==在比较的时候可以转自动换数据类型 ===用于严格比较 判断两者严格相等 ===严格比较,不会进行自动转换,要求进行比较的操作数必须类型 ...
- MyBatis 传入参数之parameterType
在MyBatis的select,insert,update,delete这些元素中都提到了parameterType这个属性.MyBatis现在使用parameterType有基本类型和JAVA复 ...
- java客户端Jedis操作Redis Sentinel 连接池
pom配置: <dependency> <groupId>org.springframework.data</groupId> <artifactId> ...