带有 YugabyteDB 的嵌入式 FerretDB:分布式 SQL 上的 MongoDB API 🚀☁
我在 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 查询它:
[](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
进入全屏模式 退出全屏模式
更多推荐
所有评论(0)