1.Redis集群安装
1.1 下载源码包
1.2 解压源码包
tar -zxvf redis-6.2.3.tar.gz
1.3 编译
1.3.1 进入解压目录
cd redis-6.2.3
1.3.2 编译
make
1.3.3 编译异常
在编译的时候如果出现如下异常:
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
需要执行如下命令:
xcode-select --install
1.4 创建目录
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005
1.5 编辑配置文件redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
dir redis存放数据目录
logfile "nodes-7000.log"
1.6 拷贝配置文件
将编辑好的配置文件复制到7000、7001、7002、7003、7004、7005目录下并修改对应的端口号为7000、7001、7002、7003、7004、7005,修改cluster-config-file名称以及logfile名称
1.7 拷贝redis-server
➜ cluster-test cp redis-6.2.3/src/redis-server ./
1.8 依次启动redis服务
➜ 7000 ../redis-server ./redis.conf
➜ 7001 ../redis-server ./redis.conf
➜ 7002 ../redis-server ./redis.conf
➜ 7003 ../redis-server ./redis.conf
➜ 7004 ../redis-server ./redis.conf
➜ 7005 ../redis-server ./redis.conf
1.9 创建集群
➜ src ./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
如上命令会创建3个masters和3个slaves,出现下图所示表明集群创建成功
1.10 执行命令
➜ src ./redis-cli -c -p 7000
127.0.0.1:7000> set foo bar
1.10.1 执行结果
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
执行结果可以看出请求从7000转发到了7002,转发是依据集群的配置实现的
1.11 集群分片
1.11.1 分片前集群状态
1.11.2 执行分片命令
➜ src ./redis-cli --cluster reshard 127.0.0.1:7000
执行完分片命令后会给出移动槽位数量提示:
How many slots do you want to move (from 1 to 16384)?
输入要移动的分片数量1000,接着需要我们输入接收槽位的节点id,在1.11.1章节可以找到对应节点id,输入即可:5926abac54ae2f42d822286248bbf6665dc90e6a
1.11.3 选择源节点
在1.11.2章节执行了分片命令,给出了移动的槽位数量以及接收节点id,接下来还需要指定源节点id
1.11.4 分片计划
执行完1.11.2和1.11.3的操作后会给出一个分片执行计划
Do you want to proceed with the proposed reshard plan (yes/no)?
输入yes即可
1.11.5 分片后集群状态
1.11.6 相关命令
1.11.6.1 集群分片
➜ src ./redis-cli --cluster reshard 127.0.0.1:7000
1.11.6.2 查看集群节点id
➜ src ./redis-cli -h 127.0.0.1 -p 7001 cluster nodes | grep myself
1.11.6.3 查看集群信息
➜ src ./redis-cli --cluster check 127.0.0.1:7000
1.11.7 自动分片
➜ src ./redis-cli --cluster reshard 127.0.0.1:7000 --cluster-from 5926abac54ae2f42d822286248bbf6665dc90e6a --cluster-to 4d571dbc1fa7aca9d911289793b20f81f61114d8 --cluster-slots 500 --cluster-yes
1.12 新增master节点
1.12.1 启动一个redis服务
➜ 7006 ../redis-server ./redis.conf
1.12.2 新增master节点
➜ src ./redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
1.12.3 查看集群节点信息
➜ src ./redis-cli -p 7006
127.0.0.1:7006> cluster nodes
c1bd35925074fbf16ae22778311e24376ad9a166 127.0.0.1:7004@17004 slave 5926abac54ae2f42d822286248bbf6665dc90e6a 0 1620624245137 10 connected
b41dd5be96f7ade6bbf8c5ef196f8813627e79bf 127.0.0.1:7006@17006 myself,master - 0 1620624244000 0 connected
57adc64d7475e0dcfbf8c4f35b3d508c99a6f5a5 127.0.0.1:7002@17002 master - 0 1620624244000 9 connected 11423-16383
981a7f7350daba06fa8fa6ef2b7374b742e7a782 127.0.0.1:7005@17005 slave 4d571dbc1fa7aca9d911289793b20f81f61114d8 0 1620624245443 11 connected
5926abac54ae2f42d822286248bbf6665dc90e6a 127.0.0.1:7000@17000 master - 0 1620624244530 10 connected 501-5961 10923-11422
4d571dbc1fa7aca9d911289793b20f81f61114d8 127.0.0.1:7001@17001 master - 0 1620624245137 11 connected 0-500 5962-10922
49b570ac00d48d62813f2ac4e25e4d7be6d8c016 127.0.0.1:7003@17003 slave 57adc64d7475e0dcfbf8c4f35b3d508c99a6f5a5 0 1620624245546 9 connected
通过集群信息可以看出新增节点7006已经成功加入集群,角色为master
1.13 新增slave节点
1.12.1 启动一个redis服务
➜ 7007 ../redis-server ./redis.conf
1.12.2 新增slave节点
➜ src ./redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave
默认情况下会将新增的slave节点挂在到缺少slave的master节点上
1.12.3 查看集群信息
可以看到节点7007挂在了7006上
1.12.4 指定master
➜ src ./redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id b41dd5be96f7ade6bbf8c5ef196f8813627e79bf
1.14 删除节点
➜ src ./redis-cli --cluster del-node 127.0.0.1:7000 b41dd5be96f7ade6bbf8c5ef196f8813627e79bf(删除节点对应的id)
特别注意:删除的mater节点必须是空节点
1.15 副本迁移
1.15.1 场景
redis cluster中每个master只有一个slave,master先出现故障,slave升级为master,之后升级为新master的节点也出现故障,会导致整个集群不可用。出现这种情况的原因就是每个master只有一个slave,容错性较低,可以为每个master多分配一个slave从而提高容错性,带来的另一个问题就是成本问题。其实不需要为每个master分配多个slave,只需要为其中部分master分配多个slave即可。
1.15.2 查看集群状态
7000节点拥有7004、7007两个slave节点
1.15.3 故障模拟
停掉7001服务
可以看到原本的slave节点7005已经升级为新的mater节点,原本挂在7000下的7007slave节点挂在了7005下面(因为7005节点没有slave节点),可以看出部分master节点拥有多个slave节点有助于增强集群容错性能力,同样可以节约成本。
1.16 集群问题解决
查看集群是如果出现如上告警提示,可以通过如下命令解决:
127.0.0.1:7000> cluster setslot 6098 stable
特别注意:需要连接对应的服务进行操作,比如上述告警的127.0.0.1:7000、127.0.0.1:7002