问题描述

Azure Redis作为微软云提供的一种PaaS服务,由于PaaS的特性,服务端的安装和维护、修补、升级等操作均由平台放负责。虽然最终用户只需要关注当前服务的使用,但是后台的升级和补丁行为,总会对使用Redis服务产生影响。如:Azure Redis的“故障转移 Failover”就是专为此类行为设计的功能。

故障转移的说明

当Redis的副本节点将其自身提升为主节点,且旧主节点关闭现有连接时,将发生故障转移。 主节点重新启动后,它将自身降级为副本节点。 故障转移可以是计划性的,也可以是非计划的。

计划性故障转移发生在系统更新(例如 Redis 修补或 OS 升级)和管理操作(例如缩放和重启)过程中。 由于节点会提前收到更新通知,因此它们可以协作交换角色,并在更改后快速更新负载均衡器。 计划性故障转移通常可在 1 秒内完成。

发生非计划性故障转移的可能原因是硬件故障、网络故障或主节点的其他意外中断。 副本节点可将自身提升为主节点,但该过程需要更长时间。 副本节点必须先检测到其主节点不可用,然后才能启动故障转移过程。 副本节点还必须验证此非计划性故障不是暂时性的或局部性的,以避免不必要的故障转移。 检测时出现的这种延迟意味着非计划性故障转移通常要在 10 到 15 秒内完成。

所以在Redis发生故障,升级时,在前端使用Redis时,虽然受影响的时间非常的短,但是还是会有所影响。所以当前端Redis收到异常消息时候,如何快速的定位是否Redis由升级行为呢?

解决办法

使用Redis的“事件(Events)”功能页面,配置Event Grid,发送补丁完成事件到接收端,如Webhook, Azure Storage Queue, Function等,方式非常的多。

当前,Redis Events支持四种事件:

  1. ExportRDBCompleted :导出缓存数据时触发
  2. ImportRDBCompleted :导入缓存数据时触发
  3. PatchingCompleted :修补完成时触发
  4. ScalingCompleted :缩放完成后触发

使用PatchingCompleted事件,则可以在更新,升级完成后,收到来自Redis服务端的消息。此外,也需要针对缓存设置“计划更新”。 告知Redis管理服务在指定的每周时段应用 Redis 运行时修补程序。 通常,这些时段是客户端应用程序流量较低的时段,目的是避免潜在的事件。

操作步骤

因本文在测时并无法得知何时有升级事件发生,所以以下操作步骤中,以ScallingCompleted事件做为结果演示。并且在演示中使用的存储队列方式来接收事件消息,这里也可以使用其他方式,此处只作为一个演示。

一:创建Redis的Event Grid订阅,并配置存储队列作为接收端

  • 需要提前准备好在配置中需要的 存储账号 和 队列 信息,如示例中使用的为:backuptest01 和redisupdatequeue01
  • 自定义订阅事件的名称
  • 选择订阅Redis的事件,如这里全部选择了Redis的四个事件
  • 选择终结点类型。

二:触发Scalling 操作。在存储队列中查看结果

补充说明

一:在Redis发生故障转移,对客户端的影响和如何减少影响?

Redis客户端遇到的错误数目取决于故障转移时该连接上挂起的操作数目。  在连接中断时,许多客户端库可能会引发不同类型的错误,包括超时异常、连接异常或套接字异常。  例如,在发生故障转移时发送了请求但未收到响应的操作可能会收到超时异常。 对关闭的连接对象发出的新请求将收到连接异常,直到重新连接成功为止。

由于故障转移不可完全避免,因此,客户端应用程序需要使用重试机制,大多数的Redis客户端都支持重试机制。在 Microsoft.NET 和其他面向对象的语言中,可以使用 Lazy<T> 模式来重新创建连接,而无需重启应用程序。

    private static Lazy<ConnectionMultiplexer> CreateMultiplexer()
{
return new Lazy<ConnectionMultiplexer>(() => ConnectionMultiplexer.Connect(connectionString));
} private static void CloseMultiplexer(Lazy<ConnectionMultiplexer> oldMultiplexer)
{
if (oldMultiplexer != null)
{
try
{
oldMultiplexer.Value.Close();
}
catch (Exception)
{
// Example error condition: if accessing old.Value causes a connection attempt and that fails.
}
}
}

