面试官:聊下Redis的分片集群,先聊 Redis Cluster好咯?
面试官:Redis Cluser是Redis 3.x才有的官方集群方案,这块你了解多少?
候选者:嗯,要不还是从基础讲起呗?
候选者:在前面聊Redis的时候,提到的Redis都是「单实例」存储所有的数据。
候选者:1. 主从模式下实现读写分离的架构,可以让多个从服务器承载「读流量」,但面对「写流量」时,始终是只有主服务器在抗。
候选者:2. 「纵向扩展」升级Redis服务器硬件能力,但升级至一定程度下,就不划算了。
候选者:纵向扩展意味着「大内存」,Redis持久化时的”成本”会加大(Redis做RDB持久化,是全量的,fork子进程时有可能由于使用内存过大,导致主线程阻塞时间过长)
候选者:所以,「单实例」是有瓶颈的
候选者:「纵向扩展」不行,就「横向扩展」呗。
候选者:用多个Redis实例来组成一个集群,按照一定的规则把数据「分发」到不同的Redis实例上。当集群所有的Redis实例的数据加起来,那这份数据就是全的
候选者:其实就是「分布式」的概念(:只不过,在Redis里,好像叫「分片集群」的人比较多?
候选者:从前面就得知了,要「分布式存储」,就肯定避免不了对数据进行「分发」(也是路由的意思)
候选者:从Redis Cluster讲起吧,它的「路由」是做在客户端的(SDK已经集成了路由转发的功能)
候选者:Redis Cluster对数据的分发的逻辑中,涉及到「哈希槽」(Hash Solt)的概念
候选者:Redis Cluster默认一个集群有16384个哈希槽,这些哈希槽会分配到不同的Redis实例中