什么是Neki路由器?

什么是Neki路由器?

💡 原文英文,约1200词,阅读约需5分钟。
📝

内容提要

Neki路由器利用分片数据库解决查询路由问题,通过Neki计划决定查询发送至哪些分片,而Postgres计划处理分片内执行。路由器集群支持大量客户端连接,无需每连接一个Postgres进程。查询可路由至单分片或散射至全部分片并聚合结果。路由器无状态,易于扩展,分片扩展数据存储,路由器扩展连接处理。

🔎

延伸解读

双计划机制:路由与执行分离

Neki路由器将查询处理拆分为两个阶段:Neki计划负责根据数据拓扑决定查询发送到哪些分片,Postgres计划则负责在分片内具体执行。这种分离使得路由决策与执行优化各司其职,既保证了跨分片的路由效率,又保留了Postgres原生的执行能力。对于开发者而言,理解这一机制有助于排查分布式查询的性能瓶颈,例如通过EXPLAIN (NEKI_PLAN) 查看路由决策,再结合常规EXPLAIN分析分片内的执行计划。

无状态路由器的扩展优势

Neki路由器是无状态的,不存储持久化数据,其缓存的数据拓扑、表定义和查询计划均可重建。这意味着路由器可以按需动态增加、调整或移除,以应对连接数或查询负载的变化。与分片扩展数据存储不同,路由器扩展的是分布式查询处理和客户端连接能力。这种设计使得系统具备两个独立的扩展维度,运维人员可以根据实际瓶颈灵活调整,例如在连接数激增时增加路由器,在数据量增长时增加分片。

散射查询的代价与优化

当查询无法利用分片键定位到单一分片时,Neki会采用散射(Scatter)模式,将查询发送到所有分片并聚合结果。这种模式虽然能处理任意查询,但会带来额外的网络开销和聚合成本。Neki通过下推LIMIT等操作来减少每个分片返回的数据量,但散射查询仍可能比单分片查询慢。因此,在设计表结构时,应尽量让常用查询包含分片键,以利用路由优化,避免不必要的散射。

Q&A

Neki路由器是什么?

Neki路由器是位于应用程序和Postgres数据库之间的组件,用于解决分片数据库的查询路由问题。它根据数据拓扑决定查询发送到哪些分片,并处理跨分片的结果聚合。

Neki路由器如何解决Postgres的连接瓶颈?

Postgres采用每连接一个进程的架构,大量连接会消耗内存并增加调度开销。Neki路由器在自身进程中处理客户端连接,无需为每个连接启动Postgres后端进程,从而支持大量客户端连接。

Neki路由器是无状态的吗?如果路由器故障会发生什么?

是的,Neki路由器在操作上是无状态的,不存储持久化应用数据,其缓存的数据拓扑、表定义和查询计划可以重建。如果路由器故障,连接到它的会话会丢失,但客户端可以重新连接到其他健康的路由器。

Neki路由器如何与Postgres通信?

Neki路由器理解Postgres协议,解析SQL,并将工作通过gRPC发送到每个分片旁的sidecar。sidecar不解析或规划SQL,而是通过池化连接将工作转发给Postgres,并将响应流式返回给路由器。

Neki路由器如何决定查询发送到哪个分片?

Neki路由器使用数据拓扑和分片键(如user_id)来决定。如果查询包含分片键,路由器可以精确路由到单个分片;否则,它会将查询散射到所有分片并聚合结果。

Neki路由器如何处理散射-聚集查询?

对于无法路由到单个分片的查询,路由器会将其散射到所有分片,然后使用Collapse操作符聚合结果。它还会将LIMIT下推到每个分片,以限制返回的行数。

Neki路由器与PgBouncer有何不同?

Neki路由器不仅是一个连接池或TCP代理,它理解Postgres协议,解析SQL,并能将语句分解为分片工作并协调结果。它还能维护客户端会话状态,并在需要时应用到Postgres。

Neki数据库如何独立扩展路由器和分片?

Neki数据库有两个独立的扩展维度:分片用于扩展数据存储和Postgres引擎,路由器用于扩展分布式查询处理和客户端连接处理。两者可以独立调整,以适应工作负载变化。

🏷️

标签

➡️

继续阅读