AeronCluster学习笔记-AeronCluster与数据库

共 1624字,需浏览 4分钟

 ·

2022-11-18 19:45

本文将介绍AeronCluster与数据库之间的关系与协作方式。

首先我们要强调,数据库可以是 Aeron Cluster 的有力补充,但数据库其实是可选的。每个 Aeron Cluster 在落地投产之前都需要回答以下问题:

  • cluster要对系统进行记录吗(数据要落盘吗)?
  • 集群将如何进行启动?
  • 你想为关键的集群事件应用哪些可靠性选项?

我们分别对这几个问题进行说明。

记录型系统(System of Record)

一般来说,如果Cluster进程不是记录型系统,那么数据库是可选的可能性更大。

对于记录型系统而言,必要的事件可以通过网关进程发送到记录系统。

请记住:

  • 始终考虑数据库对特定使用场景的影响。如果你有监控或其他原因需要依赖数据库,那么就请使用数据库。不要直接跳过数据库,因为它在理论上是可供选择使用的(按需架构)。
  • 对系统的状态打快照,并对其进行标记(一般都是基于版本号,或者时间戳), 这可能是一项复杂的任务,特别是考虑到项目生命周期中涉及到数据结构的变化。仔细考虑如何更好地使用版本控制进行快照。

引导Cluster启动(Bootstrapping the Cluster)

引导Cluster启动,也就是加载Cluster运行时所需的所有数据的启动阶段。这个过程通常可以基于两种方式完成:

  • 通过命令和快照引导Cluster启动。在这种情况下,集群管理客户端会被授予将引用和其他操作数据写入集群的权限。而一旦加载了必要的数据,集群就能够完全从快照中启动。
  • 通过数据库引导启动,可选择是否使用快照。在这个场景中,一些外部进程和Cluster之间会约定通信协议,该协议会在集群启动时被引导。外部进程从配置文件/数据库中读取数据。随着数据发生变化,此过程可以向集群提交必要的命令。

在集群启动时,开发者可以选择从快照启动,或清除任何快照——这取决于 SLA 和集群重启频率。

(扯了这么多,其实就是说,在有状态的cluster启动阶段,是可以从数据库中加载必要的数据到内存中,以还原之前状态。)

集群事件和可靠性(Cluster Events & Reliability)

如果你正在将关键的Cluster事件写入数据库,你需要考虑所需的可靠性级别(事务隔离级别等),以及你将希望如何处理恢复场景。

这里举一个场景:

  • 集群、数据库网关、数据库均运行正常
  • 交易 1、2 和 3 下单完成,并由数据库网关写入数据库
  • 此时数据库服务器出现故障
  • 交易 4、5 和 6 下单成功。

简单分析一下,1,2,3请求在内存中成功,但是写db失败,只要重启,数据就会丢失。

那现在怎么办?目前来看,至少有两个选择:

  • 在集群内引入重试机制。思考一下,如果将重试放在数据库网关内,如果失败会怎样(丢数据啊)?
  • 将关键事件append到在集群中运行的专用 Aeron 存档(Aeron Archive)。使用存档偏移量( Archive offset)作为数据库中的高水位线( high watermark)。如果数据库出现故障,重新启动数据库网关。在数据库网关启动时,从数据库中读取最后写入的高水位线并从该点处理集群的存档。

第二种方案是可靠的,其实就是说,处理数据的时候记录一下日志处理的进度,然后崩溃恢复之后从该位置继续往后处理。这种方式的好处是,Aeron Archive底层会对Cluster的raftLog进行重放和恢复,保证幂等的前提下,这种机制不会因为重试而导致脏数据。

回想一下Archive的特性:

!! Archive主要用于业务系统中产生的事件日志的存储。

我们可以将其类比Rocksdb。

在Aeron框架中,Archive主要用于raftLog、snapshopt的存储以及raftLog的回放。

对于读写而言,有以下特点:

  • !! 存只能append

  • !! 读只能根据某个位置往后读,可以自行进行封装,实现跨机器读取Archive中的数据,实现跨服务日志回放、数据同步功能(replay)


浏览 76
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报