探索NATS消息系统下的分布式SQLite引擎:Marmot推荐

发表时间: 2023-04-25 17:50

Marmot 是一个分布式 SQLite 复制引擎,具有无领导和最终一致性。它允许您构建强健的复制 通过构建在容错 NATS Jetstream 之上的节点之间。这意味着如果您正在运行读取 基于 SQLite 的繁重网站,您应该能够通过添加更多 SQLite 复制节点轻松扩展它。SQLite 是 可能是几乎无处不在的最普遍的数据库,Marmot 旨在使其在服务器中更加普遍 通过在其上构建复制层来辅助应用程序。

Marmot优势

有一些解决方案,如rqlite,dqlite和LiteFS等。 它们要么是SQLite之上的层(例如 rqlite,dqlite),要求它们坐在网络层的中间,以便提供 复制;或者截获物理页级写入以将其流式传输到副本。在两者中 在这种情况下,它们需要一个主节点,所有写入都必须进行,然后这些 更改将应用于多个只读副本。

另一方面,Marmot天生不同。它的诞生是为了充当您现有流程的副车:

  • 不需要单个主节点,而是没有主要节点!这意味着任何节点都可以对其本地数据库进行更改。 Marmot 将使用触发器来捕获您的更改(因此是原子记录),然后将它们流式传输到 NATS。
  • 它不是强一致性,而是最终一致性。这意味着没有锁定或阻塞节点。
  • 它不需要对读取/写入的应用程序逻辑进行任何更改。

做出这些选择具有多种好处:

  • 您可以像往常一样读取和写入SQLite数据库。没有扩展名,或者 VFS 更改。
  • 您可以在任何节点上写入!您不必转到单个主数据库来写入数据。
  • 只要你从同一个数据库副本开始,所有的突变最终都会收敛。 (因此最终一致)。

Marmot是运行在NATS之上的CDC(变更数据捕获)管道。它可以自动配置适当的 JetStreams,确保 这些流在这些分片上均匀地分配负载,因此扩展简单地归结为添加更多节点并重新平衡 那些 JetStreams(将在未来的版本中自动化)。

局限性

目前,当前解决方案存在一些限制:

  • 您不能有选择地监视数据库上的表。这是由于快照和还原机制方面的各种限制。
  • 需要 WAL 模式 - 由于您的数据库将由多个进程处理,因此拥有多进程的唯一方法 通过 WAL 可靠地进行更改。
  • 土拨鼠最终是一致的。这仅仅意味着行可能会无序同步,并且假设 关于交易可能不再成立。SERIALIZABLE

特征

  • 无领导复制从不需要单个节点来处理所有写入负载。
  • NATS/S3 快照支持。
  • 基于 NATS 构建,抽象化流分发和复制。
  • 能够快照并从这些快照中完全恢复。
  • 基于 SQLite 的日志存储,因此 SQLite 的所有工具都可供您使用。
  • 支持日志条目压缩,处理内容繁重的CMS需求。
  • 无服务器方案的睡眠超时支持。


依赖

启动 0.4+ 土拨鼠依赖于支持 JetStream 的 nats 服务器。 这不是构建进程内共识算法,而是解锁了更多用例,例如让 外部应用程序订阅这些更改,并围绕其构建更复杂的用例 应用需求。下面是一个您可以使用 Deno 在本地运行的示例:

deno run --allow-net https://gist.githubusercontent.com/maxpert/d50a49dfb2f307b30b7cae841c9607e1/raw/6d30803c140b0ba602545c1c0878d3394be548c3/watch-marmot-change-logs.ts -u <nats_username> -p <nats_password> -s <comma_seperated_server_list>


构建

go build -o build/marmot ./marmot.go

确保您有 2 个具有完全相同模式的 SQLite 数据库,然后运行:

nats-server --jetstreambuild/marmot -config config-1.toml -verbosebuild/marmot -config config-2.toml -verbose

此处和应该是具有更新的节点 ID 和数据库路径的副本。
config-1.tomlconfig-2.tomlconfig.toml




#头条创作挑战赛#