redis集群

本文详细介绍了Redis集群的作用,包括数据分区和高可用特性。在集群搭建部分,逐步讲解了从节点握手、分配槽、指定主从关系到测试备用节点故障转移的过程。文章还提到了集群的故障转移机制,强调了至少需要3个主节点以确保在故障发生时能顺利完成选举。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、redis集群作用

  1. 集群由多个节点(Node)组成,redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。
  2. 数据分区:数据分区(或称数据分片)是集群最核心的功能。集群将数据分散到多个节点,一方面突破了redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
  3. 高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。

二、redis集群搭建

1、安装并且启动节点

  1. 节点规划:3主3备       
  2.  6个节点,正常一样的配置{6套配置文件}
  3. 主:6379/6380/6381 备:6382/6383/6384 节点启动后是没有主从关系的,因此从节点不需要配置replicaof选项的

 

        4.安装服务

yum -y install gcc* pcre* zlib*
tar -xf redis-6.2.7.tar.gz
cd redis-6.2.7/
make && make PREFIX=/usr/local/redis install        #安装编译并且指定安装路径
echo $?                                             #检查是否安装成功

        5.创建配置文件目录

cd /usr/local/redis/             #进入redis安装路径
mkdir /usr/local/redis/conf      #创建配置文件目录
mkdir /usr/local/redis/logs      #创建日志存放目录
mkdir /usr/local/redis/data      #创建数据存放目录
cp -a redis.conf /usr/local/redis/conf/             #复制redis配置文件到配置文件录下                                           #检查是否安装成功

         6.修改主服务器配置文件

cd /usr/local/redis/conf
vim redis.conf
bind 0.0.0.0
daemonize yes
pidfile "/usr/local/redis/logs/redis.pid"
logfile "/usr/local/redis/logs/redis.log"
dbfilename "redis.rdb"
dir "/usr/local/redis/data/"
appendonly yes
appendfilename "redis.aof"
删除data目录和logs目录里面生成的文件

        7.创建三个主节点的配置文件和备用节点的配置文件并启动

cp -a redis.conf redis-6379.conf            #复制创建第一个主节点配置文件
vim redis-6379.conf
# cluster-enabled yes                       #取消注释
# cluster-config-file nodes-6379.conf       #取消注释并修改为    cluster-config-file "/usr/local/redis/conf/node-6379.conf"
pidfile "/usr/local/redis/logs/redis-6379.pid"
logfile "/usr/local/redis/logs/redis-6379.log"
dbfilename "redis-6379.rdb"
appendfilename "redis-6379.aof"

cp -a redis-6379.conf redis-6380.conf       #复制创建第二个主节点配置文件
vim redis-6380.conf
:%s /6379/6380/gg                           #将6379替换成6380

cp -a redis-6379.conf redis-6381.conf       #复制创建第二个主节点配置文件
vim redis-6381.conf
:%s /6379/6381/gg                           #将6379替换成6381

cp -a redis-6379.conf redis-6382.conf       #复制创建第一个备用节点配置文件
vim redis-6382.conf
:%s /6379/6382/gg                           #将6379替换成6382

cp -a redis-6379.conf redis-6383.conf       #复制创建第二个备用节点配置文件
vim redis-6383.conf
:%s /6379/6383/gg                           #将6379替换成6383

cp -a redis-6379.conf redis-6384.conf       #复制创建第三个备用节点配置文件
vim redis-6384.conf
:%s /6379/6384/gg                           #将6379替换成6384

         8.设置软链接

