使用redis创建集群遇到的问题
1、redis的安装和ruby环境的安装
Redis的安装
安装tcl包 tar -xzvf tcl8.6.1-src.tar.gz cd /usr/local/tcl8.6.1/unix/ ./configure make && make install 分别再192.168.1.250、192.168.1.251、192.168.1.252安装redis 使用redis-4.0.9.tar.gz(截止2018年6月的最新稳定版) tar -zxvf redis-4.0.9.tar.gz cd redis-4.0.9 make && make test && make install
修改redis的配置文件项如下端口根据需要更改 port 7001 cluster-enabled yes cluster-config-file /etc/redis-cluster/node-7001.conf cluster-node-timeout 15000 daemonize yes pidfile /var/run/redis_7001.pid dir /var/redis/7001 logfile /var/log/redis/7001.log bind 192.168.31.187 appendonly yes
安装ruby环境:
tar -zxvf ruby-2.5.1.tar.gz cd ruby-2.5.1/ ./configure -prefix=/usr/local/ruby 再执行make && make install 配置环境变量在/etc/profile中添加RUBY_HOME=/usr/local/ruby PATH=PATH:$RUBY_HOME/bin source /etc/profile 使环境变量生效 redis -v 查看ruby的版本的信息 ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux] 使用gem安装redis gem install redis (version 4.0.1) 此时若执行gem install redis 报错如下 ERROR: Loading command: install (LoadError) cannot load such file -- zlib ERROR: While executing gem ... (NoMethodError) undefined method `invoke_with_build_args' for nil:NilClass 解决办法 cd ruby-2.5.1/ext/zlib/下 yum -y install openssl openssl-devel 更新openssl ruby extconf.rb 将ruby-2.5.1/ext/zlib/文件夹下的MakeFile 文件尾中的zlib.o:$(top_srcdir)/include/ruby.h 改成 zlib.o: ../../include/ruby.h 再执行make && make install 若gem install 可以使用就不用执行以下 cd ruby-2.5.1/ext/openssl/ 将ruby-2.5.1/ext/openssl/文件夹下的MakeFile 文件中所有的$(top_srcdir)/include/ruby.h 改成../../include/ruby.h 再执行make && make install
2、开始创建集群(每台起两个redis)
分别再各个机器上启动redis
redis-server ./redis-4.0.9/conf/7001.conf
redis-server ./redis-4.0.9/conf/7002.conf
操作命令如下:
redis-trib.rb create --replicas 1 master:7001 master:7002 dbnode:7001 dbnode:7002 sdbnode:7001 sdbnode:7002
报错如下:
Traceback (most recent call last):
11: from /usr/local/bin/redis-trib.rb:1830:in `<main>'
10: from /usr/local/bin/redis-trib.rb:1426:in `create_cluster_cmd'
9: from /usr/local/bin/redis-trib.rb:905:in `flush_nodes_config'
8: from /usr/local/bin/redis-trib.rb:905:in `each'
7: from /usr/local/bin/redis-trib.rb:906:in `block in flush_nodes_config'
6: from /usr/local/bin/redis-trib.rb:212:in `flush_node_config'
5: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:2763:in `method_missing'
4: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:45:in `synchronize'
3: from /usr/local/ruby/lib/ruby/2.5.0/monitor.rb:226:in `mon_synchronize'
2: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:45:in `block in synchronize'
1: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:2764:in `block in method_missing'
/usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Slot 0 is already busy (Redis::CommandError)
错误提示是
slot插槽被占用了(这是 搭建集群前时,以前redis的旧数据和配置信息没有清理干净。)
解决方案是
用redis-cli 登录到每个节点执行 flushall和cluster reset就可以了。然后重新执行群集脚本命令:
解决方案如下:
[root@master ruby]# redis-cli -h master -p 7001 master:7001> flushall OK master:7001> cluster reset OK master:7001> quit [root@master ruby]# redis-cli -h master -p 7002 master:7002> flushall OK master:7002> cluster reset OK master:7002> quit [root@master ruby]# redis-cli -h dbnode -p 7002 dbnode:7002> flushall OK dbnode:7002> cluster reset OK dbnode:7002> quit [root@master ruby]# redis-cli -h dbnode -p 7001 dbnode:7001> flushall OK dbnode:7001> cluster reset OK dbnode:7001> quit [root@master ruby]# redis-cli -h sdbnode -p 7001 sdbnode:7001> flushall OK sdbnode:7001> cluster reset OK sdbnode:7001> quit [root@master ruby]# redis-cli -h sdbnode -p 7002 sdbnode:7002> flushall OK sdbnode:7002> cluster reset OK sdbnode:7002> quit [root@master ruby]# redis-trib.rb create --replicas 1 master:7001 master:7002 dbnode:7001 dbnode:7002 sdbnode:7001 sdbnode:7002
报错如下:
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
master:7001
dbnode:7001
sdbnode:7001
Adding replica dbnode:7002 to master:7001
Adding replica sdbnode:7002 to dbnode:7001
Adding replica master:7002 to sdbnode:7001
M: 48cf767378e468531184fccd3d252d0defcf0146 master:7001
slots:0-5460 (5461 slots) master
S: 5d5ea2e9c3b64cd8f97d7175079ae5ca278a6e65 master:7002
replicates d67e1480c71280ae2ccb8d481c0118ee9297b737
M: 481792e549a593cacd38fe2a6df72e32076036d4 dbnode:7001
slots:5461-10922 (5462 slots) master
S: 5ce8a33a39960b2c8f95aaac3734656062b675ba dbnode:7002
replicates 48cf767378e468531184fccd3d252d0defcf0146
M: d67e1480c71280ae2ccb8d481c0118ee9297b737 sdbnode:7001
slots:10923-16383 (5461 slots) master
S: 32d718c8a3c87a31bfe466bdb0f84c884ac9773c sdbnode:7002
replicates 481792e549a593cacd38fe2a6df72e32076036d4
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
Traceback (most recent call last):
10: from /usr/local/bin/redis-trib.rb:1830:in `<main>'
9: from /usr/local/bin/redis-trib.rb:1431:in `create_cluster_cmd'
8: from /usr/local/bin/redis-trib.rb:939:in `join_cluster'
7: from /usr/local/bin/redis-trib.rb:939:in `each'
6: from /usr/local/bin/redis-trib.rb:941:in `block in join_cluster'
5: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:2763:in `method_missing'
4: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:45:in `synchronize'
3: from /usr/local/ruby/lib/ruby/2.5.0/monitor.rb:226:in `mon_synchronize'
2: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:45:in `block in synchronize'
1: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:2764:in `block in method_missing'
/usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Invalid node address specified: master:7001 (Redis::CommandError)>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
master:7001
dbnode:7001
sdbnode:7001
Adding replica dbnode:7002 to master:7001
Adding replica sdbnode:7002 to dbnode:7001
Adding replica master:7002 to sdbnode:7001
M: 48cf767378e468531184fccd3d252d0defcf0146 master:7001
slots:0-5460 (5461 slots) master
S: 5d5ea2e9c3b64cd8f97d7175079ae5ca278a6e65 master:7002
replicates d67e1480c71280ae2ccb8d481c0118ee9297b737
M: 481792e549a593cacd38fe2a6df72e32076036d4 dbnode:7001
slots:5461-10922 (5462 slots) master
S: 5ce8a33a39960b2c8f95aaac3734656062b675ba dbnode:7002
replicates 48cf767378e468531184fccd3d252d0defcf0146
M: d67e1480c71280ae2ccb8d481c0118ee9297b737 sdbnode:7001
slots:10923-16383 (5461 slots) master
S: 32d718c8a3c87a31bfe466bdb0f84c884ac9773c sdbnode:7002
replicates 481792e549a593cacd38fe2a6df72e32076036d4
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
Traceback (most recent call last):
10: from /usr/local/bin/redis-trib.rb:1830:in `<main>'
9: from /usr/local/bin/redis-trib.rb:1431:in `create_cluster_cmd'
8: from /usr/local/bin/redis-trib.rb:939:in `join_cluster'
7: from /usr/local/bin/redis-trib.rb:939:in `each'
6: from /usr/local/bin/redis-trib.rb:941:in `block in join_cluster'
5: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:2763:in `method_missing'
4: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:45:in `synchronize'
3: from /usr/local/ruby/lib/ruby/2.5.0/monitor.rb:226:in `mon_synchronize'
2: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:45:in `block in synchronize'
1: from /usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis.rb:2764:in `block in method_missing'
/usr/local/ruby/lib/ruby/gems/2.5.0/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Invalid node address specified: master:7001 (Redis::CommandError)
报错原因:不识别hostname
使用创建脚本进行集群创建的时候最好将配置文件redis.conf绑定的IP改为真实的IP不要用hostname
使用命令也不要用hostname
正确命令如下:
redis-trib.rb create --replicas 1 192.168.1.250:7001 192.168.1.250:7002 192.168.1.251:7001 192.168.1.251:7002 192.168.1.252:7001 192.168.1.252:7002
结果如下:
[bigdata@master ~]$ redis-trib.rb create --replicas 1 192.168.1.250:7001 192.168.1.250:7002 192.168.1.251:7001 192.168.1
.251:7002 192.168.1.252:7001 192.168.1.252:7002
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.250:7001
192.168.1.251:7001
192.168.1.252:7001
Adding replica 192.168.1.251:7002 to 192.168.1.250:7001
Adding replica 192.168.1.252:7002 to 192.168.1.251:7001
Adding replica 192.168.1.250:7002 to 192.168.1.252:7001
M: 48cf767378e468531184fccd3d252d0defcf0146 192.168.1.250:7001
slots:0-5460 (5461 slots) master
S: 5d5ea2e9c3b64cd8f97d7175079ae5ca278a6e65 192.168.1.250:7002
replicates d67e1480c71280ae2ccb8d481c0118ee9297b737
M: 481792e549a593cacd38fe2a6df72e32076036d4 192.168.1.251:7001
slots:5461-10922 (5462 slots) master
S: 5ce8a33a39960b2c8f95aaac3734656062b675ba 192.168.1.251:7002
replicates 48cf767378e468531184fccd3d252d0defcf0146
M: d67e1480c71280ae2ccb8d481c0118ee9297b737 192.168.1.252:7001
slots:10923-16383 (5461 slots) master
S: 32d718c8a3c87a31bfe466bdb0f84c884ac9773c 192.168.1.252:7002
replicates 481792e549a593cacd38fe2a6df72e32076036d4
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 192.168.1.250:7001)
M: 48cf767378e468531184fccd3d252d0defcf0146 192.168.1.250:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: d67e1480c71280ae2ccb8d481c0118ee9297b737 192.168.1.252:7001
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: 481792e549a593cacd38fe2a6df72e32076036d4 192.168.1.251:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 32d718c8a3c87a31bfe466bdb0f84c884ac9773c 192.168.1.252:7002
slots: (0 slots) slave
replicates 481792e549a593cacd38fe2a6df72e32076036d4
S: 5ce8a33a39960b2c8f95aaac3734656062b675ba 192.168.1.251:7002
slots: (0 slots) slave
replicates 48cf767378e468531184fccd3d252d0defcf0146
S: 5d5ea2e9c3b64cd8f97d7175079ae5ca278a6e65 192.168.1.250:7002
slots: (0 slots) slave
replicates d67e1480c71280ae2ccb8d481c0118ee9297b737
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
至此集群搭建完成。