当前位置:   article > 正文

Redis 高可用之集群搭建和数据分片_redis数据分片

redis数据分片

一、简介

1. Redis 集群:

Redis 集群是将数据和负载分散在多个节点上的一种方法。每个节点都是一个独立的 Redis 实例,这些实例协同工作以提供高可靠性和性能。在 Redis 集群中,数据被分数个槽位, 并将这些槽位分配给不同的节点存储,在读写数据时会自动进行数据迁移。Redis 集群的这种方式可以无需使用共享存储或共享内存等资源,便可以实现线性扩展。此外,Redis 集群还支持故障恢复和单点故障自动转移。

2. 集群搭建

当单个 Redis 实例无法满足业务需求时,Redis 集群便显得尤其必要。Redis 集群可以提高系统的可用性、吞吐量和容错性,从而满足高并发、高可靠性的业务场景。

二、Redis 集群搭建

1. 单机 Redis 升级为 Redis Cluster

a. 搭建方法

单机 Redis 可以通过升级到 Redis Cluster 来实现集群化部署。升级完成后,Redis 将变为一个多节点的集群,它包含多个节点,每个节点都是一个单独的 Redis 实例。下面介绍如何将 Redis 从单机模式升级为 Redis Cluster:

  1. 安装 Redis Server 和 Redis CLI

  2. 修改 Redis 配置文件 redis.conf。

 # 启用集群模式
  cluster-enabled yes
  
  # 节点间通信的超时时间
  cluster-node-timeout 5000
  
  # 集群状态持久化方式,可以是rdb或者aof,也可以都开启
  cluster-config-file nodes-6379.conf
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 重启 Redis 服务端

  2. 使用 redis-cli 创建 Redis Cluster

首先启动一个节点:

redis-server --port 7001 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000

然后在该节点上使用 redis-cli 工具的 cluster 命令创建集群:

redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 …

b. 搭建方式说明

以上搭建方法适用于小型 Redis 集群搭建。对于大规模的生产环境,需要使用 Redis 集群管理软件(如 Redis Sentinel 或 Redis Cluster)来进行故障转移和负载均衡。

2. 环境准备

在搭建 Redis 集群之前,需要进行如下准备工作:

  1. 安装 Redis server 和 Redis cli 工具

  2. 在多个机器上安装 Redis,并确保它们都能够互相通信。

  3. 确保每个 Redis Server 实例的配置文件中 cluster-enabled=yes。

  4. 创建一个目录用于存储 Redis Cluster 节点数据(如 /opt/redis/cluster/n1、/opt/redis/cluster/n2 等)。

3. 配置修改

  1. 修改每个 Redis Server 实例的配置文件,设置 node 一系列的参数(nodeport、nodename、dbfilename等)。

    
      # 集群名称
    cluster-name mycluster
    
    # 集群节点列表(多个Redis实例的 IP:PORT 组合)
    cluster-announce-ip <your_ip_address>
    cluster-announce-port <cluster_start_port>
    
    # 同一节点的多个 Redis 实例需要有不同的端口号
    port <different_port>
    
    # 集群工作目录,用于存储会产生的日志和状态信息等
    dir /path/to/redis/node1
    
    # 不使用AOF持久化方式(至少在这里不启动),可以降低内存使用率
    appendonly no
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  2. 将各个 Redis Server 实例的配置文件拷贝到对应的目录(如 /opt/redis/cluster/n1、/opt/redis/cluster/n2 等),多个目录分别代表不同的节点。

  3. 修改集群中最少、最多节点数量(从而决定能存储的槽数量)。

    cluster-node-timeout 5000 # 节点超时时间(单位毫秒)
    cluster-config-file nodes-6379.conf # 集群状态持久化文件
    cluster-minimum-nodes <number_of_nodes> # 集群最少节点数
    cluster-max-redirects 6 # 节点内部重定向的最大次数
    
    • 1
    • 2
    • 3
    • 4

4. 启动集群

  1. 在多个节点上启动 Redis Server 实例,并在它们的配置文件中开启“集群模式”。

  2. 使用 redis-cli 工具的 cluster 命令创建集群:

    redis-cli --cluster create <ip1>:<port1> <ip2>:<port2> ... --cluster-replicas
    
    • 1

此处的 <ip><port> 是各个 Redis Server 实例的 IP 地址和端口号,--cluster-replicas 参数表示使用自动生成的从节点。

到这里,一个 Redis 集群便成功搭建了。可以使用 redis-cli 工具进行验证和测试。

三、Redis数据分片的实现

Redis数据分片概念说明

Redis是一款支持较小内存的高性能键值对(key-value)存储数据库,随着业务数据逐步增大,单机Redis可能会出现内存不足、性能瓶颈等情况。数据分片是一种常见的解决Redis单点故障的方案,将数据划分到多个节点上进行存储和处理。