ln -s /usr/local/redis/bin/* /usr/local/bin/

 

        9.启动三个主节点的redis和三个备用节点的redis

redis-server /usr/local/redis/conf/redis-6379.conf        #启动第一个主节点
redis-server /usr/local/redis/conf/redis-6380.conf        #启动第二个主节点
redis-server /usr/local/redis/conf/redis-6381.conf        #启动第三个主节点
redis-server /usr/local/redis/conf/redis-6382.conf        #启动第一个备节点
redis-server /usr/local/redis/conf/redis-6383.conf        #启动第一个备节点
redis-server /usr/local/redis/conf/redis-6384.conf        #启动第一个备节点

        10. netstat -antp

三主三备节点的监听端口

集群节点监听的端口(自动生成)

         11.

redis-cli -p 6379 info server         #查看该模式是否为集群模式

2、节点握手

  1. 节点启动以后是相互独立的,并不知道其他节点存在;
  2. 需要进行节点握手,将独立的节点组成一个网络;
  3. 只需要使用6379端口向每个主节点和备用节点发送握手就可以将整个节点连接起来组成集群。
    redis-cli -p 6379 cluster meet 192.168.91.10 6380
    redis-cli -p 6379 cluster meet 192.168.91.10 6381
    redis-cli -p 6379 cluster meet 192.168.91.10 6382
    redis-cli -p 6379 cluster meet 192.168.91.10 6383
    redis-cli -p 6379 cluster meet 192.168.91.10 6384
    redis-cli -p 6379 cluster nodes

 3、分配槽

  1. 在redis集群中,借助槽实现数据分区,集群有16384个槽,槽是数据管理和迁移的基本单位;
  2. 当数据库中的16384个槽都分配了节点时,集群处于上线状态(ok);
  3. 如果有任意一个槽没有分配节点,则集群处于下线状态(fail)。
    redis-cli -p 6379 cluster info
    #查看是否分借助槽实现数据分区状态为fail为失败或未分配,ok为成功,若失败使用del删除重新分配即可
    redis-cli -p 6379 cluster addslots {0..5461}
    redis-cli -p 6380 cluster addslots {5462..10922}
    redis-cli -p 6381 cluster addslots {10923..16383}

 4.主从关系指定

  1. 集群中指定主备关系不再使用replicaof命令,而是使用cluster replicate命令;
  2. 参数使用节点id。通过 cluster nodes 获得几个主节点的节点id后,执行下面的命令为每个备用节点指定主节点。
    redis-cli -p <slave-port> cluster replicate <master-id>
    #有几个从节点重复几次,一个从对应一个主的id
    redis-cli -p 6382 cluster replicate f96f84aad8f2569479e6a42d365ab58955ee2055
    #备用节点6382绑定对应的主节点6379的ID
    redis-cli -p 6383 cluster replicate de05c3c1a9b10455cfcc84f07d0aba9c9ab4c30f
    #备用节点6383绑定对应的主节点6380的ID
    redis-cli -p 6384 cluster replicate a5b71919c7f87dafcea4f4e0350c58cea779d33e
    #备用节点6384绑定对应的主节点6381的ID
    redis-cli -p 6379 cluster info            #查看状态是否ok

5. redis连接数据写入查看是否数据同步

redis-cli -c    #使用-c登录到集群模式的redis中
  1. 在登录到集群模式的redis数据库中,会默认登录到6379的主节点上,创建键值对时会随机在三个主节点之间切换。

  1. 在使用keys *获取键值对时,只能获取到所在的主节点的键值对,但是能够使用get 键来获取其他的主节点上的键值;
  2. 获取数据时,备用节点接受查询的请求,但是实际查询还是在主节点上查询的,分担了查询请求,缓解主节点的访问压力。

6、测试查看备用节点否是会切换为主节点

netstat -antp | grep 6379 | grep LISTEN        #过滤6379主节点的PID
kill 42205                                     #结束6379主节点的进程
redis-cli -p 6380 cluster nodes                #查看6379的备用节点是否变为主用节点

  1. 结束6379的主节点进程之后,它对应的备用节点6382会顶替他成为新的主节点,并且同步他的数据和槽数据;
  2. 如果这时原来的6379主节点恢复之后,他不会成为原来的主节点,而是自动成为6382的备用节点。

 7.测试备用节点是否会同步数据

redis-cli -c -p 6380        #指定登录6380主节点
获取之前6397创建的键值对是以6382的身份获取到的,说明已经切换并且同步成功

8.其他补充

  1. 集群的故障转移实现与哨兵思路类似:通过定时发送PING消息检测其他节点状态;节点下线分为主观下线和客观下线;客观下线后选取从节点进行故障转移。与哨兵一样,集群只实现了主节点的故障转移;从节点故障时只会被下线,不会进行故障转移。
  2. 节点数量:在故障转移阶段,需要由主节点投票选出哪个从节点成为新的主节点;从节点选举胜出需要的票数为N/2+1;其中N为主节点数量(包括故障主节点),但故障主节点实际上不能投票。因此为了能够在故障发生时顺利选出从节点,集群中至少需要3个主节点(生成环境部署在不同的物理机上)。
  3. 故障转移时间:从主节点故障发生到完成转移,所需要的时间主要消耗在主观下线识别、主观下线传播、选举延迟等几个环节;具体时间与参数cluster-node-timeout参数,公式:故障转移时间(毫秒) ≤ 1.5 * cluster-node-timeout + 1000
  4. cluster-node-timeout的默认值为15000ms(15s),因此故障转移时间会在20s左右。
  5. 管理集群的方式:redis-cli --cluster help

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值