Redis集群

1. 简介

由多个Redis服务器组成的分布式网络服务集群

每一个Redis服务器称为节点Node,节点之间会互相通信。两两相连

Redis集群无中心节点(无主模型)

redis3.x及以上版本支持

2. Redis集群节点复制

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

3. Redis集群故障转移

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

4. Redis集群分片

集群将整个数据库分为16384个槽位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

4. 何时集群不能对外提供服务

  1. 过半的主节点挂掉,不能对外提供服务
  2. 其中任意一个节点主从都挂掉,不能对外提供服务

主节点过半机制判定一个主节点是否挂掉

5. Redis集群Redirect转向

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

6. Redis集群搭建

创建多个主节点
为每一个节点指派slot,将多个节点连接起来,组成一个集群
槽位分片完成后,集群进入上线状态

6个节点:3个主节点,每一个主节点有一个从节点

  1. 安装gcc、tcl、ruby以及rubygems
    yum install gcc tcl -y
    yum install ruby rubygems -y

  2. 下载redis3.0以及以上的tar包并解压

  3. 编译并安装
    make
    make install PREFIX=/opt/redis

  4. 编辑配置文件
    拷贝源码目录中的redis.conf到/opt/redis/conf目录下,编辑

    bind 0.0.0.0
    daemonize yes
    #注释放开就行了
    cluster-enabled yes 
    
  5. redis-trib.rb拷贝到目录/opt/redis/

  6. 下载并安装redis.gem
    https://rubygems.org/downloads/redis-3.0.0.gem
    https://rubygems.org/gems/redis/versions/3.0.0
    gem install redis-3.0.0.gem

  7. 其他节点相同操作

  8. 启动6台节点上的redis
    cd /opt/redis
    bin/redis-server conf/redis.conf

  9. 运行命令:
    redis-trib.rb create --replicas 1 192.168.100.101:6379 192.168.100.102:6379 192.168.100.103:6379 192.168.100.104:6379 192.168.100.105:6379 192.168.100.106:6379

  10. 连接
    cd /opt/redis
    bin/redis-cli -c
    -c表示集群连接,否则单机连接

添加节点107

./redis-trib.rb add-node <新节点ip:port> <集群中已存在的一个masterip:port>

./redis-trib.rb add-node 192.168.100.107:6379 192.168.100.101:6379
在客户端使用该命令CLUSTER NODES 查看节点信息

给新节点107分配hash slots 1000个

./redis-trib.rb reshard --from all --to <新节点ip:port> --slots <hash slots数> --yes <集群中已存在的一个masterip:port>

./redis-trib.rb reshard --from all --to 8ba4a99a6f4ee94b0db053eb2a1ec5577a80dd40 --slots 1000 --yes 192.168.100.101:6379

启动108,作为107的从节点加入集群:
./redis-trib.rb add-node --slave <新的从节点ip:port> <masterip:port>

./redis-trib.rb add-node --slave 192.168.100.108:6379 192.168.100.107:6379

移除107的从节点
./redis-trib.rb del-node <从节点ip:port> <从节点id>

./redis-trib.rb del-node 192.168.100.107:6379 8ba4a99a6f4ee94b0db053eb2a1ec5577a80dd40

删除主节点107:

  1. 迁移hash slots
    ./redis-trib.rb reshard --from <节点id> --slots <hash slots数> <masterip:port>

    ./redis-trib.rb reshard --from a7b2151e53b99456064614bedd341acc1dbc28d4 --to c7ed704c5289f8935b707bd26a52b5c8f52f1467 --slots 333 192.168.100.101:6379

    ./redis-trib.rb reshard --from a7b2151e53b99456064614bedd341acc1dbc28d4 --to 6b2225b705224870b498305ba3024024fea797e2 --slots 334 192.168.100.102:6379

    ./redis-trib.rb reshard --from a7b2151e53b99456064614bedd341acc1dbc28d4 --to 056a42e8b7489cb7e579cc1e0af936885d24ccaa --slots 333 192.168.100.103:6379

  2. 移除空的主节点
    ./redis-trib.rb del-node <masterip:port> <节点id>

    ./redis-trib.rb del-node 192.168.100.101:6379 a7b2151e53b99456064614bedd341acc1dbc28d4

### Redis 集群的搭建与配置 #### 一、Redis 集群简介 Redis 是一种高性能的键值存储系统,支持多种数据结构操作。通过集群模式可以实现分布式存储和高可用性。Redis 集群允许多个 Redis 实例协同工作,提供更高的吞吐量和更强的数据持久化能力。 --- #### 二、环境准备 在开始之前,需确认以下条件已满足: - 所有服务器的操作系统版本一致(如 CentOS 7 或 Windows),并安装了相同版本的 Redis 软件。 - 已关闭防火墙或开放必要的端口(默认 Redis 使用 6379 及其衍生端口)。 - 每台服务器上至少有两个 Redis 实例运行,分别作为主节点和从节点[^1]。 --- #### 三、具体步骤 ##### 1. 下载并解压 Redis 文件 下载指定版本的 Redis 压缩包(如 Redis 6.2.5 或更高版本),将其解压到目标路径下。例如,在 Linux 中执行以下命令: ```bash wget http://download.redis.io/releases/redis-6.2.5.tar.gz tar -zxvf redis-6.2.5.tar.gz cd redis-6.2.5 make ``` ##### 2. 创建多个实例目录 为每个 Redis 实例创建独立的工作目录,并复制 `redis.conf` 至对应文件夹中。例如: ```bash mkdir -p /service/redis/{6379,6380} cp redis.conf /service/redis/6379/ cp redis.conf /service/redis/6380/ ``` ##### 3. 修改配置文件 编辑每个实例下的 `redis.conf` 文件,设置不同的监听端口号和其他必要参数。以下是关键配置项: - 设置绑定 IP 地址:`bind 0.0.0.0` - 关闭保护模式:`protected-mode no` - 开启集群功能:`cluster-enabled yes` - 指定集群配置文件位置:`cluster-config-file nodes-{port}.conf` - 设定日志级别:`loglevel notice` ##### 4. 启动 Redis 实例 依次启动各个 Redis 实例。例如: ```bash redis-server /service/redis/6379/redis.conf redis-server /service/redis/6380/redis.conf ``` 如果是在多台物理机上部署,则需要远程登录每台机器重复上述过程[^2]。 ##### 5. 构建集群拓扑 利用 `redis-cli` 的集群管理工具完成初始化操作。假设当前存在六个节点分布在三台主机上,则可输入如下指令构建集群关系: ```bash redis-cli --cluster create \ 192.168.x.y:6379 192.168.x.z:6379 ... \ --replicas 1 ``` 其中 `--replicas` 参数表示每个主节点分配几个副本[^4]。 ##### 6. 验证集群状态 最后可以通过以下方式验证集群是否正常运作: ```bash redis-cli -c -h {任意IP} -p {任一口号} CLUSTER INFO CLUSTER NODES PING SET key value GET key ``` --- #### 四、注意事项 - 如果使用 Docker 容器来部署 Redis 集群,请确保容器间网络互通良好。 - 对于 Windows 平台上的开发测试场景,可通过批处理脚本来简化服务启动流程[^3]。 --- #### 五、示例代码片段 下面展示了一个简单的 Python 程序用于连接至 Redis 集群并向其中写入一条记录: ```python import redis r = redis.StrictRedisCluster(startup_nodes=[{"host": "127.0.0.1", "port": "6379"}], decode_responses=True) r.set('foo', 'bar') print(r.get('foo')) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theONLY0318

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值