Docker 部署Redis Cluster集群

158 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

Redis集群简介

Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有 节点连接。其redis-cluster架构图如下: 在这里插入图片描述

其结构特点:

 1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
 2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
 3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
 4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。
  5、Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。

1.redis cluster节点分配

现在我们是三个主节点分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是: 节点A覆盖0-5460; 节点B覆盖5461-10922; 节点C覆盖10923-16383.

获取数据:

  如果存入一个值,按照redis cluster哈希槽的算法: CRC16('key')%16384 = 6782。 那么就会把这个key 的存储分配到 B 上了。同样,当我连接(A,B,C)任何一个节点想获取'key'这个key时,也会这样的算法,然后内部跳转到B节点上获取数据

2.Redis Cluster主从模式

      redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。  

使用Docker搭建redis-cluster集群

我们在单个服务器上搭建测试环境,当然也可在多个服务器上搭建,我们搭建3个redis-master节点,和3个redis-slave节点,所以总共需要准备6个redis 我们使用docker-compose来运行我们的6个redis redis.yml文件内容如下: 在这里插入图片描述 在这里插入图片描述 编写完毕后启动所有容器 docker-compose -f redis.yml up -d 在这里插入图片描述 查看各个容器运行状态: docker-compose -f redis.yml ps 在这里插入图片描述

1.创建集群

docker run --rm -it 10.30.5.120/docker/redis-trib create --replicas 1 192.168.189.141:7001 192.168.189.141:7002 192.168.189.141:7003 192.168.189.141:7004 192.168.189.141:7005 192.168.189.141:7006

redis-redis-trib是一个管理redis集群的工具 create 创建集群 --replicas 1 每个master有一个slave 在这里插入图片描述 在这里插入图片描述 看到所有的槽都已被覆盖说明集群已经创建成功

测试

2.任意登录一个节点

redis-cli -c -h 192.168.189.141-p 7001 -c是使用集群的方式连接redis -h 是redis主机ip地址 -p 是redis主机的端口

3.查看集群的信息

在这里插入图片描述 在这里插入图片描述

4.查看集群各个节点的信息

在这里插入图片描述 测试存取一个键值,可以看到他将根据分配的槽,存储在指定主机上,我们可以直接获取数据,并且在获取的时候会直接路由到指定主机上操作: 在这里插入图片描述 你在退出后,无论登录集群的那个redis节点,都可以获取到数据 在这里插入图片描述

5.测试高可用

目前我们的name键值对的数据存在redis2上,我们停掉redis2,查看数据是否收影响 在这里插入图片描述 在这里插入图片描述 然后我们在登录到集群中查看各个节点的状态, 在这里插入图片描述 我们可以看到7002端口对应的redis2已经断开连接,处于fail状态,但是7005对应的redis5已经成为了新的master(可以根据覆盖的槽来辨别) 我们再来获取数据测试,数据是否正常读取和写入 在这里插入图片描述 我们发现数据依然可以正常从redis5上获取 至此redis-cluster集群搭建并测试完毕