redis集群部署

52 阅读4分钟

Redis 集群是 Redis 的⼀种分布式运⾏模式,它通过分⽚(sharding)来提供数据的⾃动分区和管理,从⽽实现数据的⾼可⽤性和可扩展性。

在集群模式下,数据被分割成多个部分(称为槽或slots),分布在多个 Redis 节点上。

集群中的节点分为主节点和从节点:主节点负责读写请求和集群信息的维护;从节点只进⾏主节点数据和状态信息的复制。

Redis集群的作⽤

数据分区:数据分区(或称数据分⽚)是集群最核心的功能。 集群将数据分散到多个节点,⼀⽅⾯突破了Redis单机内存⼤⼩的限制,存储容量⼤⼤增加;另⼀⽅⾯每个主节点都可以对外提供读服务和写服务,⼤⼤提⾼了集群的响应能⼒。 Redis单机内存⼤⼩受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太⼤,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点⻓时间⽆法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。

⾼可⽤:集群支持主从复制和主节点的⾃动故障转移(与哨兵类似);当任⼀节点发⽣故障时,集群仍然可以对外提供服务。

Redis集群的数据分⽚

Redis集群引⼊了哈希槽的概念 Redis集群有16384个哈希槽(编号0-16383) 集群的每个节点负责⼀部分哈希槽 每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接⾃动跳转到这个对应的节点上进⾏存取操作。

  • 以3个节点组成的集群为例: 节点A包含0到5460号哈希槽 节点B包含5461到10922号哈希槽 节点C包含10923到16383号哈希槽
  • Redis集群的主从复制模型 集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽⽽不可以⽤。

为每个节点添加⼀个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。当B和B1都失败后,集群将不可⽤

Redis Cluster被配置为三主三从模式。这意味着每台服务器上的两个Redis节点中,⼀个节点作为主库(master),另⼀个作为从库(slave)。

redis 集群配置准备

-- 创建集群配置⽂件夹,将下⾯的配置复制过去,另外两个机器重复这个过程

mkdir -p /opt/software/redis/redis-7.0.15/cluster

mkdir -p /opt/software/redis/cluster

vim ./cluster/redis_6379.conf

vim ./cluster/redis_6380.conf

-- 配置⽂件准备完成之后,启动所有redis服务,⽤cluster配置⽂件

redis-server ./cluster/redis_6379.conf

redis-server ./cluster/redis_6380.conf

-- 检查服务

ps aux | grep redis

-- 创建三主三从集群模式,每⼀个主节点带⼀个从节点

redis-cli --cluster create --cluster-replicas 1 192.168.199.128:6379 192.168.199.128:6380 192.168.199.129:6379 192.168.199.129:6380 192.168.199.130:6379 192.168.199.130:6380

-- 查看集群信息

redis-cli cluster info

-- 查看单个节点信息

redis-cli info replication

-- 查看集群节点身份信息

redis-cli cluster nodes

-- 停⽌redis服务

redis-cli -p 6379 shutdown

redis-cli -p 6380 shutdown

6379配置

#允许所有的IP地址

bind * -::*

#后台运⾏

daemonize yes

#允许远程连接

protected-mode no

#开启集群模式

cluster-enabled yes

#集群节点超时时间

cluster-node-timeout 5000

#配置数据存储⽬录

dir "/opt/software/redis/cluster"

#开启AOF持久化

appendonly yes

#端⼝

port 6379

#log⽇志

logfile "/opt/software/redis/redis-7.0.15/cluster/redis6379.log"

#集群配置⽂件

cluster-config-file nodes-6379.conf

#AOF⽂件名

appendfilename "appendonly6379.aof"

#RBD⽂件名

dbfilename "dump6379.rdb"

6380配置

#允许所有的IP地址

bind * -::*

#后台运⾏

daemonize yes

#允许远程连接

protected-mode no

#开启集群模式

cluster-enabled yes

#集群节点超时时间

cluster-node-timeout 5000

#配置数据存储⽬录

dir "/opt/software/redis/cluster"

#开启AOF持久化

appendonly yes

#端⼝

port 6380

#log⽇志

logfile "/opt/software/redis/redis-7.0.15/cluster/redis6380.log"

#集群配置⽂件

cluster-config-file nodes-6380.conf

#AOF⽂件名

appendfilename "appendonly6380.aof"

#RBD⽂件名

dbfilename "dump6380.rdb"

Redis 集群数据读写

-- 连接⼀个主节点进⾏写数据

redis-cli info replication

-- 直接连接读写可能会出现以下问题,是因为不同的节点的槽位不同,图中就是提示我们去132:6379进⾏写⼊数据 -- 不过我们也可以开启路由规则 -c,进⾏处理

redis-cli -c

-- 重新写⼊数据,恢复正常。

set k1 b1

模拟故障转移

-- 注意机器ip的区分

-- 将129机器的主节点给⼲掉(129的6379服务)

redis-cli -p 6379 shutdown

-- 查看129机器从节点⼯作⽇志(131的6380⽇志)

cat redis6380.log

-- 在切换到132机器上查看当前集群节点信息,131:6380已经升为主节点

redis-cli cluster nodes

-- 在重新启动129.6379服务

redis-server ./cluster/redis_6379.conf

-- 查看129.6379的节点信息,主节点变为从节点

redis-cli -p 6379 info replication

-- 观察131.6380⽇志,129.6379 重新加⼊集群