更多消息,请查看Redis故障转移和修补文档:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-failover

二:如何设置Redis的计划更新功能?

使用“计划更新”边栏选项卡可以为缓存实例指定维护时段。 借助维护时段,可以控制在一周中的哪一天和哪个时间点更新托管缓存的 VM。 Azure Cache for Redis 将尽最大努力在定义的指定时间范围内启动和完成 Redis 服务器软件的更新。详见:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-administration#schedule-updates

三:Redis Event Grid事件中消息体内容格式

PatchingCompleted 事件

[{
"id":"9b87886d-21a5-4af5-8e3e-10c4b8dac73b",
"eventType":"Microsoft.Cache.PatchingCompleted",
"topic":"/subscriptions/{subscription_id}/resourceGroups/{resource_group_name}/providers/Microsoft.Cache/Redis/{cache_name}",
"data":{
"name":"PatchingCompleted",
"timestamp":"2020-12-09T21:50:19.9995668+00:00",
"status":"Succeeded"},
"subject":"PatchingCompleted",
"dataversion":"1.0",
"metadataVersion":"1",
"eventTime":"2020-12-09T21:50:19.9995668+00:00"}]

ScalingCompleted 事件

[{
"id":"9b87886d-21a5-4af5-8e3e-10c4b8dac73b",
"eventType":"Microsoft.Cache.ScalingCompleted",
"topic":"/subscriptions/{subscription_id}/resourceGroups/{resource_group_name}/providers/Microsoft.Cache/Redis/{cache_name}",
"data":{
"name":"ScalingCompleted",
"timestamp":"2020-12-09T21:50:19.9995668+00:00",
"status":"Succeeded"},
"subject":"ScalingCompleted",
"dataversion":"1.0",
"metadataVersion":"1",
"eventTime":"2020-12-09T21:50:19.9995668+00:00"}]

跟多全面的事件消息体,请参考 Azure Redis事件网格源: https://docs.microsoft.com/zh-cn/azure/event-grid/event-schema-azure-cache#the-contents-of-an-event-response

参考资料

Redis 的故障转移和修补:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-failover

Redis计划更新:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-administration#schedule-updates

什么是事件网格(Event Grid):https://docs.microsoft.com/zh-cn/azure/event-grid/overview?WT.mc_id=Portal-HubsExtension

Redis 事件网格源:https://docs.microsoft.com/zh-cn/azure/event-grid/event-schema-azure-cache#the-contents-of-an-event-response

【Azure Redis 缓存】如何得知Azure Redis服务有更新行为?的更多相关文章

  1. 【Azure Redis 缓存】由Azure Redis是否可以自定义密码而引申出Azure PaaS的Redis服务是否可以和自建的Redis进行主从配置呢?

    问题描述 在自建的Redis服务中,可以通过 config set requirepass <Password> 设置Redis的登录密码,然后使用auth 命令输入密码.操作命令如下: ...

  2. 【Redis缓存机制】1.Redis介绍和使用场景

    (1)持久化数据库的缺点平常我们使用的关系型数据库有Mysql.Oracle以及SqlServer等,在开发的过程中,数据通常都是通过Web提供的数据库驱动来链接数据库进行增删改查. 那么,我们日常使 ...

  3. 【Azure Redis 缓存】Azure Redis 服务不支持指令CONFIG

    问题描述 在Azure Redis的门户页面中,通过Redis Console连接到Redis后,想通过CONFIG命令来配置Redis,但是系统提示CONFIG命令不能用. 错误消息为:(error ...

  4. 【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)

    问题描述 Azure Redis和所有的Redis服务一样,可以让你保留存储在Redis中的数据.以防万一在Redis服务器出现故障的时候能尽可能小的减少数据的损失.在Azure Redis服务中,默 ...

  5. 【Azure Redis 缓存】Azure Redis功能性讨论

    关于使用Azure Redis服务在以下九大方面的功能性的解说: 高可用 备份可靠性 配置自动化 部署多样性 快速回档功能 数据扩容 SLA稳定性 数据安全性 监控系统 一:高可用 Azure Cac ...

  6. 【Azure Redis 缓存】Azure Redis 功能性讨论二

    继承上一次讨论了Azure Redis的可用性,可靠性,稳定性,安全性,监控方面的九大功能点.详情可回顾文章:[Azure Redis 缓存]Azure Redis功能性讨论 这次我们继续讨论Azur ...

  7. 【Azure Redis 缓存 Azure Cache For Redis】Azure Redis由低级别(C)升级到高级别(P)的步骤和注意事项, 及对用户现有应用的潜在影响,是否需要停机时间窗口,以及这个时间窗口需要多少的预估问题

    问题描述 由于Azure Redis的性能在不同级别表现不同,当需要升级/缩放Redis的时候,从使用者的角度,需要知道有那些步骤? 注意事项? 潜在影响?停机事件窗口? 升级预估时间? 解决方案 从 ...

  8. asp.net性能优化之使用Redis缓存(入门)

    1:使用Redis缓存的优化思路 redis的使用场景很多,仅说下本人所用的一个场景: 1.1对于大量的数据读取,为了缓解数据库的压力将一些不经常变化的而又读取频繁的数据存入redis缓存 大致思路如 ...

  9. linux中的redis缓存服务器

    Linux中的Redis缓存服务器 一.Redis基础部分: 1.redis介绍与安装比mysql快10倍以上 *****************redis适用场合**************** 1 ...

  10. ThinkPHP5配置redis缓存

    thinkphp采用cache类提供缓存功能支持,采用驱动方式,在使用缓存之前需要进行初始化操作.支持的缓存类型包括file.memcache.wincache.sqlite.redis和xcache ...

