面试题答案
一键面试Redis集群搭建
- 节点选择:选择多台服务器作为Redis集群节点,确保每台服务器有足够的资源(如内存、CPU)来承载预期的负载。
- 安装Redis:在每个选定的服务器上安装Redis软件,并配置相应的端口(如默认的6379)。
- 集群配置:修改Redis配置文件,启用集群模式(cluster-enabled yes),并设置集群配置文件路径(cluster-config-file nodes.conf)。
- 创建集群:使用Redis提供的
redis - trib.rb
工具(对于Redis 5.0及以上版本,也可使用redis - cli --cluster
)来创建集群。例如:redis - trib.rb create --replicas 1 IP1:PORT1 IP2:PORT2... IP6:PORT6
,其中--replicas 1
表示为每个主节点创建一个从节点。
数据分片策略
- 哈希槽:Redis集群采用哈希槽(Hash Slot)的方式进行数据分片。集群共有16384个哈希槽,每个键通过CRC16算法计算出哈希值,再对16384取模,得到的结果就是该键应该存储的哈希槽编号。
- 节点分配:集群中的每个主节点负责一部分哈希槽。例如,假设节点A负责0 - 5460号哈希槽,节点B负责5461 - 10922号哈希槽,节点C负责10923 - 16383号哈希槽。当客户端写入一个键值对时,根据上述哈希槽计算规则,就能确定应该将数据写入哪个节点。
与MySQL的交互流程
- 任务写入:
- 客户端将任务信息发送到应用服务器。
- 应用服务器根据键的哈希槽计算规则,将任务信息写入对应的Redis节点。
- 任务读取与处理:
- 应用服务器定时从Redis中读取一定数量的任务(例如,通过扫描哈希槽范围来获取任务)。
- 将读取到的任务批量组装成SQL语句,然后发送到MySQL进行批量处理。
- 在MySQL处理完成后,应用服务器可以选择从Redis中删除已处理的任务信息(如果需要保留历史记录,可以考虑先备份到其他存储,如分布式文件系统,再删除)。
节点故障处理
- 故障检测:Redis集群节点之间通过Gossip协议互相通信,当某个节点发现另一个节点长时间无响应(超过配置的
cluster-node-timeout
时间,默认15秒),会将其标记为疑似下线(PFAIL)。如果半数以上的主节点都标记某个节点为疑似下线,则该节点会被标记为下线(FAIL)。 - 故障转移:
- 当一个主节点故障时,它的从节点会发起选举,尝试成为新的主节点。选举过程中,从节点向其他主节点发送投票请求,获得半数以上主节点投票的从节点将成为新的主节点。
- 新主节点接管故障主节点负责的哈希槽,继续提供服务。
- 数据恢复与一致性处理:
- 数据恢复:在故障转移过程中,从节点复制了主节点的大部分数据,但可能存在部分未同步的数据。Redis集群采用异步复制的方式,新主节点会继续从原主节点的复制积压缓冲区(repl_backlog)中获取未同步的数据进行同步。
- 一致性处理:对于正在处理任务过程中发生节点故障的情况,应用服务器需要有重试机制。例如,当应用服务器发现从Redis读取任务失败(因为节点故障),可以等待一段时间(如故障转移完成后)重新读取任务。在MySQL批量处理方面,应用服务器可以在写入MySQL之前,先将任务备份到本地(如文件系统),如果写入MySQL失败,可以根据备份重试。同时,为了保证数据一致性,在故障恢复后,可以对Redis和MySQL中的数据进行比对和修复。例如,通过记录任务处理的日志,对比Redis中未处理任务和MySQL中已处理任务,确保没有遗漏或重复处理。