Redis三大高可用模式
单一实例的工作模式通常无法保证Redis的可用性和拓展性,Redis提供了三种分布式方案:
- 主从模式
- 哨兵模式
- 集群模式
三大模式特点分析:
主从复制
主从复制:主从复制是高可用Redis的基础,哨兵和群集都是在主从复制基础上实现高可用的。
主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单故障恢复。
缺陷:故障恢复无法自动化,写操作无法负载均衡,存储能力受到单机的限制。
哨兵
哨兵:在主从复制的基础上,哨兵实现了自动化的故障恢复。
缺陷:写操作无法负载均衡,存储能力受到单机的限制,哨兵无法对从节点进行自动故障转移;在读写分离场景下,从节点故障会导致读服务不可用,需要对从节点做额外的监控、切换操作。
集群cluster模式
集群:通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
二、Redis的主从模式
- 主从模式的定义
Redis的主从模式是一种数据备份和读写分离的模式。在这种模式下,有一个主节点(Master)和一个或多个从节点(Slave)。所有的写操作都在主节点上进行,而读操作可以在主节点和从节点上进行。从节点会复制主节点的数据,实现数据的备份。
- 主从模式的工作原理
在主从模式下,主节点负责处理所有的写操作,并将写操作记录在内存中的缓冲区。从节点从主节点获取这些写操作记录,并在自己的数据库上执行这些操作,从而保持与主节点的数据一致。此外,读请求可以在主节点和从节点上进行,从而实现读写分离,提高系统的读取性能。
具体的同步步骤如下:
1.从服务器连接到主服务器
首先,从服务器需要连接到主服务器。这通常通过在从服务器上执行SLAVEOF命令并指定主服务器的IP地址和端口号来完成。
2.发送SYNC命令
从服务器连接到主服务器后,它会发送一个SYNC命令。这个命令是Redis复制的核心,它会触发主服务器开始复制过程。
3.主服务器开始保存数据
收到SYNC命令后,主服务器会开始在后台保存其数据快照。同时,主服务器还会记录从接收到SYNC命令开始执行的所有写命令,这些命令将在数据快照完成后发送给从服务器。
4.主服务器发送数据快照
数据快照完成后,主服务器会将其发送给从服务器。从服务器在接收到数据快照后,会删除所有旧数据,然后使用接收到的数据快照来加载新数据。
5.主服务器发送缓存的写命令
数据快照发送完成后,主服务器会将在数据快照过程中记录的所有写命令发送给从服务器。从服务器在接收到这些命令后,会按照接收的顺序执行这些命令,以确保其数据与主服务器的数据保持一致。
6.主从同步完成,进入命令转发阶段
完成上述步骤后,主从服务器的数据就同步了。之后,主服务器每执行一次写命令,就会将这个命令发送给所有的从服务器。从服务器在接收到写命令后,会执行这个命令,以确保其数据始终与主服务器的数据保持一致。
3. 主从模式的配置和使用
配置主从模式相对简单,只需要在从节点的配置文件中设置主节点的IP地址和端口号,然后启动从节点即可。从节点会自动连接到主节点,并开始复制数据。在使用上,用户可以直接向主节点发送写请求,而读请求可以发送到主节点或从节点。
4. 主从模式的优点和局限性
优点:
- 可以实现数据的备份,提高数据的安全性;
- 读写分离,提高系统的读取性能
局限性:
- 不能自动切换,如果主节点发生故障,从节点不能自动切换为主节点,需要人工干预;
- 所有的写操作都在主节点上进行,如果写请求量大,主节点可能会成为性能瓶颈。
5. 主从模式配置
Redis 主从模式(Master-Slave Replication)是一种基本的高可用性和读扩展解决方案。
主节点(Master)负责处理所有写操作和部分读操作,从节点(Slave)从主节点同步数据,并处理读操作。
以下是配置 Redis 主从模式的详细步骤:
5.1. 准备环境
确保你已经安装了 Redis,并且有一台主节点和至少一台从节点的服务器或虚拟机。
5.2. 配置主节点
主节点的配置文件通常比较简单,以下是一个基本的配置示例:
redis.conf(主节点配置文件):
port 6379
bind 0.0.0.0
port:指定主节点的端口,默认是 6379。
bind:指定 Redis 实例绑定的网络接口。0.0.0.0 表示绑定到所有网络接口。
5.3. 配置从节点
在从节点的配置文件中,你需要指定主节点的地址和端口。
redis.conf(从节点配置文件):
port 6380
bind 0.0.0.0
replicaof <master-ip> 6379
port:指定从节点的端口,通常与主节点不同,例如 6380。 bind:指定从节点绑定的网络接口。
replicaof <master-ip> 6379:<master-ip> 是主节点的 IP 地址,6379 是主节点的端口。这条指令指定了当前 Redis实例为主节点的从节点。
5.4. 启动 Redis 实例
在每台机器上启动 Redis 实例:
redis-server /path/to/redis.conf
确保主节点和从节点都能正常启动并运行。
5.5. 验证主从配置
你可以通过 redis-cli 工具来验证主从节点的状态。连接到从节点,执行以下命令:
redis-cli -p 6380 INFO replication
检查输出中的 role 字段,应显示 slave,且 master_host 和 master_port 字段应显示主节点的 IP
和端口。如果从节点正在同步主节点数据,还可以看到 slave0 等相关字段。
在主节点上,你可以执行以下命令来查看从节点:
redis-cli -p 6379 INFO replication
在主节点的输出中,你应该能看到 connected_slaves 列表,列出所有连接的从节点。
5.6. 主从节点的同步
初次配置时,从节点会从主节点拉取数据进行全量同步。同步过程可能需要一些时间,取决于数据量的大小。可以通过以下命令手动触发从节点与主节点的同步:
在从节点上执行:
redis-cli -p 6380 SLAVEOF <master-ip> 6379
如果要停止从节点的复制,可以执行:
redis-cli -p 6380 SLAVEOF NO ONE
这将使从节点成为一个独立的 Redis 实例,而不再复制主节点。
5.7. 读写分离
一旦配置完成,你可以在应用中实现读写分离:
所有写操作(如 SET, DEL)应发送到主节点。 读操作(如 GET, MGET)可以发送到从节点,以分散负载并提高性能。
5.8. 监控和维护
监控主从同步状态:定期检查主从节点的同步状态,确保数据一致性。
备份和恢复:定期备份主节点的数据。恢复时,你可以将从节点提升为新的主节点。
故障转移:如果主节点出现故障,需要手动将从节点提升为新的主节点,并重新配置其他从节点进行复制。
总结
配置主节点:设置主节点的基本配置。
配置从节点:设置从节点的复制配置,指定主节点地址。
启动 Redis 实例:在主节点和从节点上启动Redis 实例。
验证和监控:验证主从配置的正确性,并监控主从同步状态。
读写分离:在应用中实现读写分离以优化性能。
Redis主从模式提供了一种简单的高可用和读扩展解决方案,但如果需要更高的可用性和自动故障转移,建议考虑使用 Redis 哨兵模式或 Redis集群模式。
三、Redis的哨兵模式
1. 哨兵模式的定义
Redis的哨兵模式是在主从模式的基础上,增加了故障转移的功能。
哨兵模式下,除了主节点和从节点,还有一个或多个哨兵节点(Sentinel)。
哨兵节点的主要任务是监控主节点和从节点的运行状态,并在主节点发生故障时,自动将从节点提升为主节点。
2. 哨兵模式的工作原理
在哨兵模式下,哨兵节点会定期检查主节点和从节点的运行状态。如果发现主节点发生故障,哨兵节点会在从节点中选举出一个新的主节点,并通知其他的从节点和哨兵节点。此外,哨兵节点还可以接收客户端的查询请求,返回当前的主节点信息,从而实现客户端的透明切换。
Sentinel主要负责三个方面的任务:
- 监控:通过发送命令,不间断的监控Redis服务器运行状态,包括主服务器和从服务器。
- 提醒:当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(核心任务):当哨兵监测到主服务器宕机,会自动在已下线主服务器属下的所有从服务器里面,挑选出一个从服务器将其转换为主服务器(自动切换)。然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
1. 哨兵模式的配置和使用
配置哨兵模式需要在哨兵节点的配置文件中设置主节点的信息和故障转移的策略,然后启动哨兵节点即可。在使用上,用户可以直接向主节点发送写请求,而读请求可以发送到主节点或从节点。如果主节点发生故障,用户可以从哨兵节点获取新的主节点信息,然后向新的主节点发送请求。
2. 哨兵模式的优点和局限性
优点:
- 哨兵模式可以实现故障转移,提高系统的可用性
- 哨兵模式可以实现客户端的透明切换,提高系统的可维护性。
局限性:
- 哨兵节点需要额外的资源和维护,增加了系统的复杂性;
- 主节点发生故障后,新的主节点可能会有一段时间的数据不一致,影响数据的准确性。
3.哨兵模式配置
Redis 哨兵模式(Sentinel)用于提供高可用性和自动故障转移。Redis Sentinel 监控 Redis 主从节点的健康状态,并在主节点发生故障时自动将一个从节点提升为新的主节点。
以下是配置 Redis 哨兵模式的详细步骤:
3.1. 准备环境
确保你有多个 Redis 实例,通常是一个主节点和至少一个从节点。你还需要部署 Sentinel 实例来监控和管理这些 Redis 节点。
3.2. 配置 Redis 主从节点
首先,你需要配置主节点和从节点。每个 Redis 实例都需要有相应的配置文件。
主节点配置
主节点的配置相对简单,默认配置即可。
redis.conf(主节点配置文件):
port 6379
bind 0.0.0.0
从节点配置
在从节点的配置文件中,你需要指定主节点的地址。
redis.conf(从节点配置文件):
port 6380
bind 0.0.0.0
replicaof <master-ip> 6379
将 替换为主节点的 IP 地址。
3.3. 启动 Redis 实例
在所有节点上启动 Redis 实例:
redis-server /path/to/redis.conf
3.4. 配置 Sentinel
你需要在多个机器上配置 Sentinel 实例(推荐至少配置三个 Sentinel 实例来确保高可用性)。
每个 Sentinel 实例都需要配置文件。
Sentinel 配置文件
sentinel.conf(Sentinel 配置文件):
port 26379
bind 0.0.0.0
# 监控主节点的配置
sentinel monitor mymaster <master-ip> 6379 2
# 主节点故障转移超时设置
sentinel down-after-milliseconds mymaster 5000
# 自动故障转移的延迟设置
sentinel failover-timeout mymaster 10000
# 集群通知设置(可选)
sentinel notification-script mymaster /path/to/notification-script.sh
sentinel client-reconfig-script mymaster /path/to/client-reconfig-script.sh
配置项解释:
sentinel monitor mymaster 6379 2:指定 Sentinel 监控主节点
mymaster, 是主节点的 IP 地址,6379 是主节点的端口,2 是 Sentinel
实例的数量阈值,表示需要多少 Sentinel 实例确认主节点故障。 sentinel down-after-milliseconds
mymaster 5000:设置主节点被认为是故障的时间阈值(单位是毫秒)。 sentinel failover-timeout
mymaster 10000:设置故障转移超时时间(单位是毫秒)。 sentinel notification-script 和
sentinel client-reconfig-script:设置当主节点发生故障或重新配置时的通知和脚本(可选)。
启动 Sentinel 实例
在所有配置了 Sentinel 的机器上,启动 Sentinel 实例:
redis-sentinel /path/to/sentinel.conf
3.5. 检查 Sentinel 状态
你可以使用 redis-cli 工具来检查 Sentinel 的状态:
redis-cli -p 26379 sentinel masters
redis-cli -p 26379 sentinel slaves mymaster
redis-cli -p 26379 sentinel sentinel mymaster
这些命令分别用于检查主节点信息、从节点信息和 Sentinel 状态。
3.6. 验证故障转移
为了验证 Sentinel 的故障转移功能,可以模拟主节点故障。你可以使用以下方法之一:
场景一:停止主节点:直接停止主节点的 Redis 实例,Sentinel 将检测到故障并启动故障转移过程。
场景二:使用 redis-cli 进行故障注入:在 Redis 主节点上使用 SHUTDOWN 命令模拟故障。
确保故障转移成功后,从节点应该会被提升为新的主节点,其他从节点将会重新复制新的主节点。
总结
配置主从节点:设置主节点和从节点的配置文件,并启动 Redis 实例。
配置 Sentinel:创建 Sentinel
配置文件,设置监控、故障转移和通知的相关配置。
启动 Sentinel 实例:在配置了 Sentinel 的机器上启动 Sentinel实例。
检查和验证:使用 redis-cli 检查 Sentinel 状态,并通过模拟故障验证故障转移功能。
四、Redis的集群模式
1. 集群模式的定义
Redis的集群模式是一种分布式的解决方案,它允许多个Redis节点(服务器)协同工作,提供更高的性能和可用性。在这种模式下,数据被分片存储在多个节点上,每个节点负责一部分数据的读写。
集群模式主要解决水平拓展问题和整体的高可用(局部节点故障不影响其他节点的数据)。
如果要保证所有数据的高可用还需要配合主从模式
2. 集群模式的工作原理
在集群模式下,Redis使用一种叫做哈希槽的技术来实现数据的分片。整个哈希空间被分成16384个哈希槽,每个节点负责一部分哈希槽。当一个键需要被存储时,Redis会根据键的值计算出一个哈希值,然后根据哈希值决定将这个键存储在哪个节点上。这样,读写请求就可以在多个节点上并行处理,提高了系统的性能。
实现原理: 在Redis集群模式下,任意一个Master节点都可以接受客户端的请求。当客户端向某个Master节点发送请求时,如果这个请求的键所对应的哈希槽不在这个Master节点负责的范围内,那么这个Master节点会返回一个重定向信息,告诉客户端应该向哪个节点发送请求。这个过程对客户端来说是透明的,客户端只需要按照重定向信息重新发送请求即可。这种方式确保了Redis集群可以有效地处理并分发客户端的请求,提高了系统的性能和可用性。
3. 集群模式的配置和使用
配置集群模式需要在每个节点的配置文件中设置集群模式,并指定其他节点的信息,然后启动所有节点即可。在使用上,用户可以直接向任何一个节点发送请求,节点会根据请求的键自动路由到正确的节点上。
4. 集群模式的优点和局限性
优点
- 集群模式可以实现数据的水平扩展,提高了系统的性能和存储容量;
- 集群模式实现高可用性,即使某个节点发生故障,系统仍然可以继续提供服务。
局限性:
- 配置和维护相对复杂,需要管理多个节点;
- 某些操作,如多键操作和事务,可能会受到限制。
5. 集群模式配置
1. 前提条件
确保你已经安装了 Redis,并且每台机器上都已安装 Redis 实例。你需要至少三台机器(或虚拟机)来配置一个最小的 Redis 集群,其中包括 3 个主节点和 3 个从节点(每个主节点都有一个从节点),以确保高可用性。
2. 配置 Redis 实例
每个 Redis 实例都需要进行一些特定的配置。以下是配置步骤:
2.1、配置文件
在每台机器上,创建或编辑 Redis 配置文件(通常为 redis.conf),并进行以下修改:
启用集群模式
cluster-enabled yes
指定集群配置文件
cluster-config-file nodes.conf
nodes.conf 文件是 Redis 集群状态和节点信息的持久化文件。
设置集群端口
默认情况下,Redis 集群的端口是 7000,但你可以根据需要调整:
port 7000
2.2、设置集群节点之间的通信端口
Redis 集群使用 port + 10000 的端口用于节点之间的通信。
例如,如果 Redis 运行在 7000 端口,则集群内部通信端口为 17000。你可以在防火墙中开放这些端口。
cluster-node-timeout 5000
cluster-node-timeout 是节点间超时时间的设置(单位为毫秒),可以根据需要调整。
启用持久化(可选)
如果需要持久化,可以保留 RDB 和 AOF 配置,但集群模式本身不会影响这些配置。
save 900 1
appendonly yes
启动 Redis 实例
在每台机器上,使用配置文件启动 Redis 实例:
redis-server /path/to/redis.conf
2.3. 创建集群
当所有 Redis 实例都启动后,你可以使用 redis-cli 工具来创建集群。确保所有 Redis 实例都能够互相访问。
使用 redis-cli 创建集群
在一个机器上(可以选择任意一台),运行以下命令来创建集群:
redis-cli --cluster create <node1-ip>:<port> <node2-ip>:<port> <node3-ip>:<port> <node4-ip>:<port> <node5-ip>:<port> <node6-ip>:<port> --cluster-replicas 1
其中,<node-ip>:<port>等是你所有 Redis 实例的 IP 地址和端口。例如:
redis-cli --cluster create 192.168.1.1:7000 192.168.1.2:7000 192.168.1.3:7000 192.168.1.1:7001 192.168.1.2:7001 192.168.1.3:7001 --cluster-replicas 1
这条命令的参数解释:
–cluster create:创建一个新的 Redis 集群。
- <nodeX-ip>:<port>:集群中所有主节点的地址。
- –cluster-replicas 1:为每个主节点配置一个从节点。
检查集群状态
创建完成后,你可以使用 redis-cli 工具检查集群状态:
redis-cli -c -p 7000 cluster info
或者查看节点信息:
redis-cli -c -p 7000 cluster nodes
2.4. 管理和维护
添加新节点:可以通过 redis-cli 工具向现有集群添加新节点:
redis-cli --cluster add-node <new-node-ip>:<port> <existing-node-ip>:<port>
删除节点:可以通过 redis-cli 工具从集群中删除节点:
redis-cli --cluster del-node <existing-node-ip>:<port> <node-id>
重新分片:Redis 集群支持重新分片以平衡负载:
redis-cli --cluster reshard <existing-node-ip>:<port>
总结
配置 Redis 实例:在每台机器上配置 Redis 实例,启用集群模式,并设置必要的配置参数。
创建集群:使用 redis-cli 创建
Redis 集群,指定所有主节点和从节点,并配置副本。
管理和维护:添加、删除节点,进行重新分片以维护集群的健康和性能。
Redis集群模式允许高可用性和水平扩展,但也需要相应的管理和维护。
五、三种模式的比较和选择
- 主从模式、哨兵模式和集群模式的比较
- 主从模式是最基础的模式,配置简单,主要用于数据备份和读写分离,提高系统的读取性能。但是,主从模式无法处理主节点故障的情况。
- 哨兵模式在主从模式的基础上增加了故障转移的功能,可以自动处理主节点故障的情况,提高了系统的可用性。但是,哨兵模式需要额外的哨兵节点,增加了系统的复杂性。
- 集群模式是一种分布式的解决方案,可以实现数据的水平扩展,提高了系统的性能和存储容量。同时,集群模式也可以实现高可用性,即使某个节点发生故障,系统仍然可以继续提供服务。但是,集群模式的配置和维护相对复杂,需要管理多个节点。
2. 根据不同的应用场景选择合适的模式
- 如果你的应用场景主要是读取数据,数据量不大,对数据的一致性要求不高,那么主从模式可能是一个不错的选择。
- 如果你的应用场景需要高可用性,即使在主节点发生故障的情况下也需要保证服务的正常运行,那么哨兵模式可能更适合你。
- 如果你的应用场景数据量大,需要高性能和高可用性,那么集群模式可能是最好的选择。集群模式可以提供更高的性能,更大的存储容量,以及更好的故障容忍能力。