列存组件创建

背景

PolarDB-X 集群的架构如下图所示: image.png

  • 元数据服务(Global Meta Service,GMS),主要提供分布式的元数据,提供全局授时服务(TSO)、维护Table/Schema、Statistic等Meta信息、维护账号、权限等安全信息。
  • 计算节点(Compute Node,CN),主要提供分布式SQL引擎,包含核心的优化器和执行器。基于无状态的SQL引擎提供分布式路由和计算,解决分布式事务2PC协调、分布式DDL执行、全局索引维护等。
  • 存储节点 (Data Node,DN),主要提供数据存储引擎,基于多数派Paxos共识协议提供高可靠存储、分布式事务的MVCC多版本存储,另外提供计算下推能力满足分布式的计算下推要求(比如Project/Filter/Join/Agg等下推计算),可支持本地盘和共享存储。
  • 日志节点(Change Data Capture,CDC),主要提供兼容MySQL生态的主备复制协议,兼容Binlog协议和数据格式、支持主备复制Replication的协议和交互。
  • 列存节点(Columnar):提供表级的列存副本,满足行列混存, HTAP 等特性。

对于PolarDB-X Operator 1.6.0及以上的版本,您可以在 PolarDB-X 集群中创建列存组件。

前置条件

  1. PolarDB-X Operator 升级到 1.6.0 及以上版本
  2. 列存组件依赖 CDC,开启列存组件需要同时开启两个CDC
  3. 提前配置nfs和oss存储,参考冷数据归档存储配置

1. 创建带有列存组件的PolarDB-X集群

创建带有列存组件的PolarDB-X集群的yaml配置文件pxc-columnar,示例如下:

apiVersion: polardbx.aliyun.com/v1
kind: PolarDBXCluster
metadata:
  name: yj-columnar-test
spec:
  config:
    columnar:
      columnarDataFileStorage:
        - engine: oss
  topology:
    nodes:
      cn:
        replicas: 1
        template:
          image: polardbx/polardbx-sql:v2.4.0_5.4.19
          resources:
            limits:
              cpu: 2
              memory: 4Gi
      dn:
        replicas: 1
        template:
          image: polardbx/polardbx-engine:v2.4.0_8.4.19
          resources:
            limits:
              cpu: 2
              memory: 4Gi
      cdc:
        replicas: 2
        template:
          image: polardbx/polardbx-cdc:v2.4.0_5.4.19
          resources:
            limits:
              cpu: 2
              memory: 4Gi
      columnar:
        replica: 2
        template:
          image: polardbx/polardbx-columnar:v2.4.0_5.4.19
          resources:
            limits:
              cpu: 2
              memory: 4Gi

参数说明:

  • config.columnar.columnarDataFileStorage: 指定了列存数据的存储引擎,目前 PolarDB-X 支持阿里云 OSS 和 NFS 文件系统,对应的取值是 oss 和 external_disk。需要在集群创建时指定存储类型,创建后无法更改。默认存储类型:oss。
  • 其他相关参数说明详见:PolarDBXCluster定义

2. 创建和使用列存索引

下面通过一个例子介绍如何快速创建和使用列存索引。

建库建表

create database if not exists `ss` mode = 'auto';

use ss;
CREATE TABLE `sbtest1` (
`id` bigint NOT NULL AUTO_INCREMENT,
`k` int(11) NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
INDEX `k_1` (`k`)
) PARTITION BY KEY(`id`) PARTITIONS 4;

创建列存索引

执行如下SQL创建列存索引:

create clustered columnar index `s1_col_index` on sbtest1(`id`) partition by hash(`id`) partitions 4;

执行如下SQL查看列存索引状态, 当 STATUS 从 CREATE 变为 PUBLIC 则代表已创建成功。

show columnar indexes;

写入数据

insert into sbtest1(k) values(2),(2),(2),(2),(2),(2),(2),(2),(2),(2);

## 如需要更多插入
insert into sbtest1(k) select k from sbtest1 force index (primary);

读取数据

在CN端执行读取 select * from sbtest1;,explain 查看执行计划,如果有 OSSTableScan 则代表从OSS中读取,即读列存的内容:

select * from sbtest1;

explain select * from sbtest1;
## 输出结果如下
mysql> explain select * from sbtest1;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN                                                                                                                                        |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Gather(concurrent=true)                                                                                                                                      |
|   OSSTableScan(tables="s1_col_index_$1783[p1,p2,p3,p4]", shardCount=4, sql="SELECT `id`, `k`, `c`, `pad` FROM `s1_col_index_$1783` AS `s1_col_index_$1783`") |
| HitCache:true                                                                                                                                                |
| Source:SPM_ACCEPT                                                                                                                                            |
| TemplateId: 7dd1173e                                                                                                                                         |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
5 rows in set (0.03 sec)

要读主表可select * from sbtest1 force index(primary)

删除列存索引

执行如下 SQL 删除列存索引

drop index `s1_col_index` on sbtest1;

附录

详细的列存索引使用文档详见:《创建和使用CCI

results matching ""

    No results matching ""