文档库 最新最全的文档下载
当前位置:文档库 › Redis 集群应用学习

Redis 集群应用学习

Redis 集群应用学习
Redis 集群应用学习

集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节点,来降低单节点服务器的压力。

上一篇我们讲到了Redis 的主从复制技术,当实现了多节点的master-slave 后,我们

也可以把它叫做集群,但我们今天要讲的集群主要是利用切片技术来组建的集群。

集群要实现的目的是要将不同的key 分散放置到不同的redis 节点,这里我们需要一个

规则或者算法,通常的做法是获取key 的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的key 无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。

一致性哈希有四个重要特征:

均衡性:也有人把它定义为平衡性,是指哈希的结果能够尽可能分布到所有的节点中去,这样可以有效的利用每个节点上的资源。

单调性:对于单调性有很多翻译让我非常的不解,而我想要的是当节点数量变化时哈希的结果应尽可能的保护已分配的内容不会被重新分派到新的节点。

分散性和负载:这两个其实是差不多的意思,就是要求一致性哈希算法对key 哈希应尽可能的避免重复。

但一致性哈希不是我们今天要介绍的重点,因为Redis 引入另一种哈希槽(hash slot)

的概念。

Redis 集群中内置了16384 个哈希槽,当需要在Redis 集群中放置一个key-value 时,redis 先对key 使用crc16 算法算出一个结果,然后把结果对16384 求余数,这样每个key 都会对应一个编号在0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

使用哈希槽的好处就在于可以方便的添加或移除节点。

当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;

当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;

内部机制,与我何干,对于我们来说,在新增或移除节点的时候不要让我们先停掉所有的redis 服务我就谢天谢地了,这点它做到了。

下面我们就开始动手搭建一个redis 集群来体验一下。

因为我们要启动多个redis 实例,虽然我们可以直接通过命令行来启动,但始终是不怎么方便的,所以我们先来新建三个实例目录,分别是9001,9002,9003,目录名就是redis 实例的端口号。

我这里已经建好了目录,然后我们把以前编译过和修改过的redis-server、redis.conf这两个文件分别拷贝到这三个目录里面,拷贝完之后就像这样子了:

我们打开redis.conf 文件,为了简单起见,我们只保留下面几个配置项:

daemonize yes

port 9001

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

appendonly yes

注意:port 要修改成对应目录的名字,也就是每个实例要有不同的端口。

下面我们分别启动这三个实例:

zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis-cluster

zhaoguihuadediannao:redis-cluster zhaogh$ cd 9001

zhaoguihuadediannao:9001 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9003 zhaogh$ cd ../9002

zhaoguihuadediannao:9002 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9002 zhaogh$ cd ../9003

zhaoguihuadediannao:9003 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9003 zhaogh$

接下来我们来创建集群,让三个实例互相通讯:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb create --replicas 0

127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003

>>> Creating cluster

Connecting to node 127.0.0.1:9001: OK

Connecting to node 127.0.0.1:9002: OK

Connecting to node 127.0.0.1:9003: OK

>>> Performing hash slots allocation on 3 nodes...

Using 3 masters:

127.0.0.1:9001

127.0.0.1:9002

127.0.0.1:9003

M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001

slots:0-5460 (5461 slots) master

M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002

slots:5461-10922 (5462 slots) master

M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003

slots:10923-16383 (5461 slots) master

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:9001)

M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001

slots:0-5460 (5461 slots) master

M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002

slots:5461-10922 (5462 slots) master

M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003

slots:10923-16383 (5461 slots) master

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

zhaoguihuadediannao:src zhaogh$

需要注意的是执行 redis-trib.rb 命令需要ruby 的支持,如果你没有安装可以先

到https://https://www.wendangku.net/doc/a612737444.html,/gems/redis下载,然后离线安装。

sudo gem install redis-3.0.7.gem --local

下面我们用redis 自带的客户端测试一下:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> get testkey001

-> Redirected to slot [12786] located at 127.0.0.1:9003

(nil)

127.0.0.1:9003> set testkey002 testvalue002

-> Redirected to slot [401] located at 127.0.0.1:9001

OK

127.0.0.1:9001> get testkey002

"testvalue002"

127.0.0.1:9001> set testkey003 testvalue003

OK

127.0.0.1:9001>

可以看到,虽然我们第一次连接的是9001端口,当我们去获取testkey001 的时候,redis cluster 自动帮我们重定向到9003 。

当我们在9003 设置testkey002 时,redis cluster 又重定向到9001 。

总的来说,redis 集群部署起来还是非常方便的,遗憾的是,目前几乎还没有c# 的客户端能很好的支持redis 集群,真是非常的悲哀,我们期待他们的更新。

下一遍中,我们继续讨论redis 集群,比如,如何增加节点,移除节点,重新切片等,敬请期待。

Redis 集群(中)

昨天晚上钓鱼回来,大发神经,写了篇概括程序员生活现状的文章,没想到招来众多人的口诛笔伐,大有上升到政治层面的趋势。

我也许不会再发表任何冲击心灵的文章,我希望给大家带来更多的正能量,所以那篇文章已被我删除。

我的本意只是想让各位看过文章之后能冷静地思考自己的程序人生,不管是对是错,人都有选择的权力,走好自己的路。

我没有你们想象中那么悲观,我也在不懈的努力,哪怕一时的跌倒,我也要重新站起。

生活无时无刻不是压力,让我们背起行囊,迈出踏实的一步,走起!

我们继续我们的redis 缓存之旅。

前一篇我们实现了一个简单的redis 集群,redis 也为了让我们方便的维护集群提供了非常好的工具。

首先请大家参照我的上一篇文章,把集群环境搭建起来。

OK,我用了分分钟的时间已经搭建好了。

[OK] All 16384 slots covered.

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> get testkey001

-> Redirected to slot [12786] located at 127.0.0.1:9003

(nil)

127.0.0.1:9003>

如何增加节点:

首先我们创建一个叫做9004 的目录:

zhaoguihuadediannao:redis-cluster zhaogh$ mkdir 9004

zhaoguihuadediannao:redis-cluster zhaogh$

接着我们将9001 目录下的redis-server 、redis.conf 两个文件拷贝到9004 目录:zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis-server 9004 zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis.conf 9004

