Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(上)

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis源码、面试指南(5)多机数据库、复制、哨兵、集群

五、多机数据库

这个部分主要介绍跟多级数据库有关的复制、集群、sentinel

复制功能

源码参见:replication.c

在Redis中可以使用SLAVEOF或者设置slaveof选项,使得一个服务器去复制另一个服务器。这种情形就是我们熟知的主从结构,一般用作读写分离,主服务器是负责读/写,从服务器负责读见下图

新旧版本的复制对比

在Redis2.8版本之后的复制功能效率更高,安全系数更好,新旧版本复制功能对比如下(请点击或下载查看大图):


其中,旧版本的同步操作如下图所示:

注:在主服务器进行BGSAVE和发送RDB文件的时候,会将所有写命令写入发送缓冲区,在传输完毕之后将所有写命令发送给从服务器。

一个展示命令传播的示例如下图所示:

新版复制功能的部分同步如下图所示:

新版复制功能调用流程图如下:


进一步解释新版复制功能实现部分重同步的原理:

·服务器ID:当从服务器对某一服务器进行了同步操作时,该ID被设置为主服务器的ID。这是为了在从服务器断线重连主服务器时,判断上次所连接的是否是原来的服务器!

·复制偏移量:类似于TCP的SEQ,主从服务器都维护了一个复制偏移量offset:当主服务器给从服务器发送**N个字节(而不是命令)**时,该offset+N;当从服务器接收N个字节时,该Offset+N;这是实现部分同步的关键:让主服务器知道从服务器还差哪些命令没有获取

·复制积压缓冲区:是主服务器端的一个固定长度(可调整,默认1M)的先进先出队列。这也是部分同步的关键:在该队列中,维护了复制偏移量offset与每一条写命令的对应关系,见下图。

如果从服务器需要的复制命令在该队列中,那么执行部分重同步即可;如果不在···那就只能完全重同步了!

复制的全过程

·设置主服务器的地址端口

·建立套接字连接

·发送PING命令(检查主服务器状态)


·进行身份验证(若设置了masterauth)

·发送端口信息,即从服务器将自身端口发送给主服务器(主要是为了打印信息)

·同步操作(在这个时候两者互为客户端,才可以进行写命令的传输)

·命令传播

在该阶段,从服务器会默认1s的时间给主服务器发送命令 REPLCONF ACK ,这是一种心跳检测,主要是为了检查网络连接或是否有命令丢失。

哨兵Sentinel

源码参见:sentinel.c

介绍

sentinal,哨兵是Redis多机架构中高可用性非常重要的一个组件,主要功能如下:

(1)集群监控,负责监控redis master和slave进程是否正常工作(心跳检测);

(2)消息通知,如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员;

(3)故障转移如果master node挂掉了,会自动转移到slave node上;

(4)配置中心,如果故障转移发生了,通知client客户端新的master地址;

哨兵本身也是分布式的,作为一个哨兵集群去运行,互相协同工作

(1)故障转移时,判断一个master node是宕机了,需要**大部分(超过一半)**的哨兵都同意才行,涉及到了分布式选举的问题;

(2)即使部分哨兵节点挂掉了,哨兵集群还是能正常工作的,因为如果一个作为高可用机制重要组成部分的故障转移系统本身是单点的,那就很不稳定了;

下面几幅图展示sentinel系统是如何实现监视Redis服务器的:

初始状态如下:

主服务器下线:

执行故障转移

原主服务器上线并降级



 Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(下):https://developer.aliyun.com/article/1508249

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6天前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
15天前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
43 6
|
1天前
|
SQL 存储 NoSQL
Redis6入门到实战------ 一、NoSQL数据库简介
这篇文章是关于NoSQL数据库的简介,讨论了技术发展、NoSQL数据库的概念、适用场景、不适用场景,以及常见的非关系型数据库。文章还提到了Web1.0到Web2.0时代的技术演进,以及解决CPU、内存和IO压力的方法,并对比了行式存储和列式存储数据库的特点。
Redis6入门到实战------ 一、NoSQL数据库简介
|
8天前
|
存储 消息中间件 NoSQL
Redis总结篇(附Redis常见面试题)
本文是对Redis系列文章的总结,涵盖了Redis的数据结构、主从复制、哨兵模式、Cluster分片方案等关键知识点,并附带了一些常见的Redis面试题。
Redis总结篇(附Redis常见面试题)
|
5天前
|
JSON NoSQL Redis
Redis 作为向量数据库快速入门指南
Redis 作为向量数据库快速入门指南
11 1
|
5天前
|
关系型数据库 MySQL Serverless
在部署云数据库PolarDB MySQL版 Serverless集群的过程中问题点
在部署PolarDB MySQL Serverless过程中,常见问题包括配置误解、网络配置错误、资源未及时释放及压测不熟练。建议深入理解配置项,确保合理设置伸缩策略;明确业务需求,使PolarDB与现有服务同处一地域与VPC;利用提醒功能管理资源生命周期;按官方指南执行压测。新用户面临的学习曲线、资源管理自动化不足及成本控制难题,可通过增强文档友好性、引入智能成本管理与用户界面优化来改善。
25 1
|
15天前
|
NoSQL Redis
redis 6源码解析之 ziplist
redis 6源码解析之 ziplist
16 5
|
17天前
面试官: 请你手写一份 Call()源码,看完此篇不用担心!
面试官: 请你手写一份 Call()源码,看完此篇不用担心!
|
5天前
|
存储 缓存 NoSQL
基于SpringBoot+Redis解决缓存与数据库一致性、缓存穿透、缓存雪崩、缓存击穿问题
这篇文章讨论了在使用SpringBoot和Redis时如何解决缓存与数据库一致性问题、缓存穿透、缓存雪崩和缓存击穿问题,并提供了相应的解决策略和示例代码。
18 0