带你玩转Redis集群

403 阅读6分钟

1.Redis集群安装

1.1 下载源码包

Redis源码包下载地址

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.21.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