暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB IMCI列存索引自动分流

原创 junyuan 2024-09-25
217

业务背景

如果业务中既包含OLTP类业务又包含OLAP类业务,则为了实现业务的最大性能,您可以基于列存索引特性,通过数据库代理的集群地址功能,实现OLAP查询引流到列存节点、OLTP查询引流到行存节点。
只读行存节点:该类型的只读节点基于行存储处理读请求。行存节点在处理OLTP读请求时具有更高的性能。
只读列存节点:该类型的只读节点基于列存储处理读请求。列存节点在处理OLAP读请求(如复杂的SQL和分析型SQL)时,具有远超行存节点的性能。

为了实现SQL查询的最大性能,可以通过配置集群地址(Endpoint),实现OLAP查询引流到列存节点、OLTP查询引流到行存节点。

OLTP与OLAP业务混合负载场景下行存和列存自动分流

如果业务中OLAP类型的查询与OLTP类型的查询是通过同一个应用程序访问数据库,此时如果要实现分流,您需要设置集群地址的读写模式,并开启自动分流功能。自动分流功能开启后,数据库代理基于业务流入的SQL语句的预估执行代价来实现自动分流,从而实现SQL查询的最大性能。当SQL语句的预估执行代价超过一定值时,数据库代理可自动将该请求分流至只读列存节点处理,反之该请求则由行存只读节点或主节点来处理。
分流规则:

  1. OLTP类业务:一般包含读和写的请求。写请求统一由主节点处理,读请求由只读行存节点或主节点处理。
  2. OLAP类业务:一般仅包含读请求。读请求统一由只读列存节点处理。

自动分流方案:

  1. 主节点和只读列存节点分流:由于主节点也属于行存节点,因此也可处理OLTP类读请求。该方案下,写请求以及OLTP类读请求分流至主节点,OLAP类读请求分流至只读列存节点。
  2. 只读行存节点和只读列存节点分流:该方案下,写请求依旧分流至主节点,OLTP类读请求分流至只读行存节点或主节点,OLAP类读请求分流至只读列存节点。

自动分流判断标准:

  1. 低于SQL语句的预估执行代价阈值的请求将被引流至行存节点上(或者主节点)执行。多个行存节点的情况下,具体引流至哪个行存节点,根据负载均衡自动判定。
  2. 高于SQL语句的预估执行代价阈值的请求将被引流至列存节点上执行。多个列存节点的情况下,具体引流至哪个列存节点,根据负载均衡自动判定。

image.png
由于采样精度、采样方式等原因,优化器预估的执行代价可能会与实际值偏差较大,导致部分慢查询被自动分流至行存节点上。为了避免该情况出现,您可以开启自适应执行能力,将错误分流到行存的慢查询自动切换到列存执行,以保证执行效率。

OLTP与OLAP业务独立场景下行存和列存手动分流

如果您的业务中,OLAP类型与OLTP类型的业务基于不同的应用程序访问数据库,则可分别为这些应用程序配置不同的集群地址,然后将行存节点和列存节点分别配置到不同集群地址(Endpoint)的服务节点中,从而实现行存和列存分流。分流规则:

  1. OLTP类业务:一般包含读和写的请求。写请求统一由主节点处理,读请求由只读行存节点或主节点处理。
  2. OLAP类业务:一般仅包含读请求。读请求统一由只读列存节点处理。

手动分流方案(读写模式为可读可写(自动读写分离)或只读均可):

  1. 将OLTP类的应用与不含只读列存节点的集群地址进行关联,读请求由主节点或只读行存节点处理。
  2. 将OLAP类的应用与仅包含只读列存节点的集群地址进行关联,读请求由只读列存节点处理。
    image.png

列存节点的事务一致性说明

只读列存节点的复制LSN位点为列存复制位点和行存复制位点两者中的最小值。只读列存节点在PolarDB一致性级别中针对复杂查询的处理方式如下:开启行存和列存自动分流时,数据库代理对复杂查询(SQL语句的预估执行代价大于阈值)的处理方式不同于普通查询,针对复杂查询,数据库代理会将请求只发送给只读列存节点,即使只读列存节点的一致性位点等待超时,也不会转发给主节点,而是直接报错给应用端。为避免只读列存节点因请求超时而频繁报错,复杂查询在只读列存节点上的超时时长比普通只读节点长。不开启行存和列存自动分流时,数据库代理将只读列存节点视为普通的只读节点。

LOADING_NCI状态说明及其影响

介绍了列存节点上的LOADING_NCI状态及其对列存读一致性的影响。

重启列存节点之后,在一段时间内,您可能会通过information_schema.imci_indexes表看到有一部分列存索引处于LOADING_NCI状态,该状态表示当前索引正在重建列存索引与行存的映射关系。该映射关系用于HTAP服务的实时高并发数据更新能力中。根据具体列存数据量的大小和集群的规格,LOADING_NCI状态持续时间为几秒到数小时不等。处于LOADING_NCI状态的索引依然可以实时更新列存索引中的数据,但由于该状态下列存索引与行存的映射没有完全建立,因此,数据更新仅缓存在列存索引上,您将无法实时查询更新后的数据。

处于LOADING_NCI状态的索引中的数据依然可读,列存索引会根据您不同的参数配置提供不同的一致性级别的读服务。
LOADING_NCI:imci_enable_read_during_load_nci=ON,可读,快照读(全局任一列存索引处于该状态,则对所有列存索引提供快照读服务。),imci_enable_read_during_load_nci=OFF,不可读。
COMMITTED:N/A,可读,会读取实时更新的数据。
其他状态:N/A,不可读

若列存索引中的imci_enable_read_during_load_nci参数配置为ON,则在全部的列存索引状态由LOADING_NCI变为COMMITTED状态之前,列存索引默认提供快照读服务,读取的数据版本为列存宕机前的最后一次完整快照。此时,无论当前的列存索引状态处于LOADING_NCI还是COMMITTED,均支持通过列存索引加速复杂查询。将imci_enable_read_during_load_nci参数配置为ON后,只要全局存在一个LOADING_NCI状态的列存索引,就会提供快照读服务。若列存索引中的imci_enable_read_during_load_nci参数配置为OFF。则列存索引会提供更严格的一致性读服务。即:对于COMMITTED状态的列存索引,可以通过列存数据加速复杂查询,并读取最新的列存数据。
对于LOADING_NCI状态的列存索引,由于索引无法读取最新实时数据,因此只能读行存。用户可以根据具体的业务场景选择是否开启或关闭处于LOADING_NCI状态下的列存节点的快照读服务。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论