行列路由机制

本文为您介绍如何通过行列路由机制,分流业务中同时存在的OLTP类业务和OLAP类业务。

背景信息

PolarDB-X有以下三种类型实例:

  • 主实例:主要用于承担事务处理(TP)类流量,默认访问行存数据,并对外提供集群地址。该地址不仅支持事务处理流量的读写分离配置,还支持将分析处理(AP)流量转发给列存只读实例和普通的只读实例。

  • 只读实例:主要用于承担事务处理(TP)类的读流量,默认访问行存数据,并与主实例物理隔离(可对外单独提供连接地址)。常用于应用程序自身的读写分离配置或ETL(提取、转换、加载)场景。

  • 列存只读实例:主要用于承担分析处理(AP)类的读流量,只允许访问列存数据,并与主实例物理隔离(可对外单独提供连接地址)。常用于业务中有数据分析的场景。

说明
  • 因为行存数据向列存数据同步存在秒级延迟,所以为了避免主实例读取数据时出现不一致的问题,默认情况下,主实例和只读实例都只允许访问行存数据。

  • 在SQL语句前添加如下前缀代码,可以将该SQL路由到列存只读实例执行:

    /*+TDDL: worload_type=ap enable_columnar_optimizer=true*/

主实例和列存只读实例并存的路由机制

混合负载场景

如果您的业务中,OLAP类型和OLTP类型的SQL只能使用同一个连接访问数据库,这种情况下您可以直接使用主实例提供的集群地址来访问数据库。系统会按照SQL的扫描代价自动路由 ,将OLAP流量自动路由给列存只读实例执行,而OLTP流量则继续在主实例上执行。

image
说明

自动路由规则:

  • 扫描代价的预估值高于阈值的读流量,会被判定为AP流量,SQL将会被自动路由至列存只读实例执行。

  • 扫描代价的预估值低于阈值的读流量、事务内的读流量和写入流量都会被判定为TP流量,SQL将会被自动路由到主实例执行。

  • 如果一个主实例有多个列存只读实例,系统会自动采用大规模多级并行处理(Massively Parallel Processing,MPP)调度执行。

自动路由配置步骤:

  1. 登录PolarDB分布式版控制台

  2. 在页面左上角选择目标实例所在地域。

  3. 实例列表页,单击PolarDB-X 2.0页签。

  4. 单击目标主实例ID,进入基本信息页面。

  5. 连接信息区域,单击配置管理

    image

  6. 配置管理对话框中执行以下操作:

    1. 资源配置区域的可选实例列表中,选择目标列存只读实例显示在已选实例列表中。

    2. 列存只读配置设置区域,单击开启,再单击确定

    image

重要

列存只读实例和主实例的数据同步存在秒级延迟,如果对主实例和列存只读实例的数据有一致性要求,不建议您采用自动路由机制。

负载分离场景

如果您的业务中,OLAP类型与OLTP类型的业务基于不同的应用程序访问数据库,则可以分别为应用程序配置不同的连接地址,将OLTP业务连接到集群地址,而OLAP业务程序连接到列存只读实例的地址,从而实现主实例和列存只读实例的分流。

image

主实例和只读实例并存的路由机制

透明读写分离

PolarDB-X提供了透明的强一致读写分离能力。该方案的最大优势是应用不需要改动代码,只需要连接主实例的集群地址,系统会自动将一定比例(比例可配置)的读流量路由到只读实例。

image

透明读写分离配置步骤:

  1. 登录PolarDB分布式版控制台

  2. 在页面左上角选择目标实例所在地域。

  3. 实例列表页,单击PolarDB-X 2.0页签。

  4. 单击目标主实例ID,进入基本信息页面。

  5. 连接信息区域,单击配置管理

    image

  6. 配置管理对话框中执行如下操作:

    1. 资源配置区域的可选实例列表中,选择目标行存只读实例显示在已选实例列表中。

    2. 行存只读配置设置区域按需设置。

      配置项说明:

      配置项

      选项

      说明

      强一致性读

      强一致性

      路由到只读DN的请求可以读取到最新数据。只读DN延迟超过阈值后,系统会自动将业务请求路由到其他延迟正常的只读DN(如果有)或主实例(需设置只读流量切回主实例选项为开启)。

      弱一致性

      路由到只读DN的请求只能读取到只读DN的最新数据。

      开启MPP查询加速

      开启/关闭

      基于统计信息做代价估算,将AP类的复杂查询路由到只读实例(CN+DN)做MPP加速。

      读写分离

      路由到只读实例流量的占比

      将原先路由给主实例DN的下推查询按一定的比例路由到只读DN。

      只读实例延迟阈值(s)

      只读DN延迟超过阈值后,系统会自动将业务请求路由到其他延迟正常的只读DN上或主实例(需设置只读流量切回主实例选项为开启)。

      只读流量切回主实例

      开启状态时,只读DN延迟超过阈值,只读流量会切回到主实例。

    image

  7. 单击确定

手动读写分离

如果您的业务中希望在应用侧实现读写分离,可以使用不同的连接地址,写操作配置主实例的连接地址,读操作配置只读实例的连接地址。这种方案的最大特点是读写流量相互隔离,彼此不受影响。

image

单主实例的路由机制

在只有主实例的情况下,应用默认只能访问行存数据。

image

常见问题

  1. 购买主实例和列存只读实例后,怎么使用列存加速查询?

    答:一般有两种方式来使用列存只读实例:

    • 连接列存只读实例的地址,可以直接访问列存数据。这种方式适用于明确知道哪些查询适合在列存上执行的情况。具体操作,请参见负载分离场景

    • 连接主实例的连接地址。在这种情况下,数据库内部会基于查询代价自动将复杂查询路由到列存只读实例执行。这种方式更适合混合负载场景,无需手动区分查询类型。具体操作,请参见混合负载场景

  2. 扫描代价基于统计信息的计算方式是否会出现误判,导致查询没有按预想路由到列存只读实例?

    答:因为目前统计信息是定时采集,所以会存在统计信息滞后,导致扫描代价计算不准,导致查询的路由结果不符合预期。对于特别重要的复杂查询,建议您对该SQL绑定列存HINT,这样可以确保这些SQL一定会路由给列存只读实例执行。

  3. 怎么对特定的SQL绑定HINT列存,且不需要改动应用代码?

    答:PolarDB-X提供了执行计划管理功能,对特定SQL执行路由绑定操作,之后数据库会自动将这类SQL路由到列存只读实例执行。

  4. 查询在列存只读实例执行,相比主实例执行,性能并没有明显提升,怎么解决?

    答:因为列存只读实例执行的一般是复杂查询,该类查询对实例的规格要求较高,所以建议您购买至少32C及以上规格的列存只读实例(该实例性价比非常高)以获得更好的性能。