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 ...
随机推荐
- Python模块 - time,datetime,calendar
time模块 localtime 当前时间的struct_time形式 >>> time.localtime() time.struct_time(tm_year=2015, tm_ ...
- 前端性能监控系统 & 前端数据分析系统
前端监控系统 目前已经上线,欢迎使用! 背景:应工作要求,需要整理出前端项目的报错信息,尝试过很多统计工具,如: 腾讯bugly.听云.OneApm.还有一个忘记名字的工具. 因为各种原因,如: 统计 ...
- 初学servlet之form表单
使用doget向页面写表单,使用dopost读取表单内容,包括了单选按钮,复选框,下拉列表等等的读取方法,form的action属性不写,默认表单会被提交给请求他时用的相同的URL package a ...
- 【前端】Ubuntu16下nodejs+npm+vue环境配置
笔者最近在学习vue.js,不过一直都是在runoob上面各种尝试.今天笔者在本机(Ubuntu16.04)尝试部署了nodejs+npm+vue开发环境,接下来将尽可能详细的讲述安装过程,帮助新人少 ...
- python re模块findall使用
今天练习re模块时候出现了一个很奇怪的问题,同样的正则表达式用re.search()与用re.compile().findall()匹配出来的结果不一致. 很是奇怪,故此记录一下,防止以后碰到类似情况 ...
- [HAOI 2007]上升序列
Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ...
- bzoj4919 [Lydsy1706月赛]大根堆
Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...
- bzoj 2555: SubString
Description 懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支 ...
- [bzoj4873]寿司餐厅
来自FallDream的博客,未经允许,请勿转载,谢谢. Kiana最近喜欢到一家非常美味的寿司餐厅用餐.每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个代号ai和美味度di,i,不同种类的 ...
- BZOJ4589 Hard Nim(快速沃尔什变换模板)
终于抽出时间来学了学,比FFT不知道好写到哪里去. #include <cstdio> typedef long long ll; ,p=1e9+; int k,m,n,a[N],pi[N ...