然后我们打开redis.conf 文件修改里面的端口配置项,将其改为9004 。

启动9004 实例:

zhaoguihuadediannao:redis-cluster zhaogh$ cd 9004

zhaoguihuadediannao:9004 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9004 zhaogh$

想要把这个实例加入到集群,我们只需要执行redis-trib.rb 命令:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb add-node

127.0.0.1:9004 127.0.0.1:9001

第一个参数是我们刚才启动的新实例,第二个参数是集群中已有的节点。

检查一下新节点是否已经加入:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> cluster nodes

0e8f980bfe7a682e3d71b15523a41293535b8ccd :0 myself,master - 0 0

1 connected 0-5460

cbb01bdfdc265b190496956354d84aaae6e7d54d 127.0.0.1:9004

master - 0 1401952316346 0 connected

708e6e14474e3a99677b05ff89bd857375884437 127.0.0.1:9002

master - 0 1401952314325 2 connected 5461-10922

a7f9d3c64540cc3fc8cd3072e573bb8ab0bf1e6f 127.0.0.1:9003 master -

0 1401952315334 3 connected 10923-16383

127.0.0.1:9001>

我们可以发现9004 并不包含任何哈希槽,因为它还没有数据。

我们还可以为集群中的主节点增加从节点用于只读查询。

如何增加从节点:

我们还是要创建目录,拷贝那两个文件,修改配置,然后启动实例:

zhaoguihuadediannao:redis-cluster zhaogh$ mkdir 9005

zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis-server 9005 zhaoguihuadediannao:redis-cluster zhaogh$ cp 9001/redis.conf 9005

修改port 为9005

zhaoguihuadediannao:redis-cluster zhaogh$ cd 9005

zhaoguihuadediannao:9005 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9005 zhaogh$

执行下面的命令,增加从节点:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb add-node --slave

127.0.0.1:9005 127.0.0.1:9001

第一个参数为从节点,第二个参数为主节点。

如何删除一个节点:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node

127.0.0.1:9001 'cbb01bdfdc265b190496956354d84aaae6e7d54d'

这里要注意一下,第一个参数是集群中的任何一个主节点地址,而第二个参数是要删除节点的ID,这个ID如果你不知道的话,可以通过cluster nodes 命令查看。

还有一点就是要删除的节点必须是空的,也就是不能缓存任何数据,否则会删除不成功。对于非空节点,在删除之前需要重新分片,将缓存的数据转移到别的节点。

如何重新分片:

我们先给某个节点做点数据:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> set testkey001 testvalue001

-> Redirected to slot [12786] located at 127.0.0.1:9003

OK

127.0.0.1:9003>

现在9003 上已经有数据了,我们尝试删除一下:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node

127.0.0.1:9001 '78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3'

>>> Removing node 78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3 from cluster 127.0.0.1:9001

Connecting to node 127.0.0.1:9001: OK

Connecting to node 127.0.0.1:9002: OK

Connecting to node 127.0.0.1:9003: OK

[ERR] Node 127.0.0.1:9003 is not empty! Reshard data away and try

again.

zhaoguihuadediannao:src zhaogh$

没有删除成功,我们来重新分片,把9003 上的数据转移:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb reshard

127.0.0.1:9003

然后输出了很多信息,很多数值和ID都可以从这段信息中找到。

How many slots do you want to move (from 1 to 16384)? 5461

会问你要移动多少个哈希槽,我们把9003 上的所有哈希槽都移走,5461 这个数字可以从终端上看到,或许你的实际情况不是这个数字。

What is the receiving node ID?

4d2e0a8360795ce7ce8381c68746034aeba3c9b9

然后问你你要把这些哈希槽移到哪儿去,我指定了9001 的节点ID。

Please enter all the source node IDs.

Type 'all' to use all the nodes as source nodes for the hash slots.

Type 'done' once you entered all the source nodes IDs.

Source node #1:78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3

Source node #2:done

之后,redis 列出了重新分片计划,最后问你

Do you want to proceed with the proposed reshard plan (yes/no)? yes

执行完成后,我们看看9003 上还有没有key:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9003

127.0.0.1:9003> keys *

(empty list or set)

127.0.0.1:9003>

再看看9001 上是不是有这个key 了

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9001

127.0.0.1:9001> keys *

1) "testkey001"

127.0.0.1:9001>

没错,果然转移过来了。

最后我们试试能不能把9003 删除:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 '78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3'

>>> Removing node 78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3 from cluster 127.0.0.1:9001

Connecting to node 127.0.0.1:9001: OK

Connecting to node 127.0.0.1:9002: OK

Connecting to node 127.0.0.1:9003: OK

>>> Sending CLUSTER FORGET messages to the cluster...

>>> SHUTDOWN the node.

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 9003

Could not connect to Redis at 127.0.0.1:9003: Connection refused

not connected>

非常好,it’s very good.

Redis 主从复制

Redis 的主从复制配置非常容易,但我们先来了解一下它的一些特性。

1.redis 使用异步复制。从redis

2.8 开始,slave 也会周期性的告诉master 现

在的数据量。可能只是个机制,用途应该不大。

2.一个master 可以拥有多个slave,废话,这也是业界的标配吧。

3.slave 可以接收来自其他slave 的连接。意思是不是就是说slave 在接收

其他的slave的连接之后成为master ?等下我们来验证。

4.redis 复制在master 这一端是非阻塞的,也就是说在和slave 同步数据的时

候,master 仍然可以执行客户端的操作命令而不受其影响。这点都不能保证,

要你干嘛?

5.redis 复制在slave 这一端也是非阻塞的。在配置文件里面有

slave-serve-stale-data 这一项,如果它为yes ,slave 在执行同步时,它

可以使用老版本的数据来处理查询请求,如果是no ,slave 将返回一个错误。

在完成同步后,slave 需要删除老数据,加载新数据,在这个阶段,slave 会阻

止连接进来。

6.Replication can be used both for scalability, in order to have

multiple slaves for read-only queries (for example,

heavy SORT operations can be offloaded to slaves), or simply for data

redundancy.这句话我也没理解什么意思。

7.使用复制可以避免master 因为需要把全部的数据集写入磁盘而造成的开销,因

