自己动手搭建redis集群及使用

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.gz
2.解压后,进入解压出的目录,进行redis_server等的安装

cd redis-3.2.0
make PREFIX=/opt/work/redis
make PREFIX=/opt/work/redis install
3.安装完成后 进入:/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 7005
5.进入每一个文件夹,创建redis.conf文件,将如下内容拷贝到文件中,端口号要去目录对应:

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
6.开始启动redis服务,分别到7000-7005目录下面,执行下面命令, 注意:一定要到此目录下执行,否则启动服务会报错

../bin/redis-server ./redis.conf
7.出现如下信息就是启动成功了:



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:7005
9.报:/usr/bin/env: ruby: No such file or directory这个错误的时候,说明没有安装ruby环境,先安装下ruby环境:

yum -y install zlib ruby rubygems
gem install redis
10.OK了,再执行第8步骤的命令,兴奋的时刻来了,输入yes集群创建成功了:

自己动手搭建redis集群及使用_第1张图片


二、下面开始测试下集群:

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.

可以看到7000节点变成了7003的slave了。

四、集群添加节点,移除节点

集群添加节点的时候,如果是master的话,添加完成的时候槽数为0,需要执行reshard命令进行分配槽位数,如果是slave的话就不用管了;同理移除节点的时候,需要首先将所移除节点中的数据移动到其他的节点上,然后才能删除。

OK,就写这些了,有问题的欢迎拍砖奥。。









你可能感兴趣的:(redis,集群)