redis高可用之cluster模式

开发与运维NoSQL数据库

0.前言

前面我们部署了redis的哨兵模式,通过哨兵模式的功能验证可以知道redis的哨兵模式基本可以支持高可用和读写分离。不过哨兵模式是基于主从模式,而主从模式中每个redis节点存储的数据都是一样的,当redis需要存储的数据容量过大,单个节点无法满足的时候又该怎么办呢?这个时候就需要使用redis的cluster模式了,cluster模式中有多个分片,每个分片中redis节点存储的数据是不一样的,相当于横向扩容,这样就可以存储更多的数据,而每个分片又是由主从模式组成的,用来做数据冗余实现高可用。
cluster集群模式的架构示意图如下:

picture.image 如上图所示,每个node里面的master都可以看作一个分片,三个node的master存储的都是不一样的数据,而三者相加就是总数据,如果单个分片的redis使用的内存是8G,那么三者相加内存就是24G。每个node又是由主从模式构成,用来做数据冗余,实现高可用。下面我们就来部署一套redis cluster模式集群,亲自测试一下它的功能。

1.资源准备

本次部署我们还是采用三台虚拟机,然后每台虚拟机部署三个redis节点(1master+2slave)组成主从模式,用来模拟上述架构图中的部署方式。
部署环境详情如下:

操作系统IP端口CPU内存版本节点
Rocky9192.168.159.16763794核8G7.4
Rocky9192.168.159.16763804核8G7.4
Rocky9192.168.159.16763814核8G7.4
Rocky9192.168.159.16863794核8G7.4
Rocky9192.168.159.16863804核8G7.4
Rocky9192.168.159.16863814核8G7.4
Rocky9192.168.159.17163794核8G7.4
Rocky9192.168.159.17163804核8G7.4
Rocky9192.168.159.17163814核8G7.4

大家可以根据自己的实际情况调整服务器资源配置,只要能够运行三个redis节点即可。

2.搭建redis cluster集群

准备好以上资源之后,就可以开始搭建redis cluster集群了。

2.1 部署单节点redis

我们需要在每台虚拟机上起三个使用不同端口的redis服务,但是在起服务之前,还是需要在三台虚拟机上分别部署redis,部署单节点的redis可以参考我之前的博客redis单节点部署操作手册 但是这里启动redis的方式会有所变化,不能在通过redis.service启动服务,执行到redis部署完成即可。

2.2 整理配置文件

在192.168.159.167的/usr/local/redis/conf目录下创建对应三个端口的redis配置文件,配置文件名称分别为6379.conf、6380.conf和6381.conf,配置文件详情分别为:
(1)6379.conf

bind 0.0.0.0
protected-mode no
port 6379
daemonize yes
pidfile "/var/run/redis_6379.pid"
logfile "/usr/local/redis/logs/6379.log"
databases 16
dir "/usr/local/redis/data/6379"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

(2)6380.conf

bind 0.0.0.0
protected-mode no
port 6380
daemonize yes
pidfile "/var/run/redis_6380.pid"
logfile "/usr/local/redis/logs/6380.log"
databases 16
dir "/usr/local/redis/data/6380"
cluster-enabled yes
cluster-config-file nodes-6380.conf
cluster-node-timeout 15000

(3)6381.conf

bind 0.0.0.0
protected-mode no
port 6380
daemonize yes
pidfile "/var/run/redis_6380.pid"
logfile "/usr/local/redis/logs/6380.log"
databases 16
dir "/usr/local/redis/data/6380"
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 15000

2.3 启动redis节点

在192.168.159.167通过指定配置文件的方式启动redis的三个节点,命令如下:

cd /usr/local/redis/bin
./redis-cli ../conf/6379.conf
./redis-cli ../conf/6380.conf
./redis-cli ../conf/6381.conf

2.4 检查redis服务

(1)检查服务进程