此可以把master 中save 配置项全部注释掉,不让它进行保存,然后配置

slave ,让slave 保存。虽然有这个特性,但是我们好像一般不这么做。

好吧,我们做几个例子练习一下。

先打开三个终端,然后起三个实例,分别用三个client 去连接它们:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10000

--daemonize yes

zhaoguihuadediannao:src zhaogh$

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10000

端口10000的做master。

slave 01:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10001

--daemonize yes

zhaoguihuadediannao:src zhaogh$

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10001

slave 02:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 10002

--daemonize yes

zhaoguihuadediannao:src zhaogh$

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 10002

上面只是让它们的实例启动了并用客户端去连接它,并没有设置主从关系。在slave 01 和slave 02 上执行下面的命令:

127.0.0.1:10001> slaveof 127.0.0.1 10000

OK

127.0.0.1:10001>

这样就设置好了主从关系。我们来试试有没有效果。

127.0.0.1:10001> get testkey001

(nil)

127.0.0.1:10001>

这个时候是没有值的。

master 上执行:

127.0.0.1:10000> set testkey001 testvalue001

OK

127.0.0.1:10000>

然后看看slave 上有没有:

127.0.0.1:10001> get testkey001

"testvalue001"

127.0.0.1:10001>

127.0.0.1:10002> get testkey001

"testvalue001"

127.0.0.1:10002>

有了,是不是比***点读机还easy ?已经有了感性的认识,我们来介绍一下它的原理吧。

当你设置了主从关系后,slave 在第一次连接或者重新连接master 时,slave 都会发送一条同步指令给master ;

master 接到指令后,开始启动后台保存进程保存数据,接着收集所有的数据修改指令。后台保存完了,master 就把这份数据发送给slave,slave 先把数据保存到磁盘,然后把它加载到内存中,master 接着就把收集的数据修改指令一行一行的发给slave,slave 接收到之后重新执行该指令,这样就实现了数据同步。

slave 在与master 失去联系后,自动的重新连接。如果master 收到了多个slave 的同步请求,它会执行单个后台保存来为所有的slave 服务。

一旦master 和slave 在失去联系并重新连接上,总是会重新进行一次完整的同步。不过从redis 2.8 开始,只是部分重新同步也是可以的。具体请大家参考官方文档。

祝大家端午节快乐。

Redis 的配置

我们说Redis是一个强大的Key-Value存储系统,在前面我们已遇到了两个问题:

1、redis server 启动后,独占进程,能不能修改为后台服务呢?

2、redis server 服务是单线程的,而我的机器是多核的,能不能在同一台机器上开启多个实例更充分的利用cpu 资源呢?但6379端口已经被前一个实例绑定,肯定会有冲突,那能不能修改默认端口呢?

答案是肯定的,redis 提供了灵活的配置方式,一种可以通过配置文件来配置,另一种你可以在运行时通过config set 命令来修改配置。

我们先来看看配置文件吧。

殊不知我们在前面启动server 的时候敲的 ./redis-server 命令,如果后面不附加参数,它是按默认配置来启动redis 服务的,其实它后面还可以附加一个配置文件路径的参数。这个配置文件在哪?在redis根目录下有一个redis.conf文件,这个文件为了提供了默认的配置和示例。你不要轻易去动这个文件,除非你非常牛逼。我们还是保险起见先复制一个副本吧。打开副本我们发现这个文件真的好大好长啊,全是英文看得我也难受啊,也不见哪座大神帮忙翻译一下,给个现成的中文版,太自私了吧,哥今天一晚不睡也要给你们一个交代。

太长了,翻译了一个晚上才搞了一部分出来,不过主要的配置项都翻译出来了,我后面有时间继续翻译。看这里。记得顺便去关注一下我的restful.data。

把这个文件下载下来后,拷贝到src 目录下面,也就是和redis-server 在同一个目录,方便我们操作。

我们稍微改一下配置,看看能不能把我们前面提到的两个问题解决了。

首先我们修改 daemonize 配置项,把它设置为yes,打开终端,我们执行一下

redis-server 命令。

zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis/src

zhaoguihuadediannao:src zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:src zhaogh$ ./redis-cli

127.0.0.1:6379>

是不是已经不再独占进程了,启动守护进程后,我们仍然可以执行redis-cli 命令。

先停掉redis 服务:

127.0.0.1:6379> shutdown

127.0.0.1:6379> quit

zhaoguihuadediannao:src zhaogh$

然后我们修改port 配置项为6378,然后再启动服务:

zhaoguihuadediannao:src zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:src zhaogh$ ./redis-cli

Could not connect to Redis at 127.0.0.1:6379: Connection refused

not connected>

因为我们修改了默认端口号,已经连不上去了,尝试加上端口参数。

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 6378

127.0.0.1:6378>

成功了连上了。

篇幅有限,redis.confi 中其他配置项请大家结合注释去深入的了解。

下面介绍另外一种配置方式,通过命令行来配置。

假如说我们不想修改配置文件来启动指定端口号的redis服务,我们可以在终端上执行下面的命令:

zhaoguihuadediannao:src zhaogh$ ./redis-server --port 6379

--daemonize yes

zhaoguihuadediannao:src zhaogh$ ./redis-cli -p 6379

127.0.0.1:6379>

但我还是推荐使用配置文件的方式。

如果在生产环境里面需要修改某些配置项,但我们又不想停掉服务,怎么办?

Redis允许在运行的过程中,在不重启服务器的情况下更改服务器配置,同时也支持使用特殊的CONFIG SET和CONFIG GET命令用编程方式查询并设置配置。

127.0.0.1:6379> config get port

1) "port"

2) "6379"

127.0.0.1:6379>

127.0.0.1:6379> config set port 6380

(error) ERR Unsupported CONFIG parameter: port

127.0.0.1:6379>

我试图直接修改端口号,没有成功,我是有点想当然了,因为一旦修改端口必然需要重启服务,重新绑定端口,所以并不是所有的配置项都能在运行时进行修改。

那我们来修改一个允许修改的配置项。

127.0.0.1:6379> config set tcp-keepalive 60

OK

127.0.0.1:6379>

上面的例子,我把心跳包发送时间间隔修改成了60秒。你们可以自己尝试着去修改其他配置项。

