转载

redis3.x cluster

《redis3.x cluster》

前言

redis集群后,我们就需要一种数据路由算法将不同key分散存储到不同的redis节点内,通常的做法是获取某个key的hashcode,然后mod,不过这种做法无法很好的支持动态伸缩性需求,一旦节点的增或者删操作,都会导致key无法在redis中命中,所以在redis3.x之前,基本上都是采用编写一致性hash算法实现redis的集群,但是redis3.x正式支持cluster后,却采用的是hash slot(hash槽)。

redis集群中一共内置了16384个哈希槽,当set操作时,redis先对key使用crc16验证出一个结果,然后把结果对mod 16384,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。这样做的好处很明显,当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了。

目录

一、redis的下载与编译;

二、集群安装所需外围插件;

三、redis集群部署;

四、验证redis集群以及HA;

五、 重新指定redis集群的分片规则

六、集群节点的伸缩调整;

七、jediscluster API的使用;

八、注意项;

九、推荐阅读;

一、redis的下载与编译

redis的官网下载地址 http://redis.io/ ,笔者本章博文所使用的版本为redis3.0.7正式版,为了避免出现一些无法预估的错误或不一致的情况出现,建议大家使用和笔者一样的版本。或者直接使用下述命令执行redis的下载和编译,如下所示:

$ wget http://download.redis.io/releases/redis-3.0.7.tar.gz $ tar -zvxf redis-3.0.7.tar.gz $ cd redis-3.0.7 $ make

当成功执行编译命令后,redis的二进制代码包含在/src目录下。

二、集群安装所需外围环境

redis集群需要ruby的一系列环境支持,因此我们需要安装一些ruby环境,如下所示 :

$ yum install ruby $ yum install rubygems $ gem install redis

首先下载并安装ruby环境,然后是rubygems组件,最后是redis接口。在此大家需要注意,如果如法下载安装redis.gem,则可能gem服务器无法连接,手动下载安装即可,推荐地址 http://download.csdn.net/download/menggucaoyuan/8487967 。

手动安装,如下所示:

gem install -l ./redis-3.0.0.gem

三、redis集群部署

笔者的redis在安装地址在/usr/local/redis/redis-3.0.7,那么在/usr/local/redis/目录下,笔者新建了如下9个目录,如下所示:

$ mkdir redis7000 redis7001 redis7002 redis7003 redis7004 redis7005 redis7006 redis7007 redis7008

然后将/usr/local/redis/redis-3.0.7/redis.conf拷贝至上述9个新建目录中,并逐个修改每一个redis节点的redis配置项,如下所示:

port 每一个redis实例端口 daemonize yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes

上述文件中的 cluster-enabled 选项用于开实例的集群模式, 而 cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为 nodes.conf.节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。

在此大家需要注意,要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。笔者本章博文所使用的是9个节点,其中3个主节点,每一个主节点有2个从节点。

当配置完成后,使用如下命令启动每一个redis节点,如下所示:

redis-server redis.conf

当每一个节点都成功启动之后,最后再使用命令创建redis集群,如下所示:

./redis-trib.rb  create --replicas 2 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 127.0.0.1:7006 127.0.0.1:7007 127.0.0.1:7008

上述命令用于创建一个新的集群, 选项–replicas 2 表示我们希望为集群中的每个主节点创建2个从节点。之后跟着的其他参数则是这个集群实例的地址列表,3个master,6个slave。 redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯,最后可以得到如下信息:

[OK] All 16384 slots covered

这表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。

四、验证redis集群以及HA

当成功启动redis集群后,我们可以尝试使用如下命令登录redis客户端验证redis集群,如下所示:

$ ./redis-cli -c -p 7000 $ cluster nodes

当成功执行上述命令后,将会输出:

redis3.x cluster

上述集群信息显示为3个master,6个slave,采用1主2从,一共9个节点。在此大家需要注意,redis集群中如果超过半数以上的master节点不可用,意味着整个集群节点不可用。

假设我们在某一个master上set一个数据,然后kill掉这个进程,它的slave节点会接管并成为新的master,当集群中挂了3个节点后,redis会将集群进行调整,变化为1主1从,还是3个master节点,并由新的master接替之前down机的数据,这样做的好处是可以避免重新分配hash slot,如下所示: redis3.x cluster

五、重新指定redis集群的分片规则

重新分片操作基本上就是将某些节点上的哈希槽移动到另外一些节点上面, 和创建集群一样, 重新分片也可以使用 redis-trib 程序来执行一次重新分片操作。在此大家需要注意,重新分片并不会对正在运行的集群程序产生任何影响。执行分片命令,如下所示:

./redis-trib.rb reshard 127.0.0.1:7000

我们只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点。当执行重新分片命令后,会提示究竟移动多少个hash槽,这里假设我们需要移动1000个hash槽,就输入1000。接下来就要输入希望将这些hash槽移动到哪一个master的id上,最后需要指定将哪些节点上的hash槽移动到之前指定的目标master上,如果输入all就会从其他所有的master上取一些哈希槽移动到目标master上。

最后确认后你将会看到每个redis-trib移动的槽的信息,每个key的移动的信息也会打印出来。在重新分片的过程中,你得例子程序是不会受到影响的,你可以停止或者重新启动多次。在重新分片结束后你可以通过如下命令检查集群状态,如下所示:

./redis-trib.rb check 127.0.0.1:7000 

六、集群节点的伸缩调整

redis集群节点的伸缩性调整主要指的是动态向集群中添加master或者slave节点,或者移除master或者slave节点。假设在现有的集群节点中新增加一个master节点,使用如下命令:

./redis-trib.rb add-node 127.0.0.1:7009 127.0.0.1:7000

由于新加的master节点还没有分配任何的hash槽,因此还需要对这个master分配hash槽操作。当然出了添加master节点万,我们还可以向集群环境中添加slave节点,使用下述命令往集群节点中新增一个slave节点,如下所示:

./redis-trib.rb add-node --slave 127.0.0.1:7010 127.0.0.1:7000

此处的命令和添加一个主节点命令类似,此处并没有指定添加的这个从节点的主节点,这种情况下系统会在其他的复制集中的主节点中随机选取一个作为这个从节点的主节点。当然我们可以通过下面的命令指定主节点:

./redis-trib.rb add-node --slave --master-id be50d14dca84586054196c867f52bc05a5261561 127.0.0.1:7010 127.0.0.1:7000

对于移除集群环境中的master或者slave节点,可以使用下述命令:

./redis-trib.rb del-node 127.0.0.1:7000 `<node-id>`

第一个参数是任意一个节点的地址,第二个节点是你想要移除的节点地址。使用同样的方法移除主节点,不过在移除主节点前,需要确保这个主节点是空的. 如果不是空的,需要将这个节点的数据重新分片到其他主节点上。

原文  http://gao-xianglong.iteye.com/blog/2277682
正文到此结束
Loading...