只读从实例

应用场景

只读从实例是一种实现负载隔离的部署架构,一个主实例可以绑定多个只读从实例,实例与实例之间共享存储,但是计算资源是互相隔离的。ProtonBase 同时支持了数据库、数据仓库和搜索引擎的能力,在多个场景下可能有进行负载隔离的需求,比如:

混合负载

在业务发展初期,数据量和并发访问量都比较小的情况下,OLTPOLAP 的query在一个 ProtonBase 实例可以轻松支持。随着业务飞速发展,数据量、并发度和分析复杂度逐渐增加,会不可避免的遇见不同类型的query产生负载冲突的问题。可能会因为一个大的分析SQL,影响高并发点查或者写入的线上业务。希望对 OLAPOLTP 的场景进行负载隔离。

业务隔离

多个不同的业务依赖同一个Database,不同业务间希望做资源的完全隔离,降低业务出问题时的爆炸半径。比如一个业务发展迅速,查询的流量和复杂度提升造成系统整体负载提升,可能会造成其他高SLA的在线业务受影响。可以为不同业务设置不同实例做到查询之间相互隔离,互不影响,能有效的提高在线服务的整体稳定性。

读写隔离

在 ProtonBase 的数仓应用场景下,对于定期产出的上游数据,可能以批量的方式定时进行写入。特点是单次导入数据量、导入时间长。与此同时,用户可能对此进行 Ad - Hoc 的查询。受限于对 SQL 的熟悉程度,用户可能会写出不合理的SQL导致资源被大量占用造成批写入任务失败。

基本概念

目前 ProtonBase 是通过对Database设置 Primary / Secondary 状态来实现主实例 和 只读从实例 的区分。PrimarySecondary 都是代表的Database的状态。

Primary Database

可以对Database进行读操作和写操作。

Secondary Database

可以对Database进行读操作。

主实例

绑定了Primary Database的实例被称作主实例。

只读从实例

至少绑定了一个 Secondary Database 的实例被称作只读从实例。一个只读从实例可以同时绑定多个 Secondary 的 Database,但不支持绑定任何 Primary Database。

操作指南

  1. 创建一个新的Warebase。Unit个数可以按需指定。一般而言,只读从实例的Unit个数需要小于等于主实例的Unit个数。

read only create replica

  1. 从控制台左侧的“数据库”,找到要绑定为 Secondary 的Database

read only database list

  1. 通过 Database 右侧的操作扩展按钮进行“绑定”操作

read only attach

  1. 将 Database 标记为 Secondary 的角色绑定到新创建的Warebase上。绑定成功后,新建的实例即为 只读从实例

read only attach secondary

read only attaching

  1. 等待绑定成功。绑定成功后,可以看到这个 Database 的 PrimarySecondary 的角色所在的Warebase实例。

read only attach finished

常见问题

  • 如何判断当前的实例是主实例还是只读实例

通过如下命令进行判断,返回t代表当前所在的 Database 是 Secondary 角色

plutus=> select pg_is_in_recovery(); 
 pg_is_in_recovery
-------------------
 t
(1 行记录)
  • 权限信息是否会自动同步到只读实例

只读实例的所有的 Database/schema/table 的权限,都会follow主实例的权限。

  • 如何判断只读实例相对主实例的延迟

在只读从实例上执行如下命令可以判断主从实例的延迟:

select now()-pg_last_xact_replay_timestamp() as replication_lag;
 replication_lag
 -----------------
  00:00:01.0009
 (1 行记录)