技术上有很多事情不是靠看几篇文章,通过道听途说就能明白的,想要真正弄清楚,必须要自己亲自去尝试,实践才是检验真理的唯一标准,就像很多朋友给我推荐车一样,说这车好,那车差,其实自己都没开过,我发现很多程序员嘴上都说的一套一套的,实际做起事来真不行,这样的人适合做销售,会忽悠,当然这也是种能力。

Redis的安装与使用

一、什么Redis

RE mote DI ctionary S erver,简称Redis,是一个类似于Memcached的Key-Value 存储系统。相比Memcached,它支持更丰富的数据结构,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型),并提供了数据持久

化机制,在某些场景下,你完全可以把它当做非关系型数据库来使用。它是一个高性能的存储系统,能支持超过100K+ 每秒的读写频率。同时还支持消息的发布/订阅,从而让你在构建高性能消息队列系统时多了另一种选择。

二、下载

点击这里下载。

我在这里下载的是redis-3.0.0-beta5版,redis从3.0开始支持集群。

三、安装

以下安装均为OSX 操作系统上的步骤:

1、找到你刚刚下载的redis-3.0.0-beta5.tar.gz文件,解压这个文件。

2、将解压后的文件夹拷贝到你很容易找到的目录下,并修改文件夹名为redis,因为版本号太长了。

2、打开终端,进入redis文件夹,命令如下:

Last login: Fri May 30 21:33:25 on ttys000

zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis

zhaoguihuadediannao:redis zhaogh$

3、在命令提示符出输入make 命令,稍等片刻,便能完成安装。如果系统提示找不到make 命令,请参考这篇文章。

装好了,是不是有点小激动。抽根烟,我们继续吧。

四、使用

1、启动服务,先进入src 目录,然后执行redis-server。

zhaoguihuadediannao:redis zhaogh$ cd src

zhaoguihuadediannao:src zhaogh$ ./redis-server

你将会看到:

2343:M 30 May 21:42:50.741 # Server started, Redis version 2.9.54

2343:M 30 May 21:42:50.741 * The server is now ready to accept

connections on port 6379

我没看错吧,TMD我明明下载的3.0.0,怎么显示Redis version 2.9.54 ? 好吧,这不是重点,我也懒得追究了。

6379 是redis 默认端口,在后续的文章中你将知道如何修改这个默认端口。

2、客户端连接。

你会发现在执行了第四步之后,我们无法再执行其他命令了,怎么办?因为redis独占了此进程,后面告诉你们如果将它修改为后台运行。

我们暂且再打开一个终端吧。还是先进入src 目录:

zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis/src

zhaoguihuadediannao:src zhaogh$

输入 ./redis-cli 命令:

zhaoguihuadediannao:src zhaogh$ ./redis-cli

127.0.0.1:6379>

已经连接上了,哈哈哈。

3、测试几个redis 命令:

127.0.0.1:6379> set testkey001 testkey001

OK

127.0.0.1:6379> get testkey001

"testkey001"

127.0.0.1:6379> append testkey001 aaa

(integer) 13

127.0.0.1:6379> get testkey001

"testkey001aaa"

127.0.0.1:6379>

4、关闭连接,执行quit 命令

127.0.0.1:6379> quit

zhaoguihuadediannao:src zhaogh$

5、关闭服务。

由于我们刚才已经退出了客户端,我们再次连接,并执行shutdown 命令:127.0.0.1:6379> shutdown

127.0.0.1:6379>

看看另外一个另外一个终端窗口中是不是显示 [进程已完成]。当然,你也可以通过kill 命令来关闭服务。

redis3.0.2 分布式集群安装详细步骤

redis3.0.2 分布式集群安装详细步骤 --(centos5.8 X64系统) 版本历史 一: redis cluster介绍篇 1:redis cluster的现状 目前redis支持的cluster特性(已亲测): 1):节点自动发现 2):slave->master 选举,集群容错 3):Hot resharding:在线分片 4):进群管理:cluster xxx 5):基于配置(nodes-port.conf)的集群管理 6):ASK 转向/MOVED 转向机制. 2:redis cluster 架构 1)redis-cluster架构图

