在上一篇文章《大数据学习初级入门教程(二) —— Redis 3.x 单节点的安装、启动和测试》中,介绍了如何在工作需要时,临时安装一个单节点的 Redis 库,便于进行测试。
这一篇主要说说如何搭建 Redis 伪分布式集群,就是说机器不够的情况下,模拟搭建 Redis 集群。
集群搭建条件:
Redis 集群至少需要 3 个节点;
每个集群节点都需要有从节点,即备份节点,保证集群的高可用性,所以还需要 3 个备份节点;
服务器需要安装 ruby 环境。
集群搭建环境:
服务器:
CentOS release 6.9 (Final) x64
Java 环境:
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
Redis 版本:
redis-3.2.9.tar.gz
Ruby 版本:
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
Gem 版本:
1.3.7
Redis 和 Ruby 的接口包:
redis-3.2.1.gem
开始伪分布式集群部署:
由于在上篇文章中,已经安装了 Redis 单节点,所以这里不再需要上传安装包、解压、编译、安装等。
第一步,创建存放集群环境的目录文件夹。
第二步,复制已经安装的 redis。
把 redis 目录下 的 bin 目录下的所有文件复制到 redis-cluster/redis01 目录下,redis01 会自动创建。
命令:cp -R redis/bin/ redis-cluster/redis01
第三步,删除原 redis 目录下的数据文件 dump.rdb。
命令:rm -f redis-cluster/redis01/dump.rdb
第四步,修改 redis.conf 配置文件。
命令:vi redis-cluster/redis01/redis.conf
修改几个地方,首先修改端口号,原来默认为 6379,现修改为 7000。
另外需要打开集群创建模式,原来默认是注释掉的,直接去掉注释即可。
修改 pid 进程文件名,默认为 redis_6379.pid,按照端口号修改为 redis_7000.pid。
修改 log 文件名,默认为空,按照端口号修改为 redis_7000.log,注意如果没有对应的文件夹,需要提前创建。
第五步,复制出其它 5 个模拟节点。
将 redis-cluster/redis01 文件夹复制 5 份,分别为 redis02-redis06,都在目录 redis-cluster 下,模拟 Redis 集群的 6 个节点。并且需要将其余 5 个文件夹下的 redis.conf 里面的端口号分别修改为7001-7005。
第六步,分别启动 6 个节点。
如果启动麻烦,可以写个 shell 脚本。
命令:vi redis-cluster/startAllRedis.sh
#! /bin/bash
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..
echo "所有redis服务均已启动,进程信息如下:"
ps -ef |grep redis
exit 0
保存后,需要赋予脚本执行权限。
命令:chmod +x redis-cluster/startAllRedis.sh
运行脚本,启动 redis 节点。
命令:cd redis-cluster/
sh startAllRedis.sh
第七步,安装 ruby 运行环境。
要搭建集群的话,需要使用一个工具(脚本文件 redis-trib.rb),这个工具在 redis 解压文件的源代码里。因为这个工具是一个 ruby 脚本文件,所以这个工具的运行需要 ruby 的运行环境,所以需要安装ruby。
命令:yum install ruby
第八步,拷贝集群搭建的脚本文件。
拷贝第七步中提到的脚本文件,直接放到 redis-cluster 目录下。
命令:cp ~/redis/redis-3.2.9/src/redis-trib.rb redis-cluster/
第九步,执行搭建集群脚本,搭建集群。
命令:cd redis-cluster/
./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:24:in `require': no such file to load -- rubygems (LoadError)
from ./redis-trib.rb:24
是因为缺少 rubygems 组件导致的,使用 yum 安装。
命令:yum install rubygems
再次执行创建集群的命令。
又有出现报错,信息如下:
/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
提示不能加载 redis,是因为缺少 redis 和 ruby 的接口,使用 gem 安装。
命令:gem install redis
如果该命令下载不了接口包,可以手动下载并上传服务器,安装即可。
命令:gem install redis-3.2.1.gem
再次执行创建集群的命令即可创建集群成功,如果仍有错误,可以参考文章最后的常见错误解答。
[root@node100 redis-cluster]# ./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
>>> Creating cluster
[ERR] Sorry, can't connect to node 127.0.0.1:7000
[root@node100 redis-cluster]# cd /
[root@node100 /]# find -name client.rb
./usr/lib/ruby/1.8/xmlrpc/client.rb
./usr/lib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb
[root@node100 /]# vi /usr/lib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb
require "redis/errors"
require "socket"
require "cgi"
class Redis
class Client
DEFAULTS = {
:url => lambda { ENV["REDIS_URL"] },
:scheme => "redis",
:host => "127.0.0.1",
:port => 6379,
:path => nil,
:timeout => 5.0,
:connect_timeout => 5.0,
:password => "123456",
:db => 0,
:driver => nil,
:id => nil,
:tcp_keepalive => 0,
<ib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb" 574L, 14334C written
[root@node100 /]# ./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-bash: ./redis-trib.rb: No such file or directory
[root@node100 /]# cd /usr/redis-cluster/
[root@node100 redis-cluster]# ./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
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: f23b3418e4a454c8336c662a5d6022130f38ff30 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: 100079aaff82a2eb6bb3967c8649deea63aceb08 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: d600b4a56d1e92261d163aac266754d14a44a703 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
S: 0a2306e861fb268b3ce5600323b76b992d8769f5 127.0.0.1:7003
replicates f23b3418e4a454c8336c662a5d6022130f38ff30
S: e35e98e6c061fc80c85ba02f9d1de6dccba91f7f 127.0.0.1:7004
replicates 100079aaff82a2eb6bb3967c8649deea63aceb08
S: 34210a92160dc1994f02dc50a656ed9f52515329 127.0.0.1:7005
replicates d600b4a56d1e92261d163aac266754d14a44a703
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: f23b3418e4a454c8336c662a5d6022130f38ff30 127.0.0.1:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: e35e98e6c061fc80c85ba02f9d1de6dccba91f7f 127.0.0.1:7004
slots: (0 slots) slave
replicates 100079aaff82a2eb6bb3967c8649deea63aceb08
S: 0a2306e861fb268b3ce5600323b76b992d8769f5 127.0.0.1:7003
slots: (0 slots) slave
replicates f23b3418e4a454c8336c662a5d6022130f38ff30
S: 34210a92160dc1994f02dc50a656ed9f52515329 127.0.0.1:7005
slots: (0 slots) slave
replicates d600b4a56d1e92261d163aac266754d14a44a703
M: 100079aaff82a2eb6bb3967c8649deea63aceb08 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: d600b4a56d1e92261d163aac266754d14a44a703 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node100 redis-cluster]#
可以看到 7000、7001、7002 为 Master,7003、7004、7005 为 Slave。信息同时显示了每个节点所分配的 slots(哈希槽),3 个主节点分别映射了 0-5460、5461-10922、10923-16383 solts。
第十步,使用集群。
要使用搭建的集群,连接集群中任意一个节点即可,比如这里连接 7002。
命令:./redis-cli -p 7002 -c
127.0.0.1:7002> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_sent:2920
cluster_stats_messages_received:2920
127.0.0.1:7002> cluster nodes
e35e98e6c061fc80c85ba02f9d1de6dccba91f7f 127.0.0.1:7004 slave 100079aaff82a2eb6bb3967c8649deea63aceb08 0 1576308662000 5 connected
34210a92160dc1994f02dc50a656ed9f52515329 127.0.0.1:7005 slave d600b4a56d1e92261d163aac266754d14a44a703 0 1576308662504 6 connected
f23b3418e4a454c8336c662a5d6022130f38ff30 127.0.0.1:7000 master - 0 1576308659988 1 connected 0-5460
0a2306e861fb268b3ce5600323b76b992d8769f5 127.0.0.1:7003 slave f23b3418e4a454c8336c662a5d6022130f38ff30 0 1576308660994 4 connected
d600b4a56d1e92261d163aac266754d14a44a703 127.0.0.1:7002 myself,master - 0 0 3 connected 10923-16383
100079aaff82a2eb6bb3967c8649deea63aceb08 127.0.0.1:7001 master - 0 1576308663007 2 connected 5461-10922
127.0.0.1:7002>
到此,redis 伪分布式集群搭建完成了。
常见错误解答
报错信息:[ERR] Sorry, can't connect to node 127.0.0.1:7000
可能原因:
1)redis 服务没启动。。。(这个最坑!!!)
2)由于配置文件 redis.conf 中设置了密码导致。
解决方法:
方法一:可以删除节点配置文件中的密码,再次创建集群则无报错。
当这种方法会导致 redis 没有密码,不安全。如果仍想配置密码,还要搭建集群,则看方法二。
方法二:配置文件中还是配置密码,如果要执行创建集群的命令,则需要修改 client.rb 文件中的配置信息。client.rb 的路径不固定,可以通过 find 命令查找该文件。
命令:find -name client.rb
编辑配置信息中的密码部分:
报错信息:(error) MOVED 14041 127.0.0.1:7002
可能原因:这种情况一般是因为启动 redis-cli 时没有设置集群模式所导致的。
解决方法:
启动客户端时使用 -c 参数来启动集群模式:
命令:./redis-cli -p 7000 -a 123456 -c
报错信息:/usr/lib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb:113:in `call': ERR Slot 4648 is already busy (Redis::CommandError)
可能原因:运行 rb,点击 yes 后就报错了,一般和 nodes-conf 文件有关。
解决方法:只要把全部的 redis 节点目录下的 nodes.conf 删除即可。
其它错误待补充。。。