Redis 集群

本文详细介绍了Redis集群的运作机制,包括节点复制、故障转移、分片以及Redirect转向。Redis集群采用无中心节点设计,通过节点间通信实现数据分布和容错。每个节点可作为主节点或从节点,主节点负责存储数据,从节点用于扩展读性能。当主节点故障时,集群能自动进行故障转移。此外,通过将数据分片到16384个槽位,实现了数据的分布式存储。客户端在发送命令时,若指向错误节点,会收到重定向信息,转而向正确节点发送请求。

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

1. Redis集群

3.0支持
由多个Redis服务器组成的分布式网络服务集群
每一个Redis服务器称为节点Node,节点之间会互相通信。两两相连
Redis集群无中心节点(无主模型)

2. Redis集群节点复制

● Redis集群的每个节点都有两种角色可选:主节点master node、从节点slave node。其中主节点用于存储数据,而从节点则是某个主节点的复制品
● 当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能,因为Redis集群重用了单机Redis复制特性的代码,所以集群的复制行为和我们之前介绍的单机复制特性的行为是完全一样的

3. Redis集群故障转移

● Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移
● 集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel

4. Redis集群分片

● 集群将整个数据库分为16384个槽位slot,所有key都数据这些slot中的一个,key的槽位计算公式为slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数
● 集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求
举例:
三个主节点7000、7001、7002平均分片16384个slot槽位
节点7000指派的槽位为0到5460
节点7001指派的槽位为5461到10922
节点7002指派的槽位为10923到16383

5. Redis集群Redirect转向

● 由于Redis集群无中心节点,请求会发给任意主节点
● 主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误
● 客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求

6. Redis集群搭建

  1. 创建多个主节点
  2. 为每一个节点指派slot,将多个节点连接起来,组成一个集群
  3. 槽位分片完成后,集群进入上线状态
  4. 6个节点:3个主节点,每一个主节点有一个从节点
redis集群 3.x版本
物理节点1个
指定3个主节点端口为700070017002
对应的3个从节点端口为700370047005

mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005

配置文件
开启集群模式
cluster-enabled yes
指定不冲突的端口
port <对应端口号>

在7000-7005目录中放入redis.conf
redis.conf内容如下
cluster-enabled yes
port 700x

启动所有服务,要进入子目录启动服务
# cd 700x
# redis-server redis.conf

# ss -tanl | grep 700

创建集群
安装目录src中redis-trib.rb完成集群创建
# yum install ruby rubygems -y

redis模块安装
在线安装
# gem install redis
离线安装
https://rubygems.org/gems/redis
# gem install --local redis-3.3.0.gem

在安装目录下的src中

# ./redis-trib.rb create --replicas 1 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

以下是分配的信息展示
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: f1ef654046511d60c9c3cedd1fa5017086763aa1 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 4d973f83092894f511c84c2599660bd96b046e26 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: c9321b85417bda740d93935d8b9096f49abb8078 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: 471ad5b2e24e3e483c5b6f4aecfeb45729417b26 127.0.0.1:7003
   replicates f1ef654046511d60c9c3cedd1fa5017086763aa1
S: d27e55b66871710db0416b1890b5aca9bc568ea2 127.0.0.1:7004
   replicates 4d973f83092894f511c84c2599660bd96b046e26
S: 63b0076dd9eb0a11fb371034afdeadf5ac150550 127.0.0.1:7005
   replicates c9321b85417bda740d93935d8b9096f49abb8078

自动分配了主从,自动分配了slots,所有槽都有节点处理,集群上线
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: f1ef654046511d60c9c3cedd1fa5017086763aa1 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 4d973f83092894f511c84c2599660bd96b046e26 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: c9321b85417bda740d93935d8b9096f49abb8078 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
M: 471ad5b2e24e3e483c5b6f4aecfeb45729417b26 127.0.0.1:7003
   slots: (0 slots) master
   replicates f1ef654046511d60c9c3cedd1fa5017086763aa1
M: d27e55b66871710db0416b1890b5aca9bc568ea2 127.0.0.1:7004
   slots: (0 slots) master
   replicates 4d973f83092894f511c84c2599660bd96b046e26
M: 63b0076dd9eb0a11fb371034afdeadf5ac150550 127.0.0.1:7005
   slots: (0 slots) master
   replicates c9321b85417bda740d93935d8b9096f49abb8078

客户端连接
redis-cli -p 7000 -c
-c 使用集群模式,允许转向

举例
# redis-cli -p 7001 -c
127.0.0.1:7001> set msg hello
OK
127.0.0.1:7001> set date 2016
-> Redirected to slot [2022] located at 127.0.0.1:7000
OK
127.0.0.1:7000> get msg
-> Redirected to slot [6257] located at 127.0.0.1:7001
"hello"
127.0.0.1:7001> get date
-> Redirected to slot [2022] located at 127.0.0.1:7000
"2016"
127.0.0.1:7000> get date
"2016"

date 7000
msg在7001
234属于7000 7003
abc 7001
a 7002

调整命令顺序,试试看
> set msg hello
> set date 2016
> get date
> get msg

上下线测试
干掉7000看看日志
    该节点的从节点会尝试连接 , 之后其它两个master的哨兵会投票让从节点变为master
开启7000看日志


#!/bin/bash
for i in `seq 0 5`
do
cd 700$i
redis-server redis.conf &
cd ..
done

7. Redis集群总结

  • Redis集群是一个由多个节点组成的分布式服务集群,它具有复制、高可用和分片特性
  • Redis的集群没有中心节点,并且带有复制和故障转移特性,这可用避免单个节点成为性能瓶颈,或者因为某个节点下线而导致整个集群下线
  • 集群中的主节点负责处理槽(储存数据),而从节点则是主节点的复制品
  • Redis集群将整个数据库分为16384个槽,数据库中的每个键都属于16384个槽中的其中一个
  • 集群中的每个主节点都可以负责0个至16384个槽,当16384个槽都有节点在负责时,集群进入上线状态,可以执行客户端发送的数据命令
  • 主节点只会执行和自己负责的槽有关的命令,当节点接收到不属于自己处理的槽的命令时,它将会处理指定槽的节点的地址返回给客户端,而客户端会向正确的节点重新发送
  • 如果需要完整地分片、复制和高可用特性,并且要避免使用代理带来的性能瓶颈和资源消耗,那么可以选择使用Redis集群;如果只需要一部分特性(比如只需要分片,但不需要复制和高可用等),那么单独选用twemproxy、Redis的复制和Redis Sentinel中的一个或多个
/twemproxy集群
运作模式代理模式,代理本身可能成为性能瓶颈,随着负载的增加需要添加更多twemproxy来分担请求负载,但每个twemproxy本身也会消耗一定的资源分布式,没有中心节点,但是因为每个节点都需要互相进行数据通信,所以在节点数量多时,集群用于进行通信所耗费的网络资源会比较多
分片基本上是按照池中的服务器数量N来分片,每个服务器平均占整个数据库的1/N按照槽来进行分片,通过每个节点指派不同数量的槽,可以控制不同节点负责数据量和请求数量
复制和高可用需要配合Redis的复制特性以及Redis Sentinel才能实现复制和高可用集群的节点内置了复制和高可用特性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值