架构细节: (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail是通过集群中超过半数的节点检测失效时才生效. (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value 2) redis-cluster选举:容错

(1)领着选举过程是集群中所有master参与,如果半数以上master节点与master 节点通信超过(cluster-node-timeout),认为当前master节点挂掉. (2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的 操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态. b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态. 二.Redis集群安装篇(centos5.8 X64系统) (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下)

Redis-集群 - 三台服务器

Redis-集群安装详细步骤 一、Redis集群部署文档(centos6系统) 现有三台物理机10.18.154.2 10.18.154.3 10.18.154.4 (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) 10.18.154.2:7000 10.18.154.2:7001 10.18.154.3:7000 10.18.154.3:7001 10.18.154.4:7000 10.18.154.4:7001 二、安装Redis(10.18.154.2、10.18.154.3、10.18.154.4) 下载redis-3.2.1.tar.gz [root@localhost ~]# tar zxvf redis-3.2.1.tar.gz [root@localhost ~]# cd redis-3.2.1 [root@localhost redis-3.2.1]# make [root@localhost redis-3.2.1]# make install [root@localhost ~]# mv redis-3.2.1 /usr/local/redis [root@localhost ~]# cd /usr/local/redis/ [root@localhost ~]# mkdir /usr/local/cluster [root@localhost ~]# cp /usr/local/redis/redis.conf /usr/local/cluster/ [root@localhost ~]# vi /usr/local/cluster/redis.conf ##修改配置文件中的下面选项 port 7000 bind 10.18.154.2 127.0.0.1 daemonize yes#如果你想让它在后台运行,你就把它改成yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes [root@localhost ~]# mkdir /usr/local/cluster/7000 [root@localhost ~]# mkdir /usr/local/cluster/7001 [root@localhost ~]# cp /usr/local/cluster/redis.conf /usr/local/cluster/7000 [root@localhost ~]# cp /usr/local/cluster/redis.conf /usr/local/cluster/7001 [root@localhost ~]# cp /usr/local/cluster/redis.conf /usr/local/cluster/7002 [root@localhost 7000]# redis-server redis.conf ---启动redis服务##注意:拷贝完成之后要修改7001目录下面redis.conf文件中的port参数,分别改为对应的文件夹的名称 ##启动之后使用命令查看redis的启动情况ps -ef|grep redis

Redis集群研究

Redis Sentinel数据库M-S配置(Redis的分片与复制集技术) 1.Redis Sentinel介绍 Redis Sentinel是Redis官方提供的集群管理工具,主要有三大功能: 监控,能持续监控Redis的主从实例是否正常工作; 通知,当被监控的Redis实例出问题时,能通过API通知系统管理员或其他程序;自动故障恢复,如果主实例无法正常工作,Sentinel将启动故障恢复机制把一个从实例提升为主实例,其他的从实例将会被重新配置到新的主实例,且应用程序会得到一个更换新地址的通知。 Redis Sentinel是一个分布式系统,可以部署多个Sentinel实例来监控同一组Redis实例,它们通过Gossip协议来确定一个主实例宕机,通过 Agreement协议来执行故障恢复和配置变更,一般在生产环境中部署多个实例来提高系统可用性,只要有一个Sentinel实例运行正常,就能保证被监控的Redis实例运行正常(类似Zookeeper,通过多个Zookeeper来提高系统可用性); 2.Redis HA方案 HA的关键在于避免单点故障及故障恢复,在Redis Cluster未发布之前,Redis 一般以主/从方式部署(这里讨论的应用从实例主要用于备份,主实例提供读写,有不少应用是读写分离的,读写操作需要取不同的Redis实例,该方案也可用于此种应用,原理都是相通的,区别在于数据操作层如何封装),该方式要实现HA主要有如下几种方案: 1).keepalived:通过keepalived的虚拟IP,提供主从的统一访问,在主出现问题时,通过keepalived运行脚本将从提升为主,待主恢复后先同步后自动变为主,该方案的好处是主从切换后,应用程序不需要知道(因为访问的虚拟IP 不变),坏处是引入keepalived增加部署复杂性; 2).zookeeper:通过zookeeper来监控主从实例,维护最新有效的IP,应用通过zookeeper取得IP,对Redis进行访问; 3).sentinel:通过Sentinel监控主从实例,自动进行故障恢复,该方案有个缺陷:因为主从实例地址(IP&PORT)是不同的,当故障发生进行主从切换后,应用程序无法知道新地址,故在Jedis2.2.2中新增了对Sentinel的支持,应用通过 redis.clients.jedis.JedisSentinelPool.getResource()取得的Jedis 实例会及时更新到新的主实例地址。 笔者所在的公司先使用了方案1一段时间后,发现keepalived在有些情况下会导致数据丢失,keepalived通过shell脚本进行主从切换,配置复杂,而且keepalived成为新的单点,后来选用了方案3,使用Redis官方解决方案;(方

redis集群部署

redis 3.07的集群部署一:关于redis cluster 1:redis cluster的现状 1):节点自动发现 2):slave->master 选举,集群容错 3):Hot resharding:在线分片 4):进群管理:cluster xxx 5):基于配置(nodes-port.conf)的集群管理 6):ASK 转向/MOVED 转向机制. 2:redis cluster 架构 1) redis-cluster架构图 架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail是通过集群中超过半数的节点检测失效时才生效. (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护 node<->slot<->value 2) redis-cluster选举:容错 (1)领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉. (2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误 a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态. b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态. 二:redis cluster的使用 1:安装redis cluster所需软件

redis-cluster原理分析

Redis Cluster 原理分析 文章较长,如需转载可分段。转载请标明作者以及文章来源,谢谢! 作者介绍 姓名:李航 工作经历: 5年多互联网工作经验,先后在58同城,汽车之家,优酷土豆集团工作。目前主要在优酷土豆集团任职高级开发工程师,目前主要负责大数据基础平台Redis集群开发及运维等工作。主要关注领域Nginx,Redis,分布式系统,分布式存储。如果对nginx或者redis感兴趣的同学可以发简历到gaosong@https://www.wendangku.net/doc/a612737444.html,。本文来源自“Redis技术交流群”线上分享。李航ID:Lucien_168。群主ID:gnuhpc。redis中国用户组qq群:374538650。后期的分享我们会同期进行。 这次主要是给大家分享的提纲如下: 1.简介 2.集群通信 3.数据分布及槽信息 4.数据迁移 5.通信故障 1.简介 继上次分享的优酷土豆的Redis服务平台化之路,这次着重来分享下Redis Cluster浅析,欢迎大家互相多交流学习。 Redis Cluster是一个高性能高可用的分布式系统。由多个Redis实例组成的整体,数据按照Slot存储分布在多个Redis实例上,通过Gossip协议来进行节点之间通信。

Redis Cluster功能特点如下: 1)所有的节点相互连接 2)集群消息通信通过集群总线通信,,集群总线端口大小为客户端服务端口+10000,这个 10000是固定值 3)节点与节点之间通过二进制协议进行通信 4)客户端和集群节点之间通信和通常一样,通过文本协议进行 5)集群节点不会代理查询 6)数据按照Slot存储分布在多个Redis实例上 7)集群节点挂掉会自动故障转移 8)可以相对平滑扩/缩容节点

redis twemproxy集群安装手册

一、概述 1、Redis集群安装有两种方式,第一种为编译源码安装,第二种为二进制安 装,具体选择哪一种方式根据实际情况决定。 2、本文档所使用版本如下: redis:redis-3.0.0-rc5 Twemproxy:nutcracker-0.4.0 autoconfig:2.69 3、常用Linux命令不清楚可以查看相关网站 4、本文档所述redis集群架构如下: 5、本文档使用120和121搭建redis集群,每台机器各启动两个redis实例 和一个twemproxy实例。Redis端口分别为6379 6380 6、采用源码编译方式安装需服务器具有访问外网权限,二进制安装不需求。 7、所有安装包均已上传至文件服务器 二、源码编译方式安装 1、安装automake 执行:yum install automake,出现如下输入Y完成安装:

