redis从3.0版本开始正式支持集群功能,新的集群功能并没有使用之前的一致性哈希原理来分配数据,而是采用哈希槽的方式来分配,默认一共分配16384个哈希槽,那么key是怎么分配到哈希槽的呢,是通过CRC16的算法进行取模来分配对应的哈希槽,具体的算法就是:CRC16(key)% 16384,获取到的值分配到哈希槽对应的节点上。
一、下面开始说下创建集群的过程以及遇到的问题:
1.到http://download.redis.io/releases/下载3.0以后的版本解压,我下载的是3.2.0版本
tar -zxvf redis-3.2.0.tar.gz2.解压后,进入解压出的目录,进行redis_server等的安装
cd redis-3.2.0 make PREFIX=/opt/work/redis make PREFIX=/opt/work/redis install3.安装完成后 ,进入:/opt/work/redis/,会发现有一个bin的目录,然后 把redis-3.2.0/src目录下的 redis-trib.rb文件拷贝到 /opt/work/redis/bin,bin目录下有如下的文件就OK了:
4.在/opt/work/redis/目录下创建7000-7005的六个文件夹:
mkdir 7000 7001 7002 7003 7004 70055.进入每一个文件夹,创建redis.conf文件,将如下内容拷贝到文件中,端口号要去目录对应:
port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes6.开始启动redis服务,分别到7000-7005目录下面,执行下面命令, 注意:一定要到此目录下执行,否则启动服务会报错
../bin/redis-server ./redis.conf7.出现如下信息就是启动成功了:
8.6个redis服务都启动成功后,可以创建redis集群了,进入bin目录下,执行如下命令:
./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:70059.报:/usr/bin/env: ruby: No such file or directory这个错误的时候,说明没有安装ruby环境,先安装下ruby环境:
yum -y install zlib ruby rubygems gem install redis10.OK了,再执行第8步骤的命令,兴奋的时刻来了,输入yes集群创建成功了:
1.通过如下命令检查下集群状态:
../bin/redis-trib.rb check 127.0.0.1:7000
如上图所示,可以看到有三个主节点,三个从节点。
2.redis集群的特点是去中心化的,连接那一个节点都可以设置数据和获取数据。使用redis-cli这个客户端工具连接上集群,注意需要使用-c参数:
redis-cli -c -p 7000
设置一个值:
127.0.0.1:7000> set my_name dajun -> Redirected to slot [12803] located at 127.0.0.1:7002 OK 127.0.0.1:7000> get my_name "dajun"
首先咱们来模拟主节点挂掉的情况,那咱们就让7000这个节点挂掉,先给他kill掉;按照前面所说的,7000主节点有一个7003的从节点,那么最终7003应该会被选举为master,咱们来看下:
../bin/redis-trib.rb check 127.0.0.1:7000
[ERR] Sorry, can't connect to node 127.0.0.1:7000
../bin/redis-trib.rb check 127.0.0.1:7001
>>> Performing Cluster Check (using node 127.0.0.1:7001) M: 1ec28165045843602ad5cd22711fe654798c29af 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: 2ed7f35880c2c28fa287b7c0d30e5f6d53f3b9ff 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: baf55935a7ee1dfd07a484813d78b3520636066b 127.0.0.1:7003 slots:0-5460 (5461 slots) master 0 additional replica(s) S: 84dc74abfc03e8a391fc5b4ff292537d74d23845 127.0.0.1:7005 slots: (0 slots) slave replicates 2ed7f35880c2c28fa287b7c0d30e5f6d53f3b9ff S: bc9fec358a5ae5201193b551698ca1732dbd83e5 127.0.0.1:7004 slots: (0 slots) slave replicates 1ec28165045843602ad5cd22711fe654798c29af [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.如上所示,通过7000检测状态已经不行了,通过7001检测发现还是三个master,slave变成了两个,7000对应的slave变成了master了,符合期望,而且之前存储在7000上的数据同样也还能查到。
咱们重新把7000这个节点起来,看看会出现什么结果:
>>> Performing Cluster Check (using node 127.0.0.1:7001) M: 1ec28165045843602ad5cd22711fe654798c29af 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) M: 2ed7f35880c2c28fa287b7c0d30e5f6d53f3b9ff 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: baf55935a7ee1dfd07a484813d78b3520636066b 127.0.0.1:7003 slots:0-5460 (5461 slots) master 1 additional replica(s) S: e658473a7023f46816cf607754231a9396852f33 127.0.0.1:7000 slots: (0 slots) slave replicates baf55935a7ee1dfd07a484813d78b3520636066b S: 84dc74abfc03e8a391fc5b4ff292537d74d23845 127.0.0.1:7005 slots: (0 slots) slave replicates 2ed7f35880c2c28fa287b7c0d30e5f6d53f3b9ff S: bc9fec358a5ae5201193b551698ca1732dbd83e5 127.0.0.1:7004 slots: (0 slots) slave replicates 1ec28165045843602ad5cd22711fe654798c29af [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
四、集群添加节点,移除节点
集群添加节点的时候,如果是master的话,添加完成的时候槽数为0,需要执行reshard命令进行分配槽位数,如果是slave的话就不用管了;同理移除节点的时候,需要首先将所移除节点中的数据移动到其他的节点上,然后才能删除。
OK,就写这些了,有问题的欢迎拍砖奥。。