结合前三期 Redis(一) Redis简介(Redis(一) Redis简介-CSDN博客) Redis(二) 可编程性(Redis(二) 可编程性-CSDN博客) Redis(三) 事务与发布订阅(Redis(三) 事务与发布订阅-CSDN博客)
目录
1.0 Redis主从
1.1 Redis 主从结构的基本原理和工作方式
1.2 Redis 主从结构的好处
1.3 Redis 主从结构的不足
1.4 主从环境搭建
1.4.0 docker启动两个redis容器
1.4.1 从redis配置
1.4.2 主从模式测试
1.5 Redis主从总结
2.0 Redis哨兵
2.1 Redis Sentinel 的基本原理和工作方式
2.2 Redis Sentinel 的好处
2.3 Redis Sentinel 的不足
2.4 Redis Sentinel环境搭建
2.4.0 Sentinel配置
2.4.1 Redis配置
2.4.2 YML文件
2.4.3 启动
2.5 总结
3.0 Redis集群
3.1 背景介绍
3.2 工作原理
3.3 部署方式
3.4 Redis集群的好处
3.5 Redis集群的不足
3.6 总结
1.0 Redis主从
1.1 Redis 主从结构的基本原理和工作方式
Redis 主从结构由一个主节点(master)和多个从节点(slave)组成。主节点负责处理客户端的写操作和读操作,而从节点则负责复制主节点的数据,并可以处理读操作。主节点将写操作记录在自己的日志文件中,并将写操作的指令发送给所有的从节点,从节点接收到指令后执行相同的操作,从而保持数据的一致性。
主从结构的数据复制过程分为全量复制和增量复制两个阶段。在全量复制阶段,从节点首先从主节点获取全部数据的副本,并在本地进行保存。在增量复制阶段,从节点持续地从主节点获取新的写操作指令,并在本地执行这些指令,从而保持数据的同步。
1.2 Redis 主从结构的好处
-
高可用性: 当主节点发生故障时,从节点可以自动切换为主节点,继续提供服务,从而保证系统的高可用性。主从结构能够在极短的时间内完成故障转移,使系统可以快速恢复。
-
数据备份: 从节点保存了主节点的完整数据副本,当主节点发生数据丢失或损坏时,可以通过从节点恢复数据,避免数据的永久丢失,保证数据的安全性。
-
负载均衡: 主从结构可以通过将读操作分发给多个从节点来分担主节点的读负载,提高系统的读取性能。通过增加从节点的数量,可以进一步提高系统的读取性能和吞吐量。
-
灾难恢复: 当整个 Redis 主节点所在的数据中心发生故障时,可以将另一个数据中心的从节点提升为主节点,从而实现跨数据中心的灾难恢复。
-
扩展性: 通过添加更多的从节点,可以实现 Redis 集群的扩展,从而支持更大规模的数据存储和并发访问。
1.3 Redis 主从结构的不足
-
单点故障: Redis 主节点仍然是系统的单点故障,当主节点发生故障时,系统的写操作将无法执行,需要手动进行故障转移和恢复。
-
数据延迟: 由于主从结构采用异步复制机制,从节点的数据可能会有一定的延迟,导致从节点上的数据与主节点上的数据存在一定的不一致性。在一些应用场景中,数据的一致性和实时性是非常重要的,这种延迟可能会导致数据不一致的问题。
-
复制链路带宽限制: 在大规模的系统中,主节点与从节点之间的复制链路可能成为瓶颈,限制了数据复制的速度和性能。当主节点的写操作频率很高时,可能会导致复制链路的带宽不足,从而影响系统的性能。
-
配置和管理复杂性: 管理和维护一个包含多个主从节点的 Redis 集群是一项复杂的任务,需要考虑节点的部署、配置、监控和故障恢复等方面的问题。如果配置不当或管理不善,可能会导致系统出现性能问题或数据丢失等严重后果。
-
一致性保证: 在主从结构中,数据的一致性是由主节点负责保证的,但由于网络延迟、节点故障等原因,可能会导致数据不一致的情况发生。因此,开发者需要自行处理数据的一致性问题,确保系统能够正确处理数据不一致的情况。
1.4 主从环境搭建
1.4.0 docker启动两个redis容器
docker run --name my-redis 6379:6379 redls
docker run --name my-redis2 -d -p 6378:6379 redis
查看运行容器情况
docker ps -a
此时两个redis容器均已启动并运行。
1.4.1 从redis配置
进入my-redis2的容器内部,并运行redis-cli。
docker exec -it my-redis2 redis-cli
配置主节点
#slaveof 主服务器的IP 端口号
slaveof 192.168.157.157 6379
主节点已配置成功。
从节点配置成只读模式。
#从服务器只读(推荐配置)
config set slave-read-only yes
查看主从关系
info replication
从节点已经配置成功,并于主节点连接成功。
1.4.2 主从模式测试
我们进入主节点的cli
docker exec -it my-redis redis-cli
主要节点存一个数据
从节点读取
可以看到主从模式已经搭建完成,并完成了读写分离。
1.5 Redis主从总结
Redis 主从结构是一种常用的高可用性和扩展性解决方案,通过将数据复制到多个节点实现数据的备份和负载均衡。它能够提高系统的可用性、可靠性和性能,并支持灾难恢复和系统扩展。然而,主从结构仍然存在一些不足之处,如单点故障、数据延迟、复制链路带宽限制、配置和管理复杂性以及一致性保证等问题,需要开发者在设计和实现系统时进行充分考虑和处理。
2.0 Redis哨兵
2.1 Redis Sentinel 的基本原理和工作方式
Redis Sentinel 是一个独立的进程,通过运行在单独的服务器上来监控 Redis 主从结构中的多个节点。每个 Redis Sentinel 进程都会定期向 Redis 主节点和从节点发送 PING 命令,并根据节点的响应情况来判断节点的健康状态。当主节点发生故障或变得不可达时,Redis Sentinel 会通过选举算法自动选举一个新的主节点,并将从节点切换到新的主节点上,从而实现故障转移。
Redis Sentinel 还负责监控 Redis 主从结构中的其他节点状态,如从节点的连接状态、同步状态和复制延迟等,并在发现异常情况时采取相应的措施,如重新配置从节点、重启节点或重新连接节点等。此外,Redis Sentinel 还提供了命令行界面和 API 接口,用于管理和监控 Redis 主从结构的状态,并可以通过配置文件进行自定义设置和调整。
2.2 Redis Sentinel 的好处
-
高可用性: Redis Sentinel 可以监控和管理 Redis 主从结构中的多个节点,当主节点发生故障时,可以自动选举新的主节点,并将从节点切换到新的主节点上,从而实现故障转移,保证系统的高可用性。
-
自动化故障转移: Redis Sentinel 提供了自动化的故障转移功能,当主节点发生故障时,可以自动选举新的主节点,并将从节点切换到新的主节点上,无需人工干预,从而降低了系统的运维成本和管理复杂性。
-
监控和警报: Redis Sentinel 可以监控 Redis 主从结构中的节点状态,并在发现异常情况时发送警报通知管理员,帮助管理员及时发现和处理问题,保证系统的稳定性和可靠性。
-
动态配置: Redis Sentinel 提供了动态配置功能,管理员可以通过修改配置文件或使用命令行界面来添加、删除或修改监控的节点,从而灵活调整系统的配置和部署,满足不同场景的需求。
-
分布式部署: Redis Sentinel 支持分布式部署,可以将多个 Sentinel 进程部署在不同的服务器上,实现对 Redis 主从结构的多地监控和管理,提高了系统的可扩展性和容错能力。
2.3 Redis Sentinel 的不足
-
单点故障: Redis Sentinel 本身也是一个单点故障,当 Sentinel 进程发生故障时,可能会影响到整个系统的正常运行。为了解决这个问题,可以部署多个 Sentinel 进程,并使用哨兵集群来实现 Sentinel 的高可用性和容错能力。
-
配置复杂性: Redis Sentinel 的配置相对复杂,需要管理员熟悉 Redis 的相关知识和配置参数,才能正确配置和管理 Sentinel 进程。如果配置不当,可能会导致系统的性能问题或故障转移失败等严重后果。
-
故障恢复时间: 当主节点发生故障时,Redis Sentinel 需要一定的时间来完成故障转移和数据同步操作,期间可能会导致系统的一段时间内不可用或数据不一致。虽然 Redis Sentinel 能够尽快地完成故障转移,但仍然无法避免短暂的服务中断和数据延迟问题。
-
性能开销: Redis Sentinel 需要定期向监控的节点发送 PING 命令,并接收节点的响应,从而增加了系统的网络开销和负载。在大规模的系统中,可能会出现 Sentinel 进程的负载过高或网络带宽不足的情况,影响系统的性能和稳定性。
-
一致性保证: 在故障转移过程中,可能会出现数据不一致的情况,特别是在主节点发生故障后,从节点和新的主节点之间可能存在数据延迟或数据丢失的问题,需要开发者自行处理数据的一致性问题,确保系统能够正确处理数据不一致的情况。
2.4 Redis Sentinel环境搭建
2.4.0 Sentinel配置
sentinel1.conf
# bind 127.0.0.1
# 哨兵的端口号
# 因为各个哨兵节点会运行在单独的Docker容器中
# 所以无需担心端口重复使用
# 如果需要在单机
port 26379
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master 127.0.0.1 6379 2
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds local-master 30000
sentinel2.conf
port 26380
requirepass 123456
sentinel monitor local-master 192.168.157.157 6379 2
sentinel auth-pass local-master 123456
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds local-master 30000
sentinel3.conf
port 26381
requirepass 123
sentinel monitor master3 192.168.157.157 6381 2
sentinel auth-pass master3 123
sentinel down-after-milliseconds master3 30000
2.4.1 Redis配置
redismaster.confr
# 监听端口
port 6379
# 启动时不打印logo
# 这个不重要,想看logo就打开它
always-show-logo no
# 设定密码认证
requirepass 123
# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的键,会影响数据安全
# 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间
# 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃
rename-command KEYS ""
redisslave1.conf
# 监听端口
port 6380
always-show-logo no
requirepass 123
rename-command KEYS ""
slaveof 192.168.157.157 6379
# 设定连接主节点所使用的密码
masterauth "123"
redisslave2.conf
# 监听端口
port 6381
always-show-logo no
# 设定密码认证
requirepass 123
rename-command KEYS ""
slaveof 192.168.157.157 6379
# 设定连接主节点所使用的密码
masterauth "123"
2.4.2 YML文件
SENTINEL的DOCKER-COMPOSE.YML文件
version: '3'
services:
redis-sentinel-1:
image: redis
container_name: redis-sentinel-1
restart: always
# 为了规避Docker中端口映射可能带来的问题
# 这里选择使用host网络
network_mode: host
volumes:
- ./redis-sentinel-1.conf:/usr/local/etc/redis/redis-sentinel.conf
# 指定时区,保证容器内时间正确
environment:
TZ: "Asia/Shanghai"
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
redis-sentinel-2:
image: redis
container_name: redis-sentinel-2
restart: always
network_mode: host
volumes:
- ./redis-sentinel-2.conf:/usr/local/etc/redis/redis-sentinel.conf
environment:
TZ: "Asia/Shanghai"
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
redis-sentinel-3:
image: redis
container_name: redis-sentinel-3
restart: always
network_mode: host
volumes:
- ./redis-sentinel-3.conf:/usr/local/etc/redis/redis-sentinel.conf
environment:
TZ: "Asia/Shanghai"
command: ["redis-sentinel", "/usr/local/etc/redis/redis-sentinel.conf"]
version: '3'
services:
# 主节点的容器
redis-server-master:
image: redis
container_name: redismaster
restart: always
# 为了规避Docker中端口映射可能带来的问题
# 这里选择使用host网络
network_mode: host
# 指定时区,保证容器内时间正确
environment:
TZ: "Asia/Shanghai"
volumes:
# 映射配置文件和数据目录
- ./redismaster.conf:/usr/local/etc/redis/redis.conf
- ./data/redismaster:/data
command: ["redismaster", "/usr/local/etc/redis/redis.conf"]
# 从节点1的容器
redis-server-slave-1:
image: redis
container_name: redisslave1
restart: always
network_mode: host
depends_on:
- redismaster
environment:
TZ: "Asia/Shanghai"
volumes:
- ./redisslave1.conf:/usr/local/etc/redis/redis.conf
- ./data/redisslave-1:/data
command: ["redisslave1", "/usr/local/etc/redis/redis.conf"]
# 从节点2的容器
redis-server-slave-2:
image: redis
container_name: redisslave2
restart: always
network_mode: host
depends_on:
- redismaster
environment:
TZ: "Asia/Shanghai"
volumes:
- ./redisslave2.conf:/usr/local/etc/redis/redis.conf
- ./data/redisslave2:/data
command: ["redisslave2", "/usr/local/etc/redis/redis.conf"]
2.4.3 启动
运行yml文件
查看全部容器
redis哨兵模式已经搭建完成。
2.5 总结
Redis Sentinel 是一种可靠的高可用性解决方案,通过监控和管理 Redis 主从结构中的多个节点,实现了自动化的故障转移和系统的自愈能力。它能够提高系统的可用性、可靠性和稳定性,并支持动态配置、监控和警报、分布式部署等功能。然而,Redis Sentinel 也存在一些不足之处,如单点故障、配置复杂性、故障恢复时间、性能开销和一致性保证等问题,需要开发者在设计和实现系统时进行充分考虑和处理
3.0 Redis集群
3.1 背景介绍
Redis 最初是一个单机的内存数据库,虽然非常快速和高效,但是随着数据量的增长和负载的增加,单机 Redis 会面临性能瓶颈和可用性问题。为了解决这些问题,Redis 引入了集群模式。
3.2 工作原理
Redis 集群模式通过将数据分片存储在多个 Redis 节点上来实现高可用性和横向扩展。每个节点负责管理部分数据,而整个集群负责协调数据的分布和访问。
Redis 集群模式采用了一种称为哈希槽(hash slot)的机制来分配数据。Redis 将所有可能的数据分成 16384 个哈希槽,每个槽都有一个唯一的编号。当客户端发送一个命令时,Redis 集群根据命令中的键计算哈希值,并根据哈希值确定应该存储在哪个哈希槽中。然后集群将这个哈希槽映射到一个或多个节点上,每个节点负责管理一部分哈希槽。
3.3 部署方式
部署 Redis 集群通常需要多个 Redis 实例和一个集群管理器。Redis 集群管理器负责监视集群的状态,进行节点的发现和故障恢复,并处理客户端的请求路由。
常见的 Redis 集群管理器包括 Redis Sentinel 和 Redis Cluster。Redis Sentinel 是一个用于高可用性的监控系统,可以监视多个 Redis 实例并在主节点失效时自动进行故障转移。而 Redis Cluster 则是一个原生的分布式解决方案,提供自动分片和数据重新分布功能。
在部署 Redis 集群时,通常会有以下步骤:
-
安装和配置 Redis:在每个节点上安装和配置 Redis,确保它们能够相互通信。
-
配置集群管理器:如果使用 Redis Cluster,则需要配置集群管理器,指定初始节点和哈希槽分配方式。
-
启动集群:启动 Redis 节点和集群管理器,并确保它们能够正常工作。
-
添加节点:根据需要添加或移除 Redis 节点,集群管理器会自动进行数据重分配。
3.4 Redis集群的好处
Redis 集群模式具有以下优势:
-
高可用性:由于数据分布在多个节点上,即使某些节点发生故障,集群仍然能够继续工作。
-
横向扩展:通过添加更多的节点,可以线性地扩展 Redis 集群的性能和容量。
-
自动数据重分配:当添加或移除节点时,Redis 集群能够自动重新分配数据,保持各个节点的负载均衡。
-
无单点故障:Redis 集群不依赖于单个节点,因此不会因为某个节点的故障而导致整个集群不可用。
3.5 Redis集群的不足
尽管 Redis 集群模式提供了许多优势,但在实践中仍然可能遇到一些常见问题,包括:
-
数据一致性:由于数据分片存储在不同的节点上,可能会导致数据一致性的问题。可以通过使用复制(replication)和数据同步(synchronization)来解决这个问题。
-
网络分区:网络分区可能会导致集群中的节点无法相互通信,从而导致数据不一致或数据丢失。可以通过增加节点和使用 quorum 策略来减轻网络分区的影响。
-
负载均衡:在集群中均衡负载是一个复杂的问题,特别是当数据分布不均匀时。可以通过监控和调整哈希槽的分配来解决负载均衡问题。
-
故障恢复:当节点发生故障时,需要及时进行故障恢复,以确保集群的可用性。可以通过使用监控系统和自动故障转移功能来实现快速的故障恢复。
3.6 总结
Redis 集群模式是一种用于提高性能和可扩展性的解决方案,通过将数据分片存储在多个节点上来实现高可用性和横向扩展。虽然部署和管理 Redis 集群可能会有一些挑战,但通过合适的配置和监控系统,可以确保集群的稳定运行和高效工作。