一、概述
在前面的文章中介绍过了redis的主从和哨兵两种集群方案,redis从3.0版本开始引入了redis-cluster(集群)。从主从-哨兵-集群可以看到redis的不断完善;主从复制是最简单的节点同步方案无法主从自动故障转移。哨兵可以同时管理多个主从同步方案同时也可以处理主从自动故障转移,通过配置多个哨兵节点可以解决单点网络故障问题,但是单个节点的性能压力问题无法解决。集群解决了前面两个方案的所有问题。
Redis-Cluster架构图:
1.Redis-Cluster采用无中心结构,每个节点都和其它节点通过互ping保持连接,每个节点保存整个集群的状态信息,可以通过连接任意节点读取或者写入数据(甚至是没有数据的空节点)。
2.只有当集群中的大多数节点同时fail整个集群才fail。
3.整个集群有16384个slot,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。读取一个key时也是相同的算法。
4.当主节点fail时从节点会升级为主节点,fail的主节点online之后自动变成了从节点。
二、集群安装
1.插件安装
yum -y install ruby rubygems
下周ruby依赖的redis.gem
wget https://rubygems.global.ssl.fastly.net/gems/redis-3.2.2.gem
安装redis.gem
gem install redis-3.2.2.gem
注意:不要使用gem install redis来默认安装,默认安装可能会安装redis-4.0.0版本。之前因为安装默认的版本过高导致reshard的时候一直失败。可以参考:http://www.cnblogs.com/chenmh/p/9221672.html
安装redis-stat
gem install redis-stat
如果操作系统是7.0以上版本,可能会因为yum方式安装的ruby的版本太低,报“redis requires Ruby version >= 2.2.2”错误,这时可以这样处理:
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
curl -sSL https://get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
查看可以安装的版本:
rvm list known
安装其中的一个版本,大于2.2.2的版本即可
rvm install 2.4.1
查看已安装的gem,ruby版本
ruby -v gem -v
执行gem安装
gem install redis
2.安装redis
tar -xvf redis-3.0.7.tar.gz cd redis-3.0.7 make MALLOC=libc cp src/redis-server redis-cli redis-trib.rb redis-benchmark redis-check-aof redis-check-rdb redis-sentinel /usr/local/bin
创建redis目录
mkdir -p /redis/redis-cluster/ cd /redis/redis-cluster/ mkdir -p 7001/data 7001/log 7001/tmp cp -rp 7002 cp -rp 7003 cp -rp 8001
创建配置文件
cd 7001 vim redis.conf
port 7001 daemonize yes timeout 300 databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes lua-time-limit 5000 bind 192.168.191.11 127.0.0.1
######################################limit####################### maxclients 10000 maxmemory 512mb maxmemory-policy volatile-ttl maxmemory-samples 5 #######################################file####################### pidfile "/redis/redis-cluster/7001/tmp/redis_7001.pid" loglevel notice logfile "/redis/redis-cluster/7001/log/redis_7001.log" dbfilename "dump.rdb" dir "/redis/redis-cluster/7001/data" appendonly yes appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb ######################################replication########################### slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 requirepass "123456" masterauth "123456" ######################################slowlog################################ slowlog-log-slower-than 1000 slowlog-max-len 128 latency-monitor-threshold 0 ####################################cluster#################################### cluster-enabled yes cluster-config-file "/redis/redis-cluster/7001/nodes.conf" cluster-node-timeout 5000
将redis.conf配置文件拷贝到其它的几个节点并修改对应的端口、路径等相关信息。slowlog单位是微妙
注意:注意bind后面ip的先后顺序,如果配置127.0.0.1在前面的话,那么集群默认会启用127.0.0.1会造成远程无法访问。
3.启动redis集群
启动所有的redis集群
./redis-server redis.conf
可以写在bash脚本文件中启动
三、集群管理
1.创建集群
redis-trib.rb create 192.168.191.11:7001 192.168.191.11:7002 192.168.191.11:7003
如果加上参数--replicas 1表示为每一个主节点创建一个从节点
备注:其实也不建议使用-replicas 1来自动创建主从关系,因为这种创建方法没办法指定哪个从节点对应哪个主节点,无法控制交叉主从。可以先创建好主节点,然后再通过创建从节点指定主节点。
2.集群配置密码处理
默认如果redis cluster节点配置了密码验证,redis-trib.rb操作会失败,则需要在需要执行redis-trib.rb操作的节点修改client.rb文件,操作如下:
find / -name 'client.rb'
vim /usr/lib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb
注意:由于每个人安装的版本不一样所以路径也可能有所差别,在passwd参数后面设置验证的密码,注意所有节点的密码必须是相同的。
3.检查集群
redis-trib.rb check 192.168.191.11:7001
4.增加节点
1.增加主节点
redis-trib.rb add-node 192.168.191.11:7004 192.168.191.11:7001
注意:最后后面的ip和端口是目前集群中已经存在的节点,前面的ip和端口是要增加的。
2.增加从节点
----增加从节点 redis-trib.rb add-node --slave 192.168.191.11:8001 192.168.191.11:7001 ----增加从节点并指定主节点 redis-trib.rb add-node --slave --master-id 64ee652b75a78fc08253fddab5a920988a870f68 192.168.191.11:8001 192.168.191.11:7001
注意:最后面的ip和端口是现集群中已经存在的节点
5.移动slot
redis-trib.rb reshard 192.168.191.11:7001
iphe端口随便指定集群中的某一个,然后输入要移动的slot个数和源节点目标节点id,最后输入done即可。
6.移动节点
可以指定当前节点的master,或者改变当前节点所属的master,登入到当前节点执行如下命令:
cluster replicate 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 ###新master的nodeid
7.删除节点
注意: 删除主节点之前需要先将主节点上的所有slot移动到别的主节点,并且保证没有从节点,否则需要先将从节点移走或者删除
删除节点时需要指定节点的id
redis-trib.rb del-node 192.168.191.11:7001 af0f17b501b9f9f5e71ff6be1cf8114c9e11a80b
后面的id即为需要删除的节点id,删除节点和增加节点语法节点的循序正好相反
四、集群相关命令
CLUSTER INFO 打印集群的信息 CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。 CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。 CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。 CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。 CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。 CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。 CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。 CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。 CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点。 CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。 CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。 CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。 CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。 CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。 CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。 CLUSTER SLAVES node-id 返回一个master节点的slaves 列表