我在 FerretDB 发布时写了一篇博客。 FerretDB 是 MongoDB 的开源替代品,提供相同的 API 并将文档存储在 PostgreSQL 中。适用于 PostgreSQL 的功能适用于 YugabyteDB,使其能够横向扩展。 YugabyteDB 是 PostgreSQL 开源分布式 SQL 数据库。

最新版本的 FerretDB 引入了一个有趣的特性:Embedded FerretDB。由于此代理是无状态的,因此将其嵌入而不是将其作为单独的进程运行是有意义的。他们提供了一个简单的示例:https://github.com/FerretDB/embedded-example我将使用 YugabyteDB 数据库而不是 PostgreSQL 来运行它。

查看YugabyteDB 快速入门所以启动你的数据库。最简单的是 YugabyteDB Managed Cloud 中的免费托管数据库,https://cloud.yugabyte.com,您可以在 AWS 或 GCP 的任何区域预置它。为了测试,我选择了一个免费的数据库,在“连接”中查看连接信息:

[云](https://res.cloudinary.com/practicaldev/image/fetch/s--LKAJx6rm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads .s3.amazonaws.com/uploads/articles/e8t647eoh3zfqj5rfylw.png)

此处不显示admin的密码,是您在创建集群时提供的。当然,您应该创建额外的数据库和用户,但这是一个示例,让我们保持简单。

FerretDB 示例代码在main.go中将连接字符串硬编码为PostgreSQLURL。我将运行一个简单的sed命令将其替换为我的 YugabyteDB 托管云连接字符串:postgres://admin:MyPassword@eu-west-1.77d36171-1337-4116-93ff-587a5ea344be.aws.ybdb.io:5433/yugabyte

git clone https://github.com/FerretDB/embedded-example.git
cd embedded-example
sed -e '/PostgreSQLURL/s?".*"?"postgres://admin:MyPassword@eu-west-1.77d36171-1337-4116-93ff-587a5ea344be.aws.ybdb.io:5433/yugabyte"?options=-c%20enable_nestloop%3Doff' -i main.go
go run main.go

进入全屏模式 退出全屏模式

请注意,我添加了enable_nestloop=off,因为 FerretDB 多次查询信息_schema,当 YugabyteDB 主服务器存在延迟时,这可能会很慢(问题#7745)。在这里禁用嵌套循环是可以的,因为 FerretDB 不会在当前版本中创建索引。解决方案,如果查询信息_schema 仍然存在,将使用提示/*+ Set(enable_nestloop off) */执行此操作,但当时可能会在 YugabyteDB 端进行优化。

输出告诉您已插入一个新文档:

[程序输出](https://res.cloudinary.com/practicaldev/image/fetch/s--SOXIN3ja--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/o19re7caazf2lxc15ohs.png)

它公开了一个mongodb端点,但我也可以从 YugabyteDB 管理的 Cloud Shell 中用 SQL 查询它:

[Cloud Shell](https://res.cloudinary.com/practicaldev/image/fetch/s--1Uxh6RNA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/p3kppdfi3l3zw02m9dyf.png)

如您所见,使用 YugabyteDB 数据库而不是 PostgreSQL 数据库运行起来很容易。使用 YugabyteDB Managed,端点是一个负载均衡器,这意味着您无需对应用程序进行任何更改即可从 YugabyteDB 提供的扩展、高可用性和地理分布中受益。

如果您在没有负载均衡器的情况下使用本地部署运行,唯一的变化是使用来自 Yugabyte 的 PGX 驱动程序:

git clone https://github.com/FerretDB/FerretDB.git
cd FerretDB
sed -e 's?"github.com/jackc/pgx/v4"?"github.com/yugabyte/pgx/v4"?' \ 
 -i $(grep -rl "github.com/jackc/pgx/v4")

进入全屏模式 退出全屏模式

使用Yugabyte PGX驱动程序,您仍然只提供一个端点,即 YugabyteDB 集群中的任何节点,它会自动发现其他节点以平衡新连接。然后,您无需任何附加组件即可从分布式数据库的弹性中受益。

性能怎么样?

在当前版本(FerretDB 0.5.1)中没有创建索引,这里没有必要测试性能。我在上一篇文章中提到它是如何被索引的。当然,要走的路是在“_id”上有主键,但要兼容 MongoDB,ID 可以有不同的类型。问题支持将字段提取到单独的列中 #226被标记为“代码/功能”、“未准备好”。问题Support simple query pushdown for Postgres #896也在查看索引,就像我在上一篇文章中所做的那样。所以,性能仍然在进步,如果你想扩展你必须自己考虑索引,因为表真的很简单:

yugabyte=> \d test.test_afd071e5
           Table "test.test_afd071e5"
 Column | Type  | Collation | Nullable | Default
--------+-------+-----------+----------+---------
 _jsonb | jsonb |           |          |

进入全屏模式 退出全屏模式

目前最好的方法是查看查询(从pg_stat_statement开始)并创建正确的索引。当然,这需要提前了解架构。

如果没有索引,所有查询都将是 Seq Scan,然后您可能会受益于启用谓词下推以避免将行从存储节点(表服务器)发送到正在处理查询的节点(PostgreSQL 后端):

yugabyte=> alter user admin set yb_enable_expression_pushdown = on;
ALTER ROLE

进入全屏模式 退出全屏模式

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