本文为您介绍如何通过行列路由机制,分流业务中同时存在的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流量则继续在主实例上执行。
自动路由规则:
扫描代价的预估值高于阈值的读流量,会被判定为AP流量,SQL将会被自动路由至列存只读实例执行。
扫描代价的预估值低于阈值的读流量、事务内的读流量和写入流量都会被判定为TP流量,SQL将会被自动路由到主实例执行。
如果一个主实例有多个列存只读实例,系统会自动采用大规模多级并行处理(Massively Parallel Processing,MPP)调度执行。
自动路由配置步骤:
在页面左上角选择目标实例所在地域。
在实例列表页,单击PolarDB-X 2.0页签。
单击目标主实例ID,进入基本信息页面。
在连接信息区域,单击配置管理。
在配置管理对话框中执行以下操作:
在资源配置区域的可选实例列表中,选择目标列存只读实例显示在已选实例列表中。
在列存只读配置设置区域,单击开启,再单击确定。
列存只读实例和主实例的数据同步存在秒级延迟,如果对主实例和列存只读实例的数据有一致性要求,不建议您采用自动路由机制。
负载分离场景
如果您的业务中,OLAP类型与OLTP类型的业务基于不同的应用程序访问数据库,则可以分别为应用程序配置不同的连接地址,将OLTP业务连接到集群地址,而OLAP业务程序连接到列存只读实例的地址,从而实现主实例和列存只读实例的分流。
主实例和只读实例并存的路由机制
透明读写分离
PolarDB-X提供了透明的强一致读写分离能力。该方案的最大优势是应用不需要改动代码,只需要连接主实例的集群地址,系统会自动将一定比例(比例可配置)的读流量路由到只读实例。
透明读写分离配置步骤:
在页面左上角选择目标实例所在地域。
在实例列表页,单击PolarDB-X 2.0页签。
单击目标主实例ID,进入基本信息页面。
在连接信息区域,单击配置管理。
在配置管理对话框中执行如下操作:
在资源配置区域的可选实例列表中,选择目标行存只读实例显示在已选实例列表中。
在行存只读配置设置区域按需设置。
配置项说明:
配置项
选项
说明
强一致性读
强一致性
路由到只读DN的请求可以读取到最新数据。只读DN延迟超过阈值后,系统会自动将业务请求路由到其他延迟正常的只读DN(如果有)或主实例(需设置只读流量切回主实例选项为开启)。
弱一致性
路由到只读DN的请求只能读取到只读DN的最新数据。
开启MPP查询加速
开启/关闭
基于统计信息做代价估算,将AP类的复杂查询路由到只读实例(CN+DN)做MPP加速。
读写分离
路由到只读实例流量的占比
将原先路由给主实例DN的下推查询按一定的比例路由到只读DN。
只读实例延迟阈值(s)
只读DN延迟超过阈值后,系统会自动将业务请求路由到其他延迟正常的只读DN上或主实例(需设置只读流量切回主实例选项为开启)。
只读流量切回主实例
开启状态时,只读DN延迟超过阈值,只读流量会切回到主实例。
单击确定。
手动读写分离
如果您的业务中希望在应用侧实现读写分离,可以使用不同的连接地址,写操作配置主实例的连接地址,读操作配置只读实例的连接地址。这种方案的最大特点是读写流量相互隔离,彼此不受影响。
单主实例的路由机制
在只有主实例的情况下,应用默认只能访问行存数据。
常见问题
购买主实例和列存只读实例后,怎么使用列存加速查询?
答:一般有两种方式来使用列存只读实例:
扫描代价基于统计信息的计算方式是否会出现误判,导致查询没有按预想路由到列存只读实例?
答:因为目前统计信息是定时采集,所以会存在统计信息滞后,导致扫描代价计算不准,导致查询的路由结果不符合预期。对于特别重要的复杂查询,建议您对该SQL绑定列存HINT,这样可以确保这些SQL一定会路由给列存只读实例执行。
怎么对特定的SQL绑定HINT列存,且不需要改动应用代码?
答:PolarDB-X提供了执行计划管理功能,对特定SQL执行路由绑定操作,之后数据库会自动将这类SQL路由到列存只读实例执行。
查询在列存只读实例执行,相比主实例执行,性能并没有明显提升,怎么解决?
答:因为列存只读实例执行的一般是复杂查询,该类查询对实例的规格要求较高,所以建议您购买至少32C及以上规格的列存只读实例(该实例性价比非常高)以获得更好的性能。