1、Redis集群的搭建(CentOS6)
(要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下)
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
1:下载redis。官网下载3.0.0版本,之前2.几的版本不支持集群模式
下载地址:https://github.com/antirez/redis/archive/3.0.0-rc2.tar.gz
2:上传服务器,解压,编译
tar -zxvf redis-3.0.0-rc2.tar.gz mv redis-3.0.0-rc2.tar.gz redis3.0 cd /usr/local/redis3.0 make make install |
3:创建集群需要的目录
mkdir -p /usr.local/cluster cd /usr.local/cluster mkdir 7000 mkdir 7001 mkdir 7002 mkdir 7003 mkdir 7004 mkdir 7005
|
4:修改配置文件redis.conf
cp /usr/local/redis3.0/redis.conf /usr.local/cluster vi redis.conf ##修改配置文件中的下面选项 port 7000 daemonize yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes ##修改完redis.conf配置文件中的这些配置项之后把这个配置文件分别拷贝到7000/7001/7002/7003/7004/7005目录下面 cp /usr/local/cluster/redis.conf /usr/local/cluster/7000 cp /usr/local/cluster/redis.conf /usr/local/cluster/7001 cp /usr/local/cluster/redis.conf /usr/local/cluster/7002 cp /usr/local/cluster/redis.conf /usr/local/cluster/7003 cp /usr/local/cluster/redis.conf /usr/local/cluster/7004 cp /usr/local/cluster/redis.conf /usr/local/cluster/7005 ##注意:拷贝完成之后要修改7001/7002/7003/7004/7005目录下面redis.conf文件中的port参数,分别改为对应的文件夹的名称 |
5:分别启动这6个redis实例
cd /usr/local/cluster/7000 redis-server redis.conf cd /usr/local/cluster/7001 redis-server redis.conf cd /usr/local/cluster/7002 redis-server redis.conf cd /usr/local/cluster/7003 redis-server redis.conf cd /usr/local/cluster/7004 redis-server redis.conf cd /usr/local/cluster/7005 redis-server redis.conf ##启动之后使用命令查看redis的启动情况ps -ef|grep redis 如下图显示则说明启动成功 |
6:执行redis的创建集群命令创建集群
cd /usr/local/redis3.0/src ./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 |
说明:上面我们已经看到了redis-trib.rb支持的所有子命令了,而其中用于构建Redis Cluster的子命令就是create。create子命令的参数有两种,host1:port1 ... hostN:portN指定了用于构建Redis Cluster的所有redis实例,而--replicas 则指定了为Redis Cluster中的每个Master节点配备几个Slave节点。关于后一个参数这里需要简单说明一下,那就是Redis Cluster中的节点分为两种:Master节点和Slave节点,一个Master节点可以拥有若干个Slave节点,Master节点上的数据通过异步方式与Slave节点实现数据同步,当Master节点因为某种原因退出集群后,Redis Cluster会自动从该Master节点的Slave节点中选择出一个作为新的Master节点。因此,redis-trib.rb工具的create子命令提供了--args参数来指定集群中的Master节点拥有几个Slave节点,譬如使用6个redis实例构建集群且--args参数值为1,那么整个集群就包含三个Master节点和三个Slave节点,每个Master节点都有一个Slave节点。这里我们只有三个redis实例,所以选择不为Master节点配备Slave节点,创建集群的方法和结果如图三所示,从中可知Redis集群已经构建成功,其中监听6379的实例负责存储0-5460哈希槽,监听6380的实例负责存储5461-10921哈希槽,监听6381的实例负责存储10922-16383哈希槽。
6.1执行上面的命令的时候会报错,因为是执行的ruby的脚本,需要ruby的环境
错误内容:/usr/bin/env: ruby: No such file or directory
所以需要安装ruby的环境,这里推荐使用yum install ruby安装
yum install ruby |
6.2然后再执行第6步的创建集群命令,还会报错,提示缺少rubygems组件,使用yum安装
错误内容:
./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
from ./redis-trib.rb:24
yum install rubygems 通过redis-trib.rb工具构建Redis Cluster。通过以上操作我们已经有了独立运行的Redis实例,彼此之间各自为政,接下来就是redis-trib.rb工具发挥作用的时候了。在执行该工具之前,一些准备工作是必不可少的,其一就是安装ruby和rubygem,为了方便起见这里推荐安装ruby 1.9.2及之后的版本,这些版本已经包含了rubygem,无需单独安装,安装方法这里就不赘述了。在完成ruby和rubygem的安装之后,我们还需要为ruby安装redis库,安装命令为:gem install redis。在做完了以上这些准备工作后,我们就可以执行redis-trib.rb这个工具了 |
6.3再次执行第6步的命令,还会报错,提示不能加载redis,是因为缺少redis和ruby的接口,使用gem 安装
错误内容:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25
gem install redis |
6.4 再次执行第6步的命令,正常执行
输入yes,然后配置完成。
至此redis集群即搭建成功!
7:使用redis-cli命令进入集群环境
redis-cli -c -p 7000 |
2、Redis集群添加节点
1:首先把需要添加的节点启动
cd /usr/local/cluster/ mkdir 7006 cp /usr/local/cluster/redis.conf /usr/local/cluster/7006/ cd /usr/local/cluster/7006/ vi redis.conf ##修改redis.conf中的port参数的值为7006 redis-server redis.conf |
2:执行以下命令,将这个新节点添加到集群中
cd /usr/local/redis3.0/src/ ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000 |
3:执行命令redis-cli -c -p 7000 cluster nodes,查看刚才新增的节点
4:增加了新的节点之后,这个新的节点可以成为主节点或者是从节点
4.1 把这个节点变成主节点,使用redis-trib程序,将集群中的某些哈希槽移动到新节点里面, 这个新节点就成为真正的主节点了。
执行下面的命令对集群中的哈希槽进行移动
cd /usr/local/redis3.0/src ./redis-trib.rb reshard 127.0.0.1:7000 |
系统会提示我们要移动多少哈希槽,这里移动1000个
然后还需要指定把这些哈希槽转移到哪个节点上,
输入我们刚才新增的节点的ID
f32dc088c881a6b930474fc5b52832ba2ff71899
然后需要我们指定转移哪几个几点的哈希槽
输入all 表示从所有的主节点中随机转移,凑够1000个哈希槽
然后再输入yes,redis集群就开始分配哈希槽了。
至此,一个新的主节点就添加完成了,执行命令查看现在的集群中节点的状态
redis-cli -c -p 7000 cluster nodes |
4.2:把这个节点变成从节点
前面我们已经把这个新节点添加到集群中了,现在我们要让新节点成为127.0.0.1:7001的从节点,只需要执行下面的命令就可以了,命令后面的节点ID就是127.0.0.1:7001的节点ID
redis-cli -c -p 7006 cluster replicate 0b00721a509444db793d28448d8f02168b94bd38 |
使用下面命令来确认一下127.0.0.1:7006是否已经成为127.0.0.1:7001的从节点
redis-cli -p 7000 cluster nodes | grep slave | grep 0b00721a509444db793d28448d8f02168b94bd38 |
看到下面图片中的情况就表示添加成功
注意:我们发现新增的节点并不包含任何哈希槽,因为它还没有数据。
3、Redis集群删除节点
1:如果删除的节点是主节点,这里我们删除127.0.0.1:7006节点,这个节点有1000个哈希槽
首先要把节点中的哈希槽转移到其他节点中,执行下面的命令
cd /usr/local/redis3.0/src ./redis-trib.rb reshard 127.0.0.1:7000 |
系统会提示我们要移动多少哈希槽,这里移动1000个,因为127.0.0.1:7006节点有1000个哈希槽
然后系统提示我们输入要接收这些哈希槽的节点的ID,这里使用127.0.0.1:7001的节点ID
然后要我们选择从那些节点中转出哈希槽,这里一定要输入127.0.0.1:7006这个节点的ID,最后输入 done 表示输入完毕
最后一步,使用下面的命令把这个节点删除
cd /usr/local/redis3.0/src/ ./redis-trib.rb del-node 127.0.0.1:7006 127.0.0.1:7006 |
2:如果节点是从节点的,直接使用下面的命令删除即可。
cd /usr/local/redis3.0/src/ ./redis-trib.rb del-node 127.0.0.1:7006 127.0.0.1:7006 |
补充删除一个节点:
zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 'cbb01bdfdc265b190496956354d84aaae6e7d54d'
这里要注意一下,第一个参数是集群中的任何一个主节点地址,而第二个参数是要删除节点的 ID,这个ID如果你不知道的话,可以通过 cluster nodes 命令查看。
还有一点就是要删除的节点必须是空的,也就是不能缓存任何数据,否则会删除不成功。对于非空节点,在删除之前需要重新分片,将缓存的数据转移到别的节点。
如何重新分片:
我们先给某个节点做点数据:
zhaogh$ ./redis-cli -c -p 9001
127.0.0.1:9001> set testkey001 testvalue001
-> Redirected to slot [12786] located at 127.0.0.1:9003
OK
127.0.0.1:9003>
现在 9003 上已经有数据了,我们尝试删除一下:
zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 '78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3'
>>> Removing node 78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3 from cluster 127.0.0.1:9001
Connecting to node 127.0.0.1:9001: OK
Connecting to node 127.0.0.1:9002: OK
Connecting to node 127.0.0.1:9003: OK
[ERR] Node 127.0.0.1:9003 is not empty! Reshard data away and try again.
zhaoguihuadediannao:src zhaogh$
没有删除成功,我们来重新分片,把 9003 上的数据转移:
zhaogh$ ./redis-trib.rb reshard 127.0.0.1:9003
然后输出了很多信息,很多数值和ID都可以从这段信息中找到。
How many slots do you want to move (from 1 to 16384)? 5461
会问你要移动多少个哈希槽,我们把 9003 上的所有哈希槽都移走,5461 这个数字可以从终端上看到,或许你的实际情况不是这个数字。
What is the receiving node ID? 4d2e0a8360795ce7ce8381c68746034aeba3c9b9
然后问你你要把这些哈希槽移到哪儿去,我指定了 9001 的 节点 ID。
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3
Source node #2:done
之后,redis 列出了重新分片计划,最后问你
Do you want to proceed with the proposed reshard plan (yes/no)? yes
执行完成后,我们看看 9003 上还有没有 key:
zhaogh$ ./redis-cli -p 9003
127.0.0.1:9003> keys *
(empty list or set)
127.0.0.1:9003>
再看看 9001 上是不是有这个 key 了
zhaogh$ ./redis-cli -p 9001
127.0.0.1:9001> keys *
1) "testkey001"
127.0.0.1:9001>
没错,果然转移过来了。
最后我们试试能不能把 9003 删除:
zhaogh$ ./redis-trib.rb del-node 127.0.0.1:9001 '78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3'
>>> Removing node 78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3 from cluster 127.0.0.1:9001
Connecting to node 127.0.0.1:9001: OK
Connecting to node 127.0.0.1:9002: OK
Connecting to node 127.0.0.1:9003: OK
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
zhaogh$ ./redis-cli -p 9003
Could not connect to Redis at 127.0.0.1:9003: Connection refused
not connected>
参考:
gem redis: https://rubygems.org/gems/redis/versions/3.2.1
ruby: https://www.ruby-lang.org/en/downloads/
redis: http://redis.io/download