随机推荐

  1. Spring--AOP、通知的执行顺序

    AOP执行顺序 如果我们在同一个方法自定义多个AOP,我们如何指定他们的执行顺序呢? 可以通过指定order,order越小越是最先执行. 配置AOP执行顺序的三种方式: 通过实现Ordered接口 ...

  2. Java 中泛型的实现原理

    泛型是 Java 开发中常用的技术,了解泛型的几种形式和实现泛型的基本原理,有助于写出更优质的代码.本文总结了 Java 泛型的三种形式以及泛型实现原理. 泛型 泛型的本质是对类型进行参数化,在代码逻 ...

  3. 支持向量机(SVM)原理详解

    SVM简介 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机:SVM还包括核技巧, ...

  4. 深入理解MySQL索引(上)

    简单来说,索引的出现就是为了提高数据查询的效率,就像字典的目录一样.如果你想快速找一个不认识的字,在不借助目录的情况下,那我估计你的找好长时间.索引其实就相当于目录. 几种常见的索引模型 索引的出现是 ...

  5. 【排序基础】1、选择排序法 - Selection Sort

    文章目录 选择排序法 - Selection Sort 为什么要学习O(n^2)的排序算法? 选择排序算法思想 操作:选择排序代码实现 选择排序法 - Selection Sort 简单记录-bobo ...

  6. gears-绕过rbash

    0x00 信息收集 0x01 smb攻击 crunch 生成密码的一个软件 @%%,这个是给的密码参数. crunch 4 4 -t @%%, -o words 最小4位,最长 4位 fcrackzi ...

  7. js reduce数组转对象

    借鉴:https://juejin.im/post/5cfcaa7ae51d45109b01b161#comment这位大佬的处理方法很妙,但是我一眼看过去没有明白,细细琢磨了下,终于明白了 1 co ...

  8. 亲测可用!免费下载QQ音乐大部分资源!

    优化后亲测可用!免费下载QQ音乐大部分资源 通知 时间问题 博客园这边暂时停更要下载的去GitHub或者90盘 GitHub项目地址 https://github.com/TotoWang-hhh/m ...

  9. synchronized的jvm源码分析聊锁的意义

    上篇写完了ReentrantLock源码实现,从我们的角度分析设计锁,在对比大神的实现,顺道拍了一波道哥的马屁,虽然他看不到,哈哈.这一篇我们来聊一聊synchronized的源码实现,并对比reen ...

  10. Bitter.Core系列三:Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 之 示例模型创建

    在具体数据库操作之前,我们先准备好四张表以及相对应数据库操作模型: 学生表,年级表,班级表,学分表.示例数据库表,如下代码(MSSQL 为例) --学生表 CREATE TABLE t_student ...