Redis重新连接弹性

背景

这是一个微服务世界。这些应用程序或微服务需要临时存储数据,并且频繁和超快速访问,以避免使用类似Redis的内存数据库进行磁盘IO操作。这些应用程序具有多个内存数据库集群,可以处理大量流量并避免请求失败。要快速访问此数据,应用程序需要准备好预先配置的已建立的池连接,以便从应用程序进行服务。图片标题

问题陈述

为应用而构建的应用程序在应用程序或基础架构故障时具有备份选项。存在于不同服务器上的不同数据中心的内存数据库群集允许在数据中心或服务器问题的情况下进行备份连接。

使用内存数据库的多区域弹性应用程序应该能够在断开连接时重新连接群集,并且如果主群集不可用则连接到备份群集以避免请求失败。

真正的区域无关解决方案将动态选择内存数据库集群以持久化或检索数据,即使在主集群连接被重新水化时出现错误,也可使事务无缝连接到客户端。这种动态再水化是一个问题,同时依赖于现代自动依赖注入和自动布线对象操纵技术。

一旦传入请求到达应用程序,即使该区域中的底层基础结构出现故障,也应正确处理该请求。

当主群集出现问题时,需要从另一个备份内存数据库群集动态保留或提取服务传入请求。同时,对于后续请求,与故障群集的连接将从其连接池中重新水合并准备服务,而不依赖于备份群集。

解决方案摘要

解决上述问题的一个简单方法是重新创建已针对具有连接问题的内存数据库进行池化的所有连接。

使用新建立的连接池,并确保对于其余事务,将从新缓存的池集中使用新连接。关键技术方面是在运行时动态管理这些池。

独生子

具有自定义扩展框架的服务,使用单例设计模式仅将对象实例化为一个实例。对于内存数据库,该框架允许应用程序实例化一个模板(如Spring RestTemplate)来处理所有数据库事务。实现连接工厂和池配置的基础模板建立连接以执行事务。当此模板无法用于建立连接时,它将在从工厂重新连接连接池时自我修复。该框架将丢弃旧模板并创建一个新模板。此新单个模板将用于为所有传入请求提供服务。

活动和备份连接

创建/使用多个内存数据库模板的服务:一个用于连接到主群集,另一个用于连接到备份群集。主群集由运行应用程序的服务器的“区域”确定。区域可以表示地理位置和/或数据中心。在多个区域中运行的相同应用程序将使用模板配置机制连接到相应的数据库。

跨区域弹性

每个“跨区域”弹性的服务意味着应用程序部署在多个区域中的多个服务器上,并且底层内存数据库集群基础结构类似地部署在不同区域的不同服务器上。

扫描二维码关注公众号,回复: 5705137 查看本文章

如果整个“区域”遇到问题,则传入的客户端请求将由针对另一个区域中自动复制的应用程序运行。但是,一旦请求到达应用程序,如果底层数据库集群遇到问题,该服务会动态地将操作转发到备份集群,并应成功完成请求。同时,模板将开始丢弃所有预先创建的连接的过程,并将开始重新创建根据提供的池配置配置的新连接集,并将为后续操作建立新模板以使失败区域成功,直到它很成功。BV

连接补液

必须删除内存数据库集群之间断开的连接,因为如果不采取任何操作,这是一个不可恢复的错误。当作为单独连接实现时,该框架保持断开的连接,并且不容易支持删除连接。如果先前已破坏模板提供的连接,则传入请求将失败。服务必须通过从池中删除所有连接并重新创建新的连接来支持运行时连接重新补充。当连接断开时,应用程序将重新创建模板和连接,以便为下一个事务提供与内存数据库集群的干净重新连接。

运行时和性能

每个服务都应确定启动时的主要和备份区域,以分摊对哪个数据库集群执行默认操作的动态决策。当操作无法在活动的所选群集上执行时,该服务应重新创建基础模板和连接,并将操作转发到备份群集。该实现允许数据库集群的快速,动态重新连接多区域弹性。由于新创建的模板是单例并在运行时获取,因此除了最初失败的模板之外,可以避免性能影响。

详细说明

概观

使用现有技术连接到内存数据库非常简单。我们在90%的应用程序中通常会遗漏的问题是数据库被重新水化或暂时丢失网络连接时。

应用程序将具有一组汇集的预配置连接,这些连接在工厂根据配置的间隔具有可执行的逐出算法进行缓存和生成,以验证连接的有效性。下图说明了连接到多个基于区域的内存数据库的多个模板。每个模板都配置了一个连接工厂,这些连接已创建并分配给要保留的池。然后,当请求执行事务时,工厂将根据需要从池中检索连接。

丢失连接

下图表示由于DB重新合并,数据库重新启动,数据库网络连接问题,防火墙问题或由于我们可以想象的任何其他原因导致连接丢失的时间。由于连接丢失了套接字连接,整个连接池现在变得无效,导致在请求的事务上发生连接拒绝错误消息。

无效的连接池

即使在数据库恢复之后,整个连接池仍然无效,因为它们将在失去跟踪数据库同时发生的情况的轨道时开始显示损坏的管道消息以重新建立连接。

再水化连接

池中的所有连接都需要重新水合才能执行成功的事务。这需要工厂创建新的连接以通过池保存相应的模板,这些模板也需要重新创建。当检测到连接失败时,系统现在可以智能地构建,以重新创建连接到相应的基于区域的数据库的所有模板。

连接将保存在线程上下文中,不会关闭或返回池以便快速执行下一个事务。这些称为从池到线程上下文的缓存连接。当随机连接无法执行事务时,很难找到用于运行事务的连接以及连接池中存在多少这样的断开连接。相反,重新创建连接池所需的时间比通过每个连接关闭要少。此外,关闭这些连接最终会导致运行时池耗尽状态,或者没有可用于即将执行的事务的连接。

重新启动内存数据库服务器后,线程中连接的保持操作将开始丢失管道错误。为避免这种情况,连接的再水化是最佳解决方案,如下所示。

猜你喜欢

转载自blog.csdn.net/Tybyqi/article/details/88690950