列存组件创建
背景
- 元数据服务(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 集群中创建列存组件。
前置条件
- PolarDB-X Operator 升级到 1.6.0 及以上版本
- 列存组件依赖 CDC,开启列存组件需要同时开启两个CDC
- 提前配置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》