Redis 高可用之集群搭建和数据分片
- 一、简介
- 1. Redis 集群:
- 2. 集群搭建:
- 二、Redis 集群搭建
- 1. 单机 Redis 升级为 Redis Cluster
- a. 搭建方法
- b. 搭建方式说明
- 2. 环境准备
- 3. 配置修改
- 4. 启动集群
- 三、Redis数据分片的实现
- Redis数据分片概念说明
- 数据分片的策略
- 哈希一致性算法
- 按范围区间分片
- 哈希槽模式分片
- 四、Redis集群的运维与维护
- 集群节点状态的监控
- 集群故障处理
- 节点掉线恢复
- 槽迁移处理
- 集群扩容、缩容
- 五、Redis集群实现高可用方案
- 1. Redis主从架构
- 2. 主从同步
- 3. 主从切换
- 4. Redis哨兵模式
- 5. 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:
-
安装 Redis Server 和 Redis CLI
-
修改 Redis 配置文件 redis.conf。
# 启用集群模式
cluster-enabled yes
# 节点间通信的超时时间
cluster-node-timeout 5000
# 集群状态持久化方式,可以是rdb或者aof,也可以都开启
cluster-config-file nodes-6379.conf
-
重启 Redis 服务端
-
使用 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 集群之前,需要进行如下准备工作:
-
安装 Redis server 和 Redis cli 工具
-
在多个机器上安装 Redis,并确保它们都能够互相通信。
-
确保每个 Redis Server 实例的配置文件中 cluster-enabled=yes。
-
创建一个目录用于存储 Redis Cluster 节点数据(如 /opt/redis/cluster/n1、/opt/redis/cluster/n2 等)。
3. 配置修改
-
修改每个 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
-
将各个 Redis Server 实例的配置文件拷贝到对应的目录(如 /opt/redis/cluster/n1、/opt/redis/cluster/n2 等),多个目录分别代表不同的节点。
-
修改集群中最少、最多节点数量(从而决定能存储的槽数量)。
cluster-node-timeout 5000 # 节点超时时间(单位毫秒) cluster-config-file nodes-6379.conf # 集群状态持久化文件 cluster-minimum-nodes <number_of_nodes> # 集群最少节点数 cluster-max-redirects 6 # 节点内部重定向的最大次数
4. 启动集群
-
在多个节点上启动 Redis Server 实例,并在它们的配置文件中开启“集群模式”。
-
使用 redis-cli 工具的 cluster 命令创建集群:
redis-cli --cluster create <ip1>:<port1> <ip2>:<port2> ... --cluster-replicas
此处的 <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服务。
下面我们通过一个实例进行演示。
集群搭建
-
安装Redis和Ruby环境:
sudo apt-get update sudo apt-get install redis-server ruby
-
安装ruby包管理器:
sudo apt-get install rubygems
-
安装redis和redis-trib.rb
sudo gem install redis wget http://download.redis.io/redis-stable/src/redis-trib.rb chmod +x redis-trib.rb
-
创建6个Redis实例,并启动:redis-6379,redis-6380,redis-6381,redis-6382,redis-6383,redis-6384
-
创建集群:
./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
集群使用
-
连接到Redis集群中任意节点:
redis-cli -c -h 127.0.0.1 -p 6379
-
在Redis集群中创建key,并查看分配情况:文章来源:https://uudwc.com/A/kA8ek
set foo bar cluster keyslot foo
-
查看当前集群节点状态:文章来源地址https://uudwc.com/A/kA8ek
cluster nodes