在网上查找 redis集群的相关文档,很多都是以主从或者主从故障转移而说是集群,前几天玩了下集群,今天终于写出来一部分内容,可以分享出来了。
一、 Redis集群基础介绍
1、Redis集群简介:
Redis集群是一个可以在多个 Redis 节点之间进行数据共享的设施。
Redis 集群通过分区来提供一定程度的可用性:即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
Redis 集群提供了以下两个好处:
(1、)将数据自动切分(split)到多个节点的能力。
(2、)当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。
2、集群的数据分片功能:
Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。
3、Redis集群的主从架构:
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品。
eg:如有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少B节点所承担的哈希槽这个范围的槽而不可用。
然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了。当然如果B和B1都down了,那集群还是不可用的。
二、 搭建并使用Redis集群
1、架构剖析:
IP Port
192.168.1.223 6379、6380、6381、6382 6383
192.168.1.226 6379、6380、6381、6382 6383
2、安装redis:
redis的安装方法不再阐述,看参考前面的文档:
http://www.minunix.com/2014/07/redis-install/
3、修改redis配置文件:
其它配置文件和上文中的配置一样,只需要将配置文件中的cluster 部分中开启以下三项:
cluster-enabled yes
cluster-config-file "nodes.conf"
cluster-node-timeout 1500
其它配置同Redis基础及部署文档 ;
文件中的 cluster-enabled 选项用于开实例的集群模式, 而 cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为 nodes.conf.节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。
要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。本例中使用10个节点,5个主节点,5个从节点。
4、搭建集群:
通过使用 Redis 集群命令行工具 redis-trib , 编写节点配置文件的工作可以非常容易地完成: redis-trib位于Redis源码的src文件夹中, 它是一个Ruby程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(reshared)等工作。
# ./redis-trib create --replicas 1 192.168.1.223:6379 192.168.1.223:6380 192.168.1.223:6381 192.168.1.223:6382 192.168.1.223:6383 192.168.1.226:6379
192.168.1.226:6380 192.168.1.226:6381 192.168.1.226:6382 192.168.1.226:6383
此语句是创建一个集群的命令,其中“--replicas 1”意思是为集群中的每个节点创建一个从节点,后面的是节点的实体ip:port;
redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,各个节点互相通信,得到如下结果:
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
这表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。
5、测试集群:
测试 Redis 集群比较简单的办法就是使用 redis-rb-cluster 或者 redis-cli , 我们将使用 redis-cli 为例来进行演示:
# ./redis-cli -h 192.168.1.223 -p 6379 -c
192.168.1.223:6379> set aa bb
OK
192.168.1.223:6379> set 33 dd
-> Redirected to slot [5878] located at 192.168.1.226:6379
OK
192.168.1.226:6379>get aa
-> Redirected to slot [1180] located at 192.168.1.223:6379
"bb"
192.168.1.223:6379> get 33
-> Redirected to slot [5878] located at 192.168.1.226:6379
"dd"
由此可以看到,redis集群已经搭建完成。
redis-cli 对集群的支持是非常基本的, 所以它总是依靠 Redis 集群节点来将它转向(redirect)至正确的节点。一个真正的(serious)集群客户端应该做得比这更好: 它应该用缓存记录起哈希槽与节点地址之间的映射(map), 从而直接将命令发送到正确的节点上面。这种映射只会在集群的配置出现某些修改时变化, 比如说, 在一次故障转移(failover)之后, 或者系统管理员通过添加节点或移除节点来修改了集群的布局(layout)之后, 诸如此类。