介绍 PlanetScale Portals:只读区域
介绍 PlanetScale Portals:只读区域
如果你在全球范围内部署了应用程序,并希望保持数据库读取的延迟较低,那么你需要在物理上将数据库部署到离用户更近的位置。有了 PlanetScale Portals,你现在可以创建只读区域来支持你的全球分布式应用程序,从而更好地服务你的世界各地的用户。
将数据部署到靠近用户和应用的位置
Portals(“门户”功能)允许你从离全球部署应用程序位置最近的区域读取数据。无论你的应用程序部署在北弗吉尼亚、法兰克福、圣保罗或 PlanetScale 的其他地区,Portals 都可以为你的应用程序提供更低的读取延迟!
目前,在 PlanetScale 中,每个数据库都只能从单一区域进行读取和写入。但是通过 Portals,你可以添加任意数量的分布式只读区域。
如果你不使用 PlanetScale,自己设置全球部署的数据库可能会很麻烦。你可能需要进行容量规划,处理复杂的定价结构,还要担心复制策略或性能问题。然而,通过简单的几次点击操作,PlanetScale 就能帮你管理额外的只读区域。
Portals 功能的一个例子
为了更具体地展示其优点,我们来看一些不同区域之间读取延迟的实际情况:
对于一个部署在法兰克福的应用程序,与北弗吉尼亚的数据库通信每次查询会增加近 ~90 毫秒的延迟。而在法兰克福增加一个只读区域后,这种延迟可以减少到 ~3 毫秒每查询。(以上数据基于 select * from books limit 10
查询测试。)
连接你的新只读区域
你可以通过连接字符串来连接到新建的只读区域,这和连接到 PlanetScale 数据库分支或其他 MySQL 数据库类似。这个连接字符串特定于你的只读区域和生产分支。
我们来看看在全球两地部署的 Ruby on Rails 应用程序(分别位于圣保罗和法兰克福)中如何使用这个功能。
代码示例
注意
虽然以下示例基于 Ruby on Rails,不同的应用框架以及部署方式一般都会有类似的解决方案。例如,你可以参考 Fly.io 和 PlanetScale 的指南,了解如何在 Fly 的全球应用平台与 PlanetScale 的只读区域结合,以实现数据库区域部署在接近应用的位置。
在 Rails 应用程序中,你可以设置连接到只读区域。
首先,修改 database.yml
文件,添加主数据库连接和只读区域连接:
default: &default adapter: trilogy encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: socket: /tmp/mysql.sock development: primary: <<: *default database: multi_region_rails_development primary_replica: <<: *default database: multi_region_rails_development replica: true test: primary: <<: *default database: multi_region_rails_test primary_replica: <<: *default database: multi_region_rails_test replica: true
这将允许你将查询发送到只读区域,或利用 Rails 的“自动角色切换”来处理查询路由。
ActiveRecord::Base.connected_to(role: :reading) do books = Book.where(author: "Taylor") # 这个代码块中的所有操作都将连接到只读区域 end
你可以设置你的生产应用与离你最近的 PlanetScale 区域进行只读连接,从而实现低延迟读取。
在这个示例中,我们的连接信息存储在 Rails 的凭据中:
<% # 应用程序设置了一个区域环境变量。 # 根据这个变量连接最近的数据库区域。 region = ENV["APP_REGION"] # 如果在法兰克福,则连接法兰克福数据库区域。 # 如果在圣保罗,则连接圣保罗数据库区域。 region_replica_mapping = { "fra" => Rails.application.credentials.planetscale_fra, "gra" => Rails.application.credentials.planetscale_gra } # 如果没有特定的区域,则连接主数据库。 db_replica_creds = region_replica_mapping[region] || Rails.application.credentials.planetscale %> production: primary: <<: *default username: <%= Rails.application.credentials.planetscale&.fetch(:username) %> password: <%= Rails.application.credentials.planetscale&.fetch(:password) %> database: <%= Rails.application.credentials.planetscale&.fetch(:database) %> host: <%= Rails.application.credentials.planetscale&.fetch(:host) %> ssl_mode: verify_identity primary_replica: <<: *default username: <%= db_replica_creds.fetch(:username) %> password: <%= db_replica_creds.fetch(:password) %> database: <%= db_replica_creds.fetch(:database) %> host: <%= db_replica_creds.fetch(:host) %> ssl_mode: <%= Trilogy::SSL_VERIFY_IDENTITY %> replica: true
完成配置后,我们的全球应用程序就可以从全球部署的数据库中读取数据。这使得区域内的 GET 请求变得更快,而写操作仍然会发送至主数据库。
自动角色切换和读取用户自己的写入
我们可以更进一步,让所有的读取操作默认命中只读区域,而无需在代码中指定。同时,我们可以指示 Rails 在用户最近写入数据时读取主数据库。这样可以避免用户读取到由于复制延迟导致的过时数据。
为了实现这个功能,我们需要为模型设置阅读/写入角色:
# app/models/application_record.rb class ApplicationRecord < ActiveRecord::Base primary_abstract_class connects_to database: { writing: :primary, reading: :primary_replica } end
然后在生产环境配置文件中启用自动角色切换:
# config/environments/production.rb config.active_record.database_selector = { delay: 2.seconds } config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
这段代码告诉 Rails 将所有读取操作发送到只读区域,写入操作发送到主数据库。在每次写入后,它会设置一个 cookie,使所有读取操作在接下来 2 秒内发送到主数据库,确保用户能够读取他们自己的写入操作。
(非常感谢 PlanetScale 软件工程师 Mike Coutermarsh 为本部分 Ruby on Rails 代码提供帮助。)
定价
任何处于 Scaler Pro 或 Enterprise 计划的数据库都可以创建只读数据库区域。Portals 的定价基于存储成本和行读取数量。
存储成本
随着添加只读区域的数量增加,你的存储成本将线性增长。例如,如果你的生产分支存储容量为 10GB,增加一个只读区域后,存储成本将增加 10GB。Portals 的存储成本按月按比例计费。如果你在当月 15 日为 10GB 分支添加了一个只读区域,你只需支付 5GB 的使用费用。
新增的只读区域始终以独立存储计费,不会计入包含存储配额。
行读取
对只读区域发起的查询将计入当月总计费行读取数量。为了方便成本追踪,发票明细中会显示一行单独记录只读区域的行读取情况。
立即试用
PlanetScale Portals 现已提供 beta 版。你可在 Scaler Pro 或 Enterprise 计划中的任何 PlanetScale 数据库中创建新的只读区域。
请注册或登录你的 PlanetScale 账户,前往数据库的生产分支页面添加区域。详细信息请查阅 Portals 文档。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:https://choupangxia.com/2025/08/02/planetscale-portals/