mkdir -p /opt/redis-4.0.9 && cd /opt/redis-4.0.9
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
yum install -y gcc g++ gcc-c++ make
yum -y update
tar -zxvf redis-4.0.9.tar.gz
make
yum -y install ruby ruby-devel rubygems rpm-build
yum install openssl-devel
curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
rvm install 2.4.1
rvm use 2.4.1
gem install redis -v 3.3.3
每台机安装一个redis,做两份配置文件,起两个进程,搭建一个3主3从的集群。
10.110.211.191:7000/7001
10.110.211.192:7002/7003
10.110.174.25:7004/7005
ssh root@10.110.211.191
mkdir -p /opt/redis-4.0.9/redis-cluster/7000
创建/opt/redis-4.0.9/redis-cluster/7000/redis.conf文件然后填入如下内容:
#端口7000,7001,7002
port 7000
#默认ip为127.0.0.1,需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群
bind 10.110.211.191
#redis后台运行
daemonize yes
#pidfile文件对应7000,7001,7002...
pidfile /var/run/redis_7000.pid
#开启集群
cluster-enabled yes
#集群的配置,配置文件首次启动自动生成
cluster-config-file nodes_7000.conf
#After node timeout has elapsed, a master node is considered to be failing, and can be replaced by one of its replicas.
#Similarly after node timeout has elapsed without a master node to be able to sense the majority of the other master nodes, it enters an error state and stops accepting writes.
cluster-node-timeout 5000
#aof日志开启,有需要就开启,它会每次写操作都记录一条日志
appendonly yes
#log日志路径
logfile /var/log/redis/redis_7000.log
#redis备份文件名
dbfilename dump_7000.rdb
#进程根路径,aof、dump、cluster-config等文件位于这里
dir /opt/redis-4.0.9/redis-cluster/7000/
其他实例配置参考这个并修改相应端口和路径即可。
首先依次启动各Redis实例:
ssh root@10.110.211.191
/opt/redis-4.0.9/src/redis-server /opt/redis-4.0.9/redis-cluster/7000/redis.conf
...
ssh root@10.110.174.25
/opt/redis-4.0.9/src/redis-server /opt/redis-4.0.9/redis-cluster/7005/redis.conf
然后使用redis-trib.rb创建集群:
/opt/redis-4.0.9/src/redis-trib.rb create --replicas 1 10.110.211.191:7000 10.110.211.191:7001 10.110.211.192:7002 10.110.211.192:7003 10.110.174.25:7004 10.110.174.25:7005
–replicas 1的意思是每个server有一个备份。
redis-trib.rb add-node 127.0.0.1:7006(new node) 127.0.0.1:7000(any existing node)
然后可以通过reshard命令给新节点分配slot。
redis-trib.rb reshard 10.110.211.191:7000
redis-trib.rb add-node --slave --master-id 0de0233df887e024575f73f57e74a9ddaeed009d 10.110.211.192:7002(new node)10.110.211.191:7000(existing node)
也可以redis-cli连接到任意空节点上然后使用replicate命令使某之成为某个节点的slave:
cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
./redis-trib del-node 127.0.0.1:7000 ``
redis-cli -h 10.110.211.191 -p 7000 cluster failover #注意是在其slave节点上执行
redis-cli -h 10.110.211.191 -p 7001 shutdown
redis-server /opt/redis-4.0.9/redis-cluster/7001/redis.conf
错误表现
gem install redis ERROR: Error installing redis: redis requires Ruby version >= 2.2.2.
处理
前面操作已经指定正确的安装版本,如果遇到这个问题,安装rvm并升级所在主机的ruby到2.4.1即可。
参考:https://hk.saowen.com/a/8906d0496abb6bfc95673d109a8fc9d9d165a4594fa8a628ae3b77b6da6b76c2
错误表现
[ERR] Calling MIGRATE: ERR Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME | PAUSE | REPLY)
原因
redis.rb版本太新,不向后兼容
处理
降级redis.rb
gem uninstall redis --version 4.0.x
gem install redis -v 3.3.3
参考:https://stackoverflow.com/questions/47774093/redis-cluster-reshard-err-calling-migrate-err-syntax-error
错误表现
Check for open slots…
[WARNING] Node 192.168.44.189:6631 has slots in importing state (12927).
[WARNING] The following slots are open: 12927
原因
由于之前命令失败导致redis集群中slot状态有问题。
处理
尝试使用redis-trib.rb fix命令,不行就使用setslot命令设置slot状态为stable
redis-cli -p 6631 CLUSTER SETSLOT 12927 STABLE
参考:https://github.com/antirez/redis/issues/2776
错误表现
[ERR] Node 10.110.211.192:7002 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
原因
一台机器上启动了多个redis进程,aof和dump位置重复或者原先在线的redis节点断线太久后重新连接上来,redis db不为空会导致无法加入集群。
处理
清除配置文件中指定的nodes_7000.conf文件并清除redis中的数据,然后重新加入节点
redis-cli -h 10.110.211.192 -p 7002 flushdb
错误表现
redis-cli -h 10.110.211.192 -p 7002 cluster nodes
……
141c68cc373c29fef2b33ee93b64a3425a475275 :0@0 slave,fail,noaddr 1c80515b06f44df77151fcb5dac1c0f3eb499874 1528451188725 1528451188000 13 disconnected
……
原因
节点重启后从dump恢复数据,集群中又未forget本节点,或者其他原因导致数据不一致无法同步。
处理
在正常的集群节点中forget掉本节点,flushdb清除节点数据,然后重新add-node
redis-cli -h 10.110.211.191 -p 7000 cluster forget 141c68cc373c29fef2b33ee93b64a3425a475275
redis-cli -h 10.110.211.191 -p 7001 flushdb
redis-trib.rb add-node --slave --master-id 1c80515b06f44df77151fcb5dac1c0f3eb499874 10.110.211.191:7001 10.110.211.191:7000
错误表现
使用redis-trib.rb create创建集群时候抛出错误:
ERR Slot 12730 is already busy (Redis::CommandError)
原因
之前的创建失败导致slot处于busy状态
处理
登陆到对应节点,flushall,cluster reset soft,然后删除nodes.conf文件,再次执行集群创建即可。
cluster-enabled <yes/no>
cluster-config-file <filename>
cluster-node-timeout <milliseconds>
cluster-slave-validity-factor <factor>
cluster-migration-barrier <count>
cluster-require-full-coverage <yes/no>
CentOs7.3 搭建 Redis-4.0.1 Cluster 集群服务
Redis Quick Start
Redis cluster tutorial
Redis Cluster Specification
Life in a Redis Cluster: Meet and Gossip with your neighbors