ps -ef |grep redis
root     1922172       1  0 12:08 ?        00:00:04 ./redis-server 0.0.0.0:6380 [cluster]
root     1922179       1  0 12:08 ?        00:00:04 ./redis-server 0.0.0.0:6381 [cluster]
root     1922531       1  0 12:12 ?        00:00:03 ./redis-server 0.0.0.0:6379 [cluster]

可以看到三个进程均正常运行,并且出现了cluster模式的标识。

2.5 其他节点

其他节点的操作和192.168.159.167节点操作一模一样,可以将192.168.159.167节点的配置文件拷贝到192.168.159.168和192.168.159.171上,然后修改replicaof配置项为当前虚拟机IP和6379端口,再以主从模式运行就好了,这里就不详细演示了。

3.创建cluster集群

在三个节点上部署完成redis服务,并且正常启动之后,就可以创建redis cluster集群了。

3.1 创建集群

创建redis cluster模式的命令如下:

cd /usr/local/redis/bin
./redis-cli --cluster create 192.168.159.167:6379 192.168.159.167:6380 192.168.159.167:6381 192.168.159.168:6379 192.168.159.168:6380 192.168.159.168:6381 192.168.159.171:6379 192.168.159.171:6380 192.168.159.171:6381 --cluster-replicas 2
>>> Performing hash slots allocation on 9 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.159.168:6380 to 192.168.159.167:6379
Adding replica 192.168.159.171:6380 to 192.168.159.167:6379
Adding replica 192.168.159.167:6381 to 192.168.159.168:6379
Adding replica 192.168.159.171:6381 to 192.168.159.168:6379
Adding replica 192.168.159.168:6381 to 192.168.159.171:6379
Adding replica 192.168.159.167:6380 to 192.168.159.171:6379
M: 23f205ba448111fd5ca97473ec7917688d117a94 192.168.159.167:6379
   slots:[0-5460] (5461 slots) master
S: 6dc8615c58806ea143b6a021fe9acb53c0f6a1c5 192.168.159.167:6380
   replicates cc072a2f4f19444313ac2d4b04726d3d977c6eb9
S: bb551e91c8c11a0028892f483403ca3a5b963e8f 192.168.159.167:6381
   replicates 2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc
M: 2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc 192.168.159.168:6379
   slots:[5461-10922] (5462 slots) master
S: 1835be56d95fa95dd54e9797b81b96e042c72c14 192.168.159.168:6380
   replicates 23f205ba448111fd5ca97473ec7917688d117a94
S: 563bef22b089e19e83f5ffb4136a59fe662af45d 192.168.159.168:6381
   replicates cc072a2f4f19444313ac2d4b04726d3d977c6eb9
M: cc072a2f4f19444313ac2d4b04726d3d977c6eb9 192.168.159.171:6379
   slots:[10923-16383] (5461 slots) master
S: efbfafd034fdd8237f0d79f08f6dceda1fa9eff3 192.168.159.171:6380
   replicates 23f205ba448111fd5ca97473ec7917688d117a94
S: bee19347881d043db87574882eb89eee75b48b80 192.168.159.171:6381
   replicates 2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.159.167:6379)
M: 23f205ba448111fd5ca97473ec7917688d117a94 192.168.159.167:6379
   slots:[0-5460] (5461 slots) master
   2 additional replica(s)
M: 2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc 192.168.159.168:6379
   slots:[5461-10922] (5462 slots) master
   2 additional replica(s)
S: efbfafd034fdd8237f0d79f08f6dceda1fa9eff3 192.168.159.171:6380
   slots: (0 slots) slave
   replicates 23f205ba448111fd5ca97473ec7917688d117a94
S: 1835be56d95fa95dd54e9797b81b96e042c72c14 192.168.159.168:6380
   slots: (0 slots) slave
   replicates 23f205ba448111fd5ca97473ec7917688d117a94
M: cc072a2f4f19444313ac2d4b04726d3d977c6eb9 192.168.159.171:6379
   slots:[10923-16383] (5461 slots) master
   2 additional replica(s)
S: 563bef22b089e19e83f5ffb4136a59fe662af45d 192.168.159.168:6381
   slots: (0 slots) slave
   replicates cc072a2f4f19444313ac2d4b04726d3d977c6eb9
