记录Redis集群搭建遇到的坑

使用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 登录到每个节点执行 flushallcluster 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.

至此集群搭建完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值