2、libtool安装 执行:yum install libtool 出现如下输入yes完成安装 3、autoconfig安装 ①上传autoconf-2.69.tar.gz至/usr/local/src目录下 ②执行tar -xzvf autoconf-2.69.tar.gz ③cd autoconf-2.69 ④执行./configure ⑤执行make ⑥执行make install 至此,autoconfig安装完毕 4、redis安装 ①上传redis-3.0.0-rc5.zip至/usr/local/src目录下 ②执行unzip redis-3.0.0-rc5.zip ③执行cd redis-3.0.0-rc5 ④执行make&&make install ⑤执行mkdir /usr/local/redis ⑥执行cp src/redis-server src/redis-cli /usr/local/redis ⑦执行cd /usr/local/redis ⑧执行chmod 777 redis-server redis-cli ⑨执行./redis-server --port 6379 --save "" & 出现如下 ⑩执行./redis-cli -p 6379出现如下

Redis 集群部署手册

Redis集群部署手册 一.部署环境 OS:Red Hat Enterprise Linux Server release 6.7 Redis Version: 3.0.0 IP-01: 10.32.60.138 Port:6380,6381 IP-02:10.32.60.139 Port:6382,6383 IP-03:10.32.60.140 Port:6383,6384 主节点01:10.32.60.138:6380 主节点02:10.32.60.139:6382 主节点03:10.32.60.140:6384 从节点01:10.32.60.138:6381 从节点02:10.32.60.138:6383 从节点03:10.32.60.138:6385 二.安装路径 redis主目录:/opt/software/redis-server redis 配置文件目录:/etc/redis 日志存放目录:/opt/software/redis 三.Redis 安装配置 1.安装 #tar –xzvf redis-3.0.0.tar.gz 解压 #cd /opt/software/redis3.0.0 #make && make PREFIX=/opt/software/redis-server install 编译安装 #cp redis.conf /etc/redis/redis-6380.conf 配置文件 #cp redis.conf /etc/redis/redis-6381.conf 配置文件 2.配置 以10.32.60.138 6380 节点为例 redis 配置文件放在 /etc/redis 目录下,根据端口来配置节点 设置后台运行:改为daemonize yes 修改默认端口:port 6380其他节点根据端口号修改 使用默认的日志级别:loglevel notice 修改日志路径:改为logfile /opt/software/redis/redis-6380.log 其他节点根据端口号修改日志文件名称 注释rdb保存条件(这样在运行过程中将不触发rdb模式):改为 #save 900 1

redis集群配置参数及优化

Redis集群配置参数及优化 Redis的主要参数配置在redis.conf文件中。 1.conf 内存值 2.bind ip 默认情况下,如果没有指定“bind”配置指令,Redis将侦听服务器上可用的所有网络接口的连接。 默认情况:bind 127.0.0.1 实际配置:bind 本机ip 3.protected-mode yes 启用默认保护模式。只有当您确定您希望其他主机的客户端连接到Redis 时,您才应该禁用它,即使没有配置身份验证,也没有使用“bind”指令显式列出特定的接口集。 4.tcp-keepalive 300 如果非零,请使用SO_KEEPALIVE向没有通信的客户发送TCP协议。 这很有用,有两个原因: a)检测死同伴 b)从中间的网络设备的角度进行连接 在Linux上,指定的值(以秒为单位)是用于发送ack的周期。 注意,要关闭连接,需要双倍的时间。这个选项的合理值是300秒,这 是新的Redis默认值,从Redis 3.2.1开始。 5.timeout 0 在客户机空闲N秒后关闭连接(0到禁用) 6.port 6379 在指定端口上接受连接,默认值是6379 7.daemonize yes redis后台运行 8.pidfile /var/run/redis_6379.pid 如果指定了一个pid文件,Redis会在启动时指定,并在退出时删除它。 当服务器运行非守护进程时,如果配置中没有指定pid文件,则不会创建pid文件。当服务器被守护时,即使没有指定,也会使用pid文件,默认为“/var/run/redis.pid”。 创建一个pid文件是最好的工作:如果Redis不能创建它,那么服务器就会正常启动和运行。

redis集群搭建及配置

redis主从服务器搭建 修改记录 目录 redis主从服务器搭建 (1) 一.redis主从服务器搭建 (2) 第一步:下载redis (2) 第二步:解压redis tar包 (2) 第三步:进入reidis目录 (2) 第四步:make (2) 第五步:make install (3) 第六步:修改redis.conf 操作 (3) 第七步:redis从服务器配置 (4) 第八步:修改从服务redis.conf (4) 二.redis测试 (4) 第一步:编写redis客户端启动shell (4) 第二步:启动客户端 (5) 第三步:操作 (5) 第四步:set name test (5) 第五步:get name (5) 第六步:从服务器端启动客户端 (5) 第七步:从服务器端(10.105.76.100) get name (5) 三.sentinel配置及启动 (5) 第一步:修改sentinel.conf (6) 第二步启动sentinel (6)

第三步:启动sentinel (6) 一.redis主从服务器搭建 第一步:下载redis 在redis官网下载redis2.8.17版本 第二步:解压redis tar包 将下载的redis-2.8.17.tar.gz放在10.105.76.99(主服务器)上/usr/local下然后解压tar包命令:tar -zxvf redis-2.8.17.tar.gz 第三步:进入reidis目录 进入redis-2.8.17目录命令: cd redis-2.8.17 第四步:make make 或者make MALLOC=libc 如果使用make时报错(zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory)此时可使用make MALLOC=libc 出现下图说明make完成

redis集群搭建

redis集群搭建 现在项目上用redis的话,很少说不用集群的情况,毕竟如果生产上只有一台redis会有极大的风险,比如机器挂掉,或者内存爆掉,就比如我们生产环境曾今也遭遇到这种情况,导致redis内存不够挂掉的情况,当然这些都是我们及其不能容忍的,第一个必须要做到高可靠,其次才是高性能,好了,下面我来逐一搭建一下。 一:Redis集群搭建 1. 下载 首先去官网下载较新的3.2.0版本,下载方式还是非常简单的,比如官网介绍的这样。 $ wget http://download.redis.io/releases/redis-3.2.0.tar.gz $ tar xzf redis-3.2.0.tar.gz $ cd redis-3.2.0 $ make 2. redis配置 由于我们要做集群,而且还要redis自带的redis-trib.rb 能正常运行,我们需要在集群中开启三台master,三台slave,所以这里我需要建立6个文件 夹,而且文件夹的名称就使用端口地址的名字,比如:6389. 6380....6384。