S: bee19347881d043db87574882eb89eee75b48b80 192.168.159.171:6381
   slots: (0 slots) slave
   replicates 2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc
S: 6dc8615c58806ea143b6a021fe9acb53c0f6a1c5 192.168.159.167:6380
   slots: (0 slots) slave
   replicates cc072a2f4f19444313ac2d4b04726d3d977c6eb9
S: bb551e91c8c11a0028892f483403ca3a5b963e8f 192.168.159.167:6381
   slots: (0 slots) slave
   replicates 2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

中间需要手动输入一个"yes",表示允许redis自动生成配置文件,通过如上信息我们可以知道三台服务器总共九个redis节点组成了一个cluster集群。
其中:192.168.159.167:6379,192.168.159.168:6379,192.168.159.171:6379 三个节点为主节点,其余6个节点为从节点。

3.2 集群信息

集群搭建完成后,就可以查看集群信息了,命令如下:

cd /usr/local/redis/bin
./redis-cli -p 6379
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:9
cluster_size:3
cluster_current_epoch:9
cluster_my_epoch:4
cluster_stats_messages_ping_sent:45
cluster_stats_messages_pong_sent:42
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:88
cluster_stats_messages_ping_received:42
cluster_stats_messages_pong_received:46
cluster_stats_messages_received:88
total_cluster_links_buffer_limit_exceeded:0

可以看到cluster集群的一些基础信息,包括可用的slots的个数,集群运行情况等。

3.3 列举集群节点

除了查看集群整体信息外,还可以查看每个节点的运行情况,命令如下:

cd /usr/local/redis/bin
./redis-cli -p 6379
127.0.0.1:6379> cluster nodes
6dc8615c58806ea143b6a021fe9acb53c0f6a1c5 192.168.159.167:6380@16380 slave cc072a2f4f19444313ac2d4b04726d3d977c6eb9 0 1751122209000 7 connected
23f205ba448111fd5ca97473ec7917688d117a94 192.168.159.167:6379@16379 master - 0 1751122207796 1 connected 0-5460
2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc 192.168.159.168:6379@16379 myself,master - 0 0 4 connected 5461-10922
bb551e91c8c11a0028892f483403ca3a5b963e8f 192.168.159.167:6381@16381 slave 2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc 0 1751122208588 4 connected
bee19347881d043db87574882eb89eee75b48b80 192.168.159.171:6381@16381 slave 2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc 0 1751122207000 4 connected
cc072a2f4f19444313ac2d4b04726d3d977c6eb9 192.168.159.171:6379@16379 master - 0 1751122209593 7 connected 10923-16383
efbfafd034fdd8237f0d79f08f6dceda1fa9eff3 192.168.159.171:6380@16380 slave 23f205ba448111fd5ca97473ec7917688d117a94 0 1751122206000 1 connected
1835be56d95fa95dd54e9797b81b96e042c72c14 192.168.159.168:6380@16380 slave 23f205ba448111fd5ca97473ec7917688d117a94 0 1751122206706 1 connected
563bef22b089e19e83f5ffb4136a59fe662af45d 192.168.159.168:6381@16381 slave cc072a2f4f19444313ac2d4b04726d3d977c6eb9 0 1751122210024 7 connected

可以看到当前节点的UUID,节点的IP端口,为master/slave节点以及节点与集群的连接情况。

3.4 删除节点

我们来测试一下删除某个节点,命令如下:

cd /usr/local/redis/bin
./redis-cli -p 6379
127.0.0.1:6379> cluster forget 563bef22b089e19e83f5ffb4136a59fe662af45d

我们把之前查到的563bef22b089e19e83f5ffb4136a59fe662af45d删除掉,再查看一下集群节点信息:

