RQLite 6.0:分布式数据库设计的演变

2021-06-10 21:26:55

RQLite是一种轻量级,开源,分布式的分布式关系数据库,它使用SQLite作为其存储引擎。 v6.0.0现在出现并使聚类更加强大。它还为更重要的功能奠定了基础。

6.0使用现有的RAFT节点TCP连接多路复用RQLITE节点之间的多个逻辑连接。此复用在早期版本中存在,但已以更复杂,强大的方式重新引入。

这种新的逻辑连接允许粉丝以更强大和无状态的方式找到领导者,当要求客户需要客户端联系领导者的查询时。它还在此逻辑连接上使用协议缓冲区,从而导致更强大,可扩展的代码。

RQLite集群中的节点间通信多年来已经发展,并且有趣的是在上下文中看到3个设计模式。在这种情况下,通过节点间通信我的意思是什么?我的意思是在群集节点之间传输特定于RQLITE本身的信息,但不是Hashicorp代码之间的筏特定于特定于RAFT的通信。

虽然每个节点都知道每个其他节点的筏网络地址,但每个RQLite节点也必须知道领导者的HTTP URL,因此它可以通知客户端代码重定向查询的位置。由于领导者可以改变甚至完全替换,因此每个RQLite节点必须始终具有关于领导者HTTP URL的最新信息。

核心挑战是,此信息不是Hashicorp Raft本质上的东西,因为筏层仅知道RAFT网络地址。 HTTP URL是RQLite概念,而不是筏概念。

因此,如果有必要,它取决于RQLite代码,用于处理将客户重定向到领导者,以便响应请求。这是如何随着时间的推移而发展的。

在版本3.x之前,RQLITE节点返回到客户端的RAFT网络地址,如果请求的操作只能由领导者服务(假设节点本身不是领导者)。这迫使客户端检查所有其他群集节点,以查看有哪一个具有相关的筏地址,然后将查询本身重定向到该节点的HTTP API URL。

虽然这意味着RQLite代码比以后的版本要简单得多,但如果客户端知道RQLite群集中的每个节点,则此方法仅工作,如果群集中的节点更改或失败,这不是很实际的。没有确定的方式可以通知客户代码这些更改,因此客户可以有效地失去群集。

版本3.0显而易见的是RQLite跟随节点返回正确的HTTP重定向。但是这个问题然后成为追随者节点如何知道领导者的HTTP URL?

版本3.x,4.x和5.x使用筏达成的系统本身来广播此信息。当节点连接到群集时,它将将更改为筏日志,更新将其raft网络地址映射到其HTTP API URL的配置。由于共识系统,每个节点始终知道每个其他节点的RAFT网络地址,因此,在理论上,每个节点通过此映射来了解每个其他节点的HTTP API URL。因此,每个节点都知道领导者的HTTP API URL,即使跨领导者也会发生变化。

这种设计很长时间工作,但有一些缺点。如果节点加入群集,则一个可能的问题是该怎么办权限,但是未能更新其HTTP API URL映射(无论出于何种原因)。它可能发生,但非常不可能。但如果它确实如此,群集可能需要在恢复之前需要进行重大的手动干预。

随着时间的推移,发现其他错误显示这种方法在群集成员定期更改时,这种方法并不强大。除了SQLite数据库之外,它还意味着额外的状态,通过筏存储。它多年来一直很好地工作,适用于3.x,4.x和5.x,但通过版本6.x获得了更好的方法。因此,而不是修复错误,而是重新建立设计以呈现错误。

在6.0版中,追随者在需要了解领导者的HTTP API时,请点击按需。并且批判性地,它会在RAFT TCP连接到领导者,无论如何都必须始终存在的连接 - 没有该连接,节点不是群集的一部分,并且群集具有更大的问题。因此,这种新设计不会引入任何新的失败模式。

这种类型的设计也是无状态的,即使达到领导者以学习其HTTP API URL失败,也会在查询时间发生故障 - 这意味着客户端可以获取,客户可以决定如何处理该客户端。如果错误是瞬态,则客户端可以简单地重试请求。

这种新的设计和实现使得更清晰,实现以下功能。

今天,如果一个RQLite追随者接收到领导者必须服务的请求,它将返回HTTP 301.现在,通过更复杂的节点间通信机制,将来的版本将允许跟随者节点代表直接查询领导者客户端并将结果直接返回给客户端。这将使用CLI和客户端库编码,更简单,并使群集更容易使用 - 允许RQLite更透明地提供查询。

在6.0的发展中,我在Sosivio的团队中获得了一些很大的帮助。他们在5.x系列中找到了一些错误,并提供了关于RQLite如何更改的最佳实践建议,以便在Kubernetes上更好地工作。这些更改可能在将来的版本中具有功能。

下载6.0版,并尝试更强大的群集 - 并在将来的版本中查找新功能。