问题描述

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. 原生redis命令

    一. redis-cli 连接 redis 进入redis安装目录 cd /usr/local/bin 进入redis客户端 ./redis-cli -p 6379 -h 用于指定 ip -p 用于指 ...

  2. Linux设置系统时区

    https://www.xlsys.cn/1741.html 如果你的 Linux 系统时区配置不正确,必需要手动调整到正确的当地时区.NTP 对时间的同步处理只计算当地时间与 UTC 时间的偏移量, ...

  3. ForwardProcess

    共享式网络中,发送的报文所有设备都可以收到 0.0.0.0/0 缺省路由 可以到达任意网络 From WizNote

  4. 如果你的 HTML 里全是 div,那就要小心了

    做前端开发的同学都知道,一个网页的基本组成部分是 HTML,JavaScript 和 CSS.开发人员通常更关注 JavaScript 和 CSS ,实践着各种语言规范和设计模式.对于 HTML 的关 ...

  5. JavaCV更新到1.5.x版本后的依赖问题说明以及如何精简依赖包大小

    javaCV全系列文章汇总整理 javacv教程文档手册开发指南汇总篇 前言 JavaCV更新到1.5.x版本,依赖包也迎来了很大变化,体积也变大了不少.很多小伙伴们反馈,之前很多1.3.x和1.4. ...

  6. halcon案例学习之cbm_label_simple

    *cbm_label_simple 程序说明:*这个示例程序展示了如何使用基于组件的匹配来定位复合对象.在这种情况下,应该在图像中找到一个标签,用户既不知道其中的组件,也不知道它们之间的关系.因此,创 ...

  7. python作业完成简单的文件操作

    题目 请创建以学号命名的目录,在该目录中创建名称为file1.txt的文件,并将自己的个人信息(序号.姓名以及班级)等写入该文件:然后并读取文件中的内容到屏幕上:接着重新命名该文件为file2.txt ...

  8. self-taught CS resouce recommendation

    https://github.com/keithnull/TeachYourselfCS-CN/blob/master/TeachYourselfCS-CN.md#%E8%AE%A1%E7%AE%97 ...

  9. 开篇:免费开源的趣讲 ZooKeeper 教程(连载)

    本文作者:HelloGitHub-老荀 一.起因 良好的开端,是成功的一半. 我是作者老荀,一个普通的程序员,没有 985 和 211 的背景,也从没在大厂工作过.仅仅是喜欢研究技术,一直想做一个讲解 ...

  10. 3、wait和waitpid

    1. 函数介绍 wait函数:调用该函数使进程阻塞,直到任意一个子进程结束,或者该进程接收到了一个信号为止,如果该进程没有子进程或该进程的子进程已经结束,wait函数立即返回. waitpid函数:与 ...