背景说明:
项目初期使用AWS的ElastiCache Redis作为系统的数据缓存,近期由于数据量和QPS加大,导致Redis存在压力,进行了两次的单点垂直升级,缓解了目前的压力。项目组进行了数据和费用的评估,考虑到日后升级,决定使用Redis Cluster集群方案,使用三个Master节点搭建集群。(不使用3Master+3Slave)
前期准备:
1、Redis 安装包:本次使用Redis 4.0.8版本进行搭建
下载地址:http://download.redis.io/releases/redis-4.0.8.tar.gz
2、Ruby环境,本次使用yum安装 :yum install -y ruby rubygems
3、下载Ruby Redis工具包,本次使用3.3.3版本(后续说明版本问题)
采用离线下载:wget https://rubygems.org/downloads/redis-3.3.3.gem
4、在AWS上启动3个EC2实例,实例类型为:t2.medium(双核4g,40g SSD存储)
ip分别为:172.31.3.71、172.31.3.72、172.31.3.73
开始搭建:
1、安装Redis:指定安装目录到:/workspace/libs/redis
tar xvfz redis-4.0.8.tar.gz
cd redis-4.0.8
make && make install PREFIX=/workspace/libs/redis
2、配置Redis:在/workspace/libs/redis下创建conf目录,用于存放配置文件
拷贝 redis-4.0.8目录下的redis.conf到/workspace/libs/redis/conf下
修改配置如下:
⚠注意:不能设置密码,否则集群启动时会连接不上
port 7001 //配置端口
//根据本机所在的IP或hostname去配置 node1 node2 node3
bind 本机ip //172.31.3.71,172.31.3.72,172.31.3.73
daemonize yes //redis后台运行
//pidfile文件对应7000,7001,7002
pidfile /var/run/redis_7001.pid
cluster-enabled yes //开启集群
//集群的配置 配置文件首次启动自动生成 7001
cluster-config-file /workspace/libs/redis/conf/nodes_7001.conf
//请求超时 默认15秒,可自行设置
cluster-node-timeout 15000
appendonly yes //aof日志开启 本次使用aof
//禁用rdb 注释掉save
#save 900 1
#save 300 10
#save 60 10000
3、安装Ruby Redis工具包:安装:gem install -l ./redis-3.3.3.gem
4、启动Redis:
cd /workspace/libs/redis
/workspace/libs/redis/bin/redis-server /workspace/libs/redis/conf/redis.conf
查看当前目下是否生成appendonly.aof 文件和 ./conf/下是否生成:nodes-7001.conf
根据配置生成appendonly.aof文件
根据配置生成nodes-7001.conf文件
5、启动集群:
拷贝redis-4.0.8/src下的文件redis-trib.rb到/workspace/libs/redis/bin/目录下
cd /workspace/libs/redis/bin/
./redis-trib.rb create 172.31.3.71:7001 172.31.3.72:7002 172.31.3.73:7003
启动集群
6、 检查集群:
./redis-trib.rb info 172.31.3.71:7001
./redis-trib.rb check 172.31.3.71:7001
info查看集群key和slot的信息
检查集群的状态
7、 添加节点:添加172.31.3.74:7004节点
./redis-trib.rb add-node 172.31.3.74:7004 172.31.3.71:7001
添加172.31.3.74:7004节点
⚠注意:如果172.31.3..74:7004以前添加到集群过,重新添加的话,会报错: [ERR] Node 172.31.3..74:7004 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
需要先删除/workspace/libs/redis目录下的appendonly.aof和conf下的nodes-7004.conf文件,再重新执行
8、删除节点:删除节点4d3e007b38bf89aede64d0facc15124d9d605511(masterId)
./redis-trib.rb del-node 172.31.3.71:7001 4d3e007b38bf89aede64d0facc15124d9d605511
删除172.31.3.74:7004节点
9、移动槽位:
./redis-trib.rb reshard 172.31.3.71:7001
从172.31.3.73:7003移动10个槽位到172.31.3.71:7001去
关闭槽位:多个节点(7001,7002)的1234槽位被打开,需要手动依次关闭
./redis-cli -h 172.31.3.71 -p 7001 -c
172.31.3.71:7001> CLUSTER SETSLOT 1234 stable
./redis-cli -h 172.31.3.72 -p 7002 -c
172.31.3.72:7002> CLUSTER SETSLOT 1234 stable
10、数据导入:导入外部节点:172.31.3.70:6379
./redis-trib.rb import --copy --from 172.31.3.70:6379 172.31.3.71:7001
功能测试:
./redis-cli -h 172.31.3.71 -p 7001 -c
172.31.3.71:7001> set aaa aaa
set aaa 自动重定向到172.31.3.72:7002
172.31.3.71:7001> get aaa
get aaa
遇到问题:
1、ruby-redis版本兼容问题:
之前使用redis-4.0.0.rc1.gem安装,在移槽的时候,发生异常,导致槽位打开,需要手动关闭。
解决办法:安装redis-3.3.3.gem版本
2、从ElastiCache Redis导入到集群中,报错:Migrating D342A51BFE16FC943B2B9EADEC9414C4D38114FE_131141 to 172.31.3.71:7001: ERR unknown command 'migrate'
网上搜了一遍,有人提到AWS 的ElastiCache Redis 不支持migrate方法,目前只能通过代码迁移
参考链接:
https://redis.io/topics/cluster-tutorial
https://www.cnblogs.com/feiyun126/p/7248989.html