如果使用 Redis Cluster 实现高可用?
如果使用 Redis Cluster 实现高可用?
详细,可以看看如下:
因为 Redis Sentinel 的内容很多,艿艿这里就不详细哔哔了。实际场景下,对于开发的面试,我们也不会特别问,毕竟更偏运维的内容。
- 《Redis 官方文档 —— Redis Cluster 集群》
- 《Redis 开发与运维》 的「10. 集群」章节,更加详细完整。
🦅 说说 Redis 哈希槽的概念?
Redis Cluster 没有使用一致性 hash ,而是引入了哈希槽的概念。
Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。
因为最大是 16384 个哈希槽,所以考虑 Redis 集群中的每个节点都能分配到一个哈希槽,所以最多支持 16384 个 Redis 节点。
为什么是 16384 呢?主要考虑集群内的网络带宽,而 16384 刚好是 2K 字节大小。
🦅 Redis Cluster 的主从复制模型是怎样的?
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有 N-1 个复制节点。
所以,Redis Cluster 可以说是 Redis Sentinel 带分片的加强版。也可以说:
- Redis Sentinel 着眼于高可用,在 master 宕机时会自动将 slave 提升为 master ,继续提供服务。
- Redis Cluster 着眼于扩展性,在单个 Redis 内存不足时,使用 Cluster 进行分片存储。
🦅 Redis Cluster 方案什么情况下会导致整个集群不可用?
有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 宕机了,那么整个集群就会以为缺少 5501-11000 这个范围的槽而不可用。当然,这种情况也可以配置 cluster-require-full-coverage=no ,整个集群无需所有槽位覆盖。
🦅 Redis Cluster 会有写操作丢失吗?为什么?
Redis 并不能保证数据的强一致性,而是【异步复制】,这意味这在实际中集群在特定的条件下可能会丢失写操作。
艿艿:一定一定一定要注意,无论对于 Redis Sentinel 还是 Redis Cluster 方案,都是通过主从复制,所以在数据的复制方面,都存在相同的情况。
🦅 Redis 集群如何选择数据库?
Redis 集群目前无法做数据库选择,默认在 0 数据库。
🦅 请说说生产环境中的 Redis 是怎么部署的?
重点问题,仔细理解。
- Redis Cluster ,10 台机器,5 台机器部署了 Redis 主实例,另外 5 台机器部署了 Redis 的从实例,每个主实例挂了一个从实例,5 个节点对外提供读写服务,每个节点的读写高峰 qps 可能可以达到每秒 5 万,5 台机器最多是 25 万读写请求每秒。
- 机器是什么配置?32G 内存 + 8 核 CPU + 1T 磁盘,但是分配给 Redis 进程的是 10G 内存,一般线上生产环境,Redis 的内存尽量不要超过 10G,超过 10G 可能会有问题。那么,5 台机器对外提供读写,一共有 50G 内存。
- 因为每个主实例都挂了一个从实例,所以是高可用的,任何一个主实例宕机,都会自动故障迁移,Redis 从实例会自动变成主实例继续提供读写服务。
- 你往内存里写的是什么数据?每条数据的大小是多少?商品数据,每条数据是 10kb 。100 条数据是 1mb ,10 万条数据是 1G 。常驻内存的是 200 万条商品数据,占用内存是 20G ,仅仅不到总内存的 50% 。目前高峰期每秒就是 3500 左右的请求量。
一般来说,当公司体量大了之后,建议是一个业务线独占一个或多个 Redis Cluster 集群,实现好业务线与业务线之间的隔离。
其实大型的公司,会有基础架构的 Team 负责缓存集群的运维。