数据分片的策略

Redis官方提供了三种数据分片的策略:哈希一致性算法、按范围区间分片、哈希槽模式分片。

哈希一致性算法

哈希一致性算法是一种将数据节点进行哈希运算,将结果映射到环形空间的算法。通俗的讲,就是将每个节点用一个哈希值表示,然后在某个范围内寻找距离节点最近的值,将数据存储到该节点上。需要注意的是,当节点数量发生变化时,该算法需要重新计算哈希值。

按范围区间分片

按范围区间分片是一种将数据按照值的范围划分为若干段,然后将每个段分配给不同的节点进行存储和处理。该策略适用于数据能够按照某种方式划分为多个区间的场景。例如,按照用户ID的范围进行分片。

哈希槽模式分片

哈希槽模式分片是Redis集群中最常用的一种分片策略。将Hash Slot(哈希槽)的数量固定为16384,将数据库中所有Key使用相同的哈希函数进行哈希运算,再对16384进行取余,确定该Key对应的哈希槽。每个节点负责处理一部分哈希槽。如果节点数发生变化,槽和节点之间的映射关系会重新计算,数据迁移至新节点。

四、Redis集群的运维与维护

集群节点状态的监控

Redis提供了监控集群状态的工具redis-cli、redis-trib.rb和redis-stat,可以通过命令行或Web界面查看集群的实时状态、数据流量、QPS等信息。

集群故障处理

当集群中某个节点出现故障时,可以通过以下几个步骤进行处理:首先查看运行日志,分析故障原因;其次尝试重启、修复问题;最后如果无法修复,则通过增加新节点替代原有节点。

节点掉线恢复

当节点掉线时,需要先确认节点是否真的掉线,而非假故障,然后检查运行日志,并在必要的情况下进行数据迁移。

槽迁移处理

当增加或删除节点时,需要将一些槽重新分配到其他节点上,并进行数据迁移。这个操作需要在集群处于正常状态时进行。关键在于避免数据重复和数据丢失。

集群扩容、缩容

集群的扩容很简单,只需要增加新节点,然后进行槽的重新分配和数据迁移即可。缩容相对较为困难,需要考虑如何进行异地备份、数据归档等操作。可以采用持久化方式来对被缩容的节点进行数据归档,并通过Redis提供的Restore命令进行恢复。

五、Redis集群实现高可用方案

1. Redis主从架构

在Redis主从架构中,一个节点(Redis实例)被指定为主节点(master),其余节点为从节点(slave)。
主节点负责写操作并将写操作同步给从节点,从节点只能读取数据。

2. 主从同步

主从同步是指主节点将写操作同步到从节点,实现从节点数据与主节点数据的一致性。当从节点与主节点失去联系时,从节点变成不可用状态。

3. 主从切换

主从切换是指发生故障后将主节点切换到某个从节点,以此保证系统的可用性。

4. Redis哨兵模式

Redis哨兵模式是保证Redis高可用性的一种方式,通过Sentinel(哨兵)监控系统Redis节点状态,当某个Redis节点出现故障时,Sentinel会自动进行主从切换。

5. Redis集群集成实践案例

Redis集群是为了解决单台机器容量有限的问题,集群中的每个节点(在一定意义上可以看成是“分片”)处理部分数据,所有节点组成一个完整的Redis服务。
下面我们通过一个实例进行演示。

集群搭建

  1. 安装Redis和Ruby环境:

    sudo apt-get update
    sudo apt-get install redis-server ruby
    
    • 1
    • 2
  2. 安装ruby包管理器:

    sudo apt-get install rubygems
    
    • 1
  3. 安装redis和redis-trib.rb

    sudo gem install redis
    wget http://download.redis.io/redis-stable/src/redis-trib.rb
    chmod +x redis-trib.rb
    
    • 1
    • 2
    • 3
  4. 创建6个Redis实例,并启动:redis-6379,redis-6380,redis-6381,redis-6382,redis-6383,redis-6384

  5. 创建集群:

    ./redis-trib.rb create --replicas 1 \
                127.0.0.1:6379 \
                127.0.0.1:6380 \
                127.0.0.1:6381 \
                127.0.0.1:6382 \
                127.0.0.1:6383 \
                127.0.0.1:6384
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

集群使用

  1. 连接到Redis集群中任意节点:

    redis-cli -c -h 127.0.0.1 -p 6379
    
    • 1
  2. 在Redis集群中创建key,并查看分配情况:

    set foo bar
    cluster keyslot foo
    
    • 1
    • 2
  3. 查看当前集群节点状态:

    cluster nodes
    
    • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/684365
推荐阅读
相关标签
  

闽ICP备14008679号