redis-cluster集群总结

Redis集群搭建

要想搭建一个最简单的Redis集群,那么至少须要6个节点:3个Master和3个Slave。为何须要3个Master呢?若是你了解过Hadoop/Storm/Zookeeper这些的话,你就会明白通常分布式要求基数个节点,这样便于选举(少数服从多数的原则)。php


Redis集群模型node

这里,我将采用一种“偷懒”的方式,在一个Linux虚拟机上搭建6个节点的Redis集群。(由于开启6个Linux虚拟机,个人电脑彻底扛不住)git

实际上,思路很简单,我将在一台节点上开启6个Redis实例,而且这6个Redis各自有本身的端口。这样的话,至关于模拟出了6台机器了。而后在以这6个实例组建Redis集群就能够了。github

第一步:为这6个实例建立好各自存放的目录redis


想想,为何要这样作呢?ruby

第二步:既然是要启动6个Redis实例,天然须要准备各自的配置文件分布式


拷贝redis.conf 6份ide

 


6个Redis实例的具体配置oop

具体来讲,须要注意下:因为在一台机器(192.168.99.121)上,所以每一个实例应该有不一样的端口;同时,每一个实例显然会有本身的存放数据的地方;开启AOF模式(持久化);开启集群配置;开启后台模式;ui

注: 若该节点的配置文件(redis.conf)指定cluster-require-full-coverage为no的话, 其余节点挂了, 仍能够查询当前节点所负责slots中的数据。

第三步:实际上,Redis集群的操做在后文你能够看到是经过Ruby脚原本完成的,所以咱们须要安装Ruby相关的RPM包,以及Redis和Ruby的接口包。


yum install ruby


yum install rubygems


gem install redis

第四步:让Redis集群工做起来!


启动6个Redis实例

接下来,咱们要经过Ruby脚原本建立集群了。


redis-trib.rb是操做Redis集群的脚本

[root@mydream121 bin]# ./redis-trib.rb create --replicas 1 192.168.99.121:8001 192.168.99.121:8002 192.168.99.121:8003 192.168.99.121:8004 192.168.99.121:8005 192.168.99.121:8006


create redis cluster


redis cluster info

首先,咱们来看一下建立集群命令中 --replicas 1,这个表明什么意思呢?1其实表明的是一个比例,就是主节点数/从节点数的比例。那么想想,在建立集群的时候,哪些节点是主节点呢?哪些节点是从节点呢?答案是将按照命令中IP:PORT的顺序,先是3个主节点,而后是3个从节点。这一点能够经过上面的2张图片印证。

其次,注意到图中slot的概念。slot对于Redis集群而言,就是一个存放数据的地方,就是一个槽。对于每个Master而言,会存在一个slot的范围,而Slave则没有。在Redis集群中,依然是Master能够读、写,而Slave只读。数据的写入,其实是分布的存储在slot中,这和之前1.X的主从模式是不同的(主从模式下Master/Slave数据存储是彻底一致的),由于Redis集群中3台Master的数据存储并不同。这一点将在后续的实验中获得验证。

第五步:验证Redis集群搭建是否成功


cluster info/cluster nodes


搭建起来的Redis集群

 

到这里,Redis集群的搭建就完毕了

 

 

数据的分布性

 


数据分布性

从上面的操做,你能够看到,当存储某一个数据的时候,会分配一个slot,而这个slot从属于某一个Master,也就是说你须要明白,数据是分布的存储在Redis集群当中的。

在线水平扩容

Redis Cluster有一个很是重要的特色就是能够在线的添加节点,实现不影响业务的水平扩容。在这里,我将会在原来6个redis节点上,再添加2个redis节点。作法和之前一致,注意修改redis.conf,而后在启动800七、8008这2个redis实例。


修改redis.conf配置

 


启动新添加的2个redis实例

 


集群状态

其实,目前虽然启动了新加的2个redis实例,可是它们是不属于集群的。下面,咱们来让它们加入集群中。


add-node命令

./redis-trib.rb add-node 192.168.99.121:8007 192.168.99.121:8006

./redis-trib.rb add-node 新节点 集群中已经存在的节点

在往集群中添加节点A的时候,须要提供一个在集群中已经存在的节点B的信息。由于知道了B的信息,就知道了整个集群的信息。为何这么说呢,来,咱们看一个文件,你就知道了。


nodes-xxx.conf

要知道集群中的每个节点都有这么一个文件,存储着集群中每个节点的信息:节点的角色、节点的ID、链接状态、slot范围、IP/PORT信息等。仔细观察图中,你能够发现,新加入的8007节点,实际上被默认为master节点,而且没有slot分配!这说明,新加入的节点如今还不能够存储数据,所以咱们要为新节点分配slot槽。

[root@mydream121 bin]# ./redis-trib.rb reshard 192.168.99.121:8001

要知道slot都分配在master上,所以其实咱们要作的就是从集群的masters上进行从新分配。上面的命令须要指定一个master节点进行reshard分片。


slot从新分配

图中要为新加入的节点8007分配500个slot,并且分配的方式是"all",all是什么意思呢?all表明从已经存在的全部的master上均匀的分配一部分slot给8007。固然你能够经过"done"来指定某一个master进行分配。注意分配给8007是经过节点ID来指定的。


分配后的集群信息

按照上面的操做,我将8008节点也加入集群中,个人想法是让8008成为8007的从节点。既然是从节点,就不须要分配slot槽。注意到add-node方式加入的节点,默认就是master节点,所以这里咱们得利用replicate指定主节点。

[root@mydream121 bin]# ./redis-trib.rb add-node 192.168.99.121:8008 192.168.99.121:8001

 


为从节点指定主节点

那么到如今,咱们就在线完成了对Redis集群的水平扩容。那么如何删除节点呢?删除节点时,数据怎么办呢?对于从节点,删除就删除了,并没关系,关键是主节点,由于主节点上有slot。所以,在删除主节点前,咱们要对主节点的slot进行从新分配,完成数据的迁移。

集群的使用

通常用predis足矣

https://github.com/nrk/predis

https://www.zybuluo.com/phper/note/248555

相关文章
相关标签/搜索