127.0.0.1:6379> cluster nodes
2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc 192.168.159.168:6379@16379 master - 0 1751123884381 4 connected 5461-10922
23f205ba448111fd5ca97473ec7917688d117a94 192.168.159.167:6379@16379 myself,master - 0 0 1 connected 0-5460
efbfafd034fdd8237f0d79f08f6dceda1fa9eff3 192.168.159.171:6380@16380 slave 23f205ba448111fd5ca97473ec7917688d117a94 0 1751123884000 1 connected
1835be56d95fa95dd54e9797b81b96e042c72c14 192.168.159.168:6380@16380 slave 23f205ba448111fd5ca97473ec7917688d117a94 0 1751123887527 1 connected
cc072a2f4f19444313ac2d4b04726d3d977c6eb9 192.168.159.171:6379@16379 master - 0 1751123886738 7 connected 10923-16383
563bef22b089e19e83f5ffb4136a59fe662af45d 192.168.159.168:6381@16381 slave cc072a2f4f19444313ac2d4b04726d3d977c6eb9 0 1751123887856 7 connected
bee19347881d043db87574882eb89eee75b48b80 192.168.159.171:6381@16381 slave 2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc 0 1751123885000 4 connected
6dc8615c58806ea143b6a021fe9acb53c0f6a1c5 192.168.159.167:6380@16380 slave cc072a2f4f19444313ac2d4b04726d3d977c6eb9 0 1751123888977 7 connected

可以看到563bef22b089e19e83f5ffb4136a59fe662af45d节点确实没有了。

3.5 恢复节点

之前在创建cluster集群的时候,redis会自动生成node配置文件,只要配置文件没有被删除,就可以恢复节点,命令如下:

cd /usr/local/redis/bin
./redis-cli -p 6379
127.0.0.1:6379> cluster meet 192.168.159.167 6381
OK

我们再检查下节点是否添加成功:

127.0.0.1:6379> cluster nodes
2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc 192.168.159.168:6379@16379 master - 0 1751124628947 4 connected 5461-10922
23f205ba448111fd5ca97473ec7917688d117a94 192.168.159.167:6379@16379 myself,master - 0 0 1 connected 0-5460
efbfafd034fdd8237f0d79f08f6dceda1fa9eff3 192.168.159.171:6380@16380 slave 23f205ba448111fd5ca97473ec7917688d117a94 0 1751124630099 1 connected
1835be56d95fa95dd54e9797b81b96e042c72c14 192.168.159.168:6380@16380 slave 23f205ba448111fd5ca97473ec7917688d117a94 0 1751124631204 1 connected
cc072a2f4f19444313ac2d4b04726d3d977c6eb9 192.168.159.171:6379@16379 master - 0 1751124626674 7 connected 10923-16383
563bef22b089e19e83f5ffb4136a59fe662af45d 192.168.159.168:6381@16381 slave cc072a2f4f19444313ac2d4b04726d3d977c6eb9 0 1751124632325 7 connected
bee19347881d043db87574882eb89eee75b48b80 192.168.159.171:6381@16381 slave 2454b68dcdf320d34e4c5dc6e7d887619e8a9cfc 0 1751124627791 4 connected
bb551e91c8c11a0028892f483403ca3a5b963e8f 192.168.159.167:6381@16381 slave - 0 1751124629983 0 connected
6dc8615c58806ea143b6a021fe9acb53c0f6a1c5 192.168.159.167:6380@16380 slave cc072a2f4f19444313ac2d4b04726d3d977c6eb9 0 1751124625541 7 connected

可以看到节点数又从8个变为了9个,并且新增的节点是192.168.159.167:6381。

4.总结

redis cluster模式是为了提高redis数据存储而出的解决方案,通常涉及到多个存储节点,并且涉及到slot,在部署和使用过程中一定要小心仔细。

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 NoSQL 的实践与探索
随着 NoSQL 的蓬勃发展越来越多的数据存储在了 NoSQL 系统中,并且 NoSQL 和 RDBMS 的界限越来越模糊,各种不同的专用 NoSQL 系统不停涌现,各具特色,形态不一。本次主要分享字节跳动内部和火山引擎 NoSQL 的实践,希望能够给大家一定的启发。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论