3. config配置。 现在directory的分布情况大致如上图,接下来要做的事情就是配置redis.conf了,在这里需要配置四个选项。。。 <1> port 端口地址,比如6380文件夹下面的port就是6380, # Accept connections on the specified port, default is6379 (IANA #815344). # If port 0is specified Redis will not listen on a TCP socket. port 6379 <2> cluster-enabled 和cluster-config-file 这个顾名思义,首先需要开启redis的cluster模式,然后配置一个cluster-config-file文件,这个文件用于存放redis 的实时信息,redis会动态追加和修改这个conf下面的内容信息,不过要记住,这个nodes-6379.conf 可以根据端口文件夹依次配置,比如6380文件夹可以改成nodes-6380.conf这样。。。 # Normal Redis instances can't be part of a Redis Cluster; only nodes that are # started as cluster nodes can. In order to start a Redis instance as a

Windows下Redis集群搭建

Windows下搭建Redis集群 Redis 集群简介 Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存。Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,可完全是没法满足业务的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。 Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。 Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。 集群搭建 要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时,强烈建议使用六个节点:其中三个为主节点,而其余三个则是各个主节点的从节点。 主节点崩溃,从节点的Redis就会提升为主节点,代替原来的主节点工作,崩溃的主Redis回复工作后,会成为从节点 1). 创建Redis集群目录 在redis安装的根目录下通过命令行创建6个以端口命名的文件夹 mkdir 7000 7001 7002 7003 7004 7005

将安装的redis文件夹中的redis.windows.conf以及redis-server,分别拷贝到新建的六个文件夹中 2). 更改配置 将六个文件夹下的redis.windows.conf文件中以下属性进行修改: port 7001(对应文件夹的端口号) cluster-enabled yes(开启实例的集群模式)去掉注释

redis4.0.x集群创建及验证

redis4.0.x集群搭建 一.集群搭建前提环境-ruby 因为redis集群环境基于ruby,所以需要先安装ruby运行环境。 采用rvm来安装或者升级ruby,因为有些服务器已经有了ruby,比如我买的阿里云好几台都是ruby2.0,你在安装redis集群时,执行gem install redis 安装接口命令就会报错: redis需要Ruby版本> = 2.2.2 告诉你最起码需要2.2.2的版本,因为现在redis4.0.x比较多,2.0版本低了,redis3.0貌似不会有这个问题。 --------------------------------------------------- 1.安装RVM:(以下每一行都是一条命令) gpg2 --keyserver hkp://https://www.wendangku.net/doc/a612737444.html, --recv-keys D39DC0E3 curl -L get.rvm.io | bash -s stable 网速低的话装起来稍微慢点,装完后执行find进行查找,找到标红的rvm。 find / -name rvm -print / usr / local / rvm / usr / local / rvm / src / rvm /usr/local/rvm/src/rvm/bin/rvm /usr/local/rvm/src/rvm/lib/rvm /usr/local/rvm / src / rvm / scripts / rvm / usr / local / rvm / bin / rvm / usr / local / rvm / lib / rvm / usr / local / rvm / scripts / rvm 然后执行source命令: source /usr/local/rvm/scripts/rvm 2.查看RVM库中已知的ruby版本 rvm list known [ruby-] 1.8.6 [-p420] [ruby-] 1.8.7 [-head]#在头上发布的安全性 [ruby-] 1.9.1 [-p431] [ruby-] 1.9.2 [-p330 ]

Redis集群安装

Redis集群配置1.集群节点配置

2.启动集群 2.1 节点启动 redis-server **/redis.conf(节点配置文件) 2.2 建立集群 建立集群需要使用redis源码中src/redis-trib.rb脚本,因此要先安装ruby运行环境。 利用脚本建立集群后,节点中会记录集群的信息,再次启动时不需要重新建立集群。 因此ruby的运行环境不需要安装到redis节点主机上。 2.3.1 使用脚本建立集群 redis-trib.rb create --replicas 1 192.168.31.245:7000 192.168.31.245:7001 192.168.31.245:7002 192.168.31.210:7003 192.168.31.210:7004 192.168.31.210:7005 --replicas 1 每个master的备份节点数 2.3.2 安装ruby运行环境 ●安装rvm 参考https://rvm.io/ 非root用户运行 ◆gpg --keyserver hkp://https://www.wendangku.net/doc/a612737444.html, --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB ◆\curl -sSL https://get.rvm.io | bash -s stable ●安装ruby rvm install ruby-2.4 ●安装ruby与redis的接口 gem install redis 3.Redis集群与单节点的不同 ●不支持多数据库,不支持切换数据库的select命令 ●集群节点使用redis端口号+10000的端口进行集群节点间的通信

redis集群部署

redis 3.07 的集群部署 一:关于redis cluster 1:redis cluster 的现状 1) : 节点自动发现 2) :slave->master 选举,集群容错 3) :Hot resharding: 在线分片 4) :进群管理:cluster xxx 5) : 基于配置(nodes-port.conf) 的集群管理 6) :ASK 转向/MOVED 转向机制. 2:redis cluster 架构 1) redis-cluster 架构图 架构细节: (1) 所有的redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽.

(2) 节点的fail 是通过集群中超过半数的节点检测失效时才生效. (3) 客户端与redis 节点直连,不需要中间proxy 层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 (4) redis-cluster 把所有的物理节点映射到[0-16383]slot 上,cluster 负责维护node<->slot<->value 2) redis-cluster 选举: 容错 (1) 领着选举过程是集群中所有master 参与,如果半数以上master 节点与master 节点通信超过(cluster-node-timeout), 认为当前master 节点挂掉. (2) : 什么时候整个集群不可用(cluster_state:fail), 当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down) 错误 a: 如果集群任意master 挂掉,且当前master 没有slave. 集群进入fail 状态,也可以理解成进群的slot 映射[0-16383] 不完成时进入fail 状态. b:如果进群超过半数以上master 挂掉,无论是否有slave 集群进入fail 状态.

Redis 集群应用学习

集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节点,来降低单节点服务器的压力。 上一篇我们讲到了Redis 的主从复制技术,当实现了多节点的master-slave 后,我们 也可以把它叫做集群,但我们今天要讲的集群主要是利用切片技术来组建的集群。 集群要实现的目的是要将不同的key 分散放置到不同的redis 节点,这里我们需要一个 规则或者算法,通常的做法是获取key 的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的key 无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。 一致性哈希有四个重要特征: 均衡性:也有人把它定义为平衡性,是指哈希的结果能够尽可能分布到所有的节点中去,这样可以有效的利用每个节点上的资源。 单调性:对于单调性有很多翻译让我非常的不解,而我想要的是当节点数量变化时哈希的结果应尽可能的保护已分配的内容不会被重新分派到新的节点。 分散性和负载:这两个其实是差不多的意思,就是要求一致性哈希算法对key 哈希应尽可能的避免重复。 但一致性哈希不是我们今天要介绍的重点,因为Redis 引入另一种哈希槽(hash slot) 的概念。 Redis 集群中内置了16384 个哈希槽,当需要在Redis 集群中放置一个key-value 时,redis 先对key 使用crc16 算法算出一个结果,然后把结果对16384 求余数,这样每个key 都会对应一个编号在0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。 使用哈希槽的好处就在于可以方便的添加或移除节点。 当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了; 当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了; 内部机制,与我何干,对于我们来说,在新增或移除节点的时候不要让我们先停掉所有的redis 服务我就谢天谢地了,这点它做到了。 下面我们就开始动手搭建一个redis 集群来体验一下。 因为我们要启动多个redis 实例,虽然我们可以直接通过命令行来启动,但始终是不怎么方便的,所以我们先来新建三个实例目录,分别是9001,9002,9003,目录名就是redis 实例的端口号。

redis集群教程

Redis 集群教程 本文档是Redis集群的一般介绍,没有涉及复杂难懂的分布式概念的赘述,只是提供了从用户角度来如何搭建测试以及使用的方法,如果你打算使用并深入了解Redis集群,推荐阅读完本章节后,仔细阅读Redis 集群规范一章. Redis 集群目前处于Alpha测试阶段, 如果使用过程中发现了问题,请到Redis 邮件列表发帖或者将错误提交到Redis的Github 页面上. Redis集群介绍 Redis 集群是一个提供在多个Redis间节点间共享数据的程序集. Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误. Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势: ?自动分割数据到不同的节点上. ?整个集群的部分节点失败或者不可达的情况下能够继续处理命令. Redis 集群的数据分片 Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念. Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么: ?节点A 包含0 到5500号哈希槽. ?节点B 包含5501 到11000 号哈希槽. ?节点C 包含11001 到16384号哈希槽. 这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点A, B, C中得部分槽到D上. 如果我像移除节点A,需要将A中得槽移到B和C节点上,然后将没有任何槽的A 节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态. Redis 集群的主从复制模型 为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品. 在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.

Redis Cluster介绍

Redis集群介绍 Redis集群实现的功能 Redis 集群是分布式(distributed)的Redis 实现,具有一定的容错性(fault-tolerant)和线性可扩展性(linear scalability)。 功能: 可线性扩展到上千个节点 可使数据自动路由到多个节点 实现了多个节点间的数据共享 可支持动态增加或删除节点 可保证某些节点无法提供服务时不影响整个集群的操作 不保证数据的强一致性 命令: 支持Redis所有处理单个数据库键的命令 不支持对多个数据库键的操作,比如MSET、SUNION 不能使用SELECT 命令,集群只使用默认的0号数据库 Redis集群的数据分布 Hash Slot Redis集群没有使用一致性hash,而是引入了哈希槽(Hash Slot)的概念。 Redis集群一共有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定对应哪个槽。 HASH_SLOT = CRC16(key) mod 16384 Node 每个主节点都负责处理16384 个哈希槽的其中一部分,由于Redis 集群的key被分割为16384 个slot,所以集群的最大节点数量也是16384 个。推荐的最大节点数量为1000个左右。 比如当前集群有3个节点A,B,C那么: 节点A 包含0 到5500号哈希槽 节点B 包含5501 到11000 号哈希槽 节点C 包含11001 到16383号哈希草槽 说明: 所有的哈希槽必须配置在集群中的某一个节点上。 节点和哈希槽之间的对应关系在搭建集群时配置,集群使用中也支持动态迁移

Redis集群的主从复制 节点分为主节点和从节点,为了保证集群的高可用性,每个主节点可配置多个从节点。主从节点数据不能保证强一致性,使用中有如下两种场景可能会发生写丢失的情况: 场景一:数据的异步复制 对集群中某一节点执行写操作过程: Step1 客户端向主节点B写入一条命令 Step2 主节点B向客户端回复命令状态 Step3 主节点将写操作复制给从节点B1, B2和B3 这里主节点对命令的复制工作发生在返回命令回复之后,如果Step3之前主节点B宕机,其中一个从节点升级为主节点后就出现了数据不一致的情况。 不过,如果每次处理命令请求都需要等待复制操作完成的话,那么主节点处理命令请求的速度将极大地降低,所以需要在性能和一致性之间做出权衡。Redis 集群可能会在将来提供同步写的方法。 场景二:节点间网络分区 假设集群包含A、B、C、A1、B1、C1六个节点,其中A、B、C为主节点,A1、B1、C1为A,B,C的从节点,还有一个客户端Z1。 假设集群中发生网络分区,那么集群可能会分为两方,大部分的一方包含节点A、C、A1、B1和C1,小部分的一方则包含节点B和客户端Z1 。 Z1仍然能够向主节点B中写入,如果网络分区发生时间较短,那么集群将会继续正常运作。如果分区的时间足够让大部分的一方将B1选举为新的master,那么Z1写入B中的数据便丢失了。 在网络分裂出现期间,客户端Z1 可以向主节点B 发送写命令的最大时间是有限制的,这一时间限制称为节点超时时间(node timeout),是Redis 集群的一个重要的配置选项:对于大多数一方来说,如果一个主节点未能在节点超时时间内重新联系上集群,那么集群会将这个主节点视为failing,并使用从节点来代替这个主节点继续工作。 对于少数一方,如果一个主节点未能在节点超时时间内重新联系上集群,那么它将停止处理写命令,并向客户端报告错误。 A1 A B B1 C1 C Z1 A1 A B1 C1 C B Z1 network partition

相关文档