创建列存组件
背景
- 元数据服务(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 等特性。
PXD 创建的 PolarDB-X 集群默认不开启列存组件,本文介绍如何创建开启列存组件的 PolarDB-X 集群。
注意事项
- 需要前置安装 PXD 工具,如何安装参考文档:安装 PXD
- PXD 版本需要 >= 0.7.0
- 列存组件依赖 CDC,开启列存组件需要同时开启CDC
- 列存功能要求 CN,COLUMNAR 组件的内存 >= 16GB
创建 PolarDB-X 集群
首先执行如下命令获取 PolarDB-X 各个组件的最新镜像版本(需要填入YAML文件):
curl -s "https://polardbx-opensource.oss-cn-hangzhou.aliyuncs.com/scripts/get-version.sh" | sh
输出内容如下所示(以 PolarDB-X V2.4.0 版本为例):
CN polardbx/polardbx-sql:v2.4.0_5.4.19
DN polardbx/polardbx-engine:v2.4.0_8.4.19
CDC polardbx/polardbx-cdc:v2.4.0_5.4.19
COLUMNAR polardbx/polardbx-columnar:v2.4.0_5.4.19
编写如下的 pxd-columnar.yaml 文件,指定 PolarDB-X 企业版集群的名称以及 GMS, CN,DN,CDC,COLUMNAR 的部署节点及版本。
需要替换 yaml 中的
version: v1
type: polardbx
cluster:
name: pxd-columnar
gms:
image: polardbx/polardbx-engine:v2.4.0_8.4.19
host_group: [172.16.201.11]
resources:
mem_limit: 8G
cn:
image: polardbx/polardbx-sql:v2.4.0_5.4.19
replica: 1
nodes:
- host: 172.16.201.11
resources:
mem_limit: 16G
dn:
image: polardbx/polardbx-engine:v2.4.0_8.4.19
replica: 1
nodes:
- host_group: [172.16.201.11,172.16.201.18,172.16.201.19]
resources:
mem_limit: 8G
cdc:
image: polardbx/polardbx-cdc:v2.4.0_5.4.19
replica: 2
nodes:
- host: 172.16.201.11
- host: 172.16.201.19
resources:
mem_limit: 4G
columnar:
image: polardbx/polardbx-columnar:v2.4.0_5.4.19
# 目前支持 OSS,EXTERNAL_DISK 两种存储引擎
engine: OSS
replica: 2
nodes:
- host: 172.16.201.18
- host: 172.16.201.19
resources:
mem_limit: 16G
- 其它相关参数说明详见:通过 PXD 部署集群
- 列存重点参数说明
- columnar.engine 指定了列存数据的存储引擎,目前 PolarDB-X 支持阿里云 OSS 和 NFS 文件系统,对应的取值是 OSS 和 EXTERNAL_DISK。需要在集群创建时指定存储类型,创建后无法更改。默认存储类型:OSS。
- 如果使用 NFS 存储类型,NFS 需要提前挂载到 CN 和 COLUMNAR所在机器的 /home/{user}/.pxd/nfs 目录下,PXD 创建集群的时候会默认将该目录挂载至CN 和 COLUMNAR 容器呢。
执行如下命令,即可一键部署 PolarDB-X 集群:
pxd create -file pxd-columnar.yaml
部署完成后,pxd 会输出 PolarDB-X 集群的连接方式,通过 MySQL 命令行即可登录 PolarDB-X 数据库进行测试。
配置列存组件存储
PolarDB-X 支持阿里云 OSS 和 NFS 文件系统作为列存索引的存储。
阿里云 OSS
登录 PolarDB-X,修改如下SQL中的需要修改 file_uri,access_key_id 与 access_key_secret 字段,然后执行创建 OSS 的配置:
create filestorage oss with ('file_uri' = 'oss://****/', 'endpoint'='oss-cn-hangzhou.aliyuncs.com', 'access_key_id'='****', 'access_key_secret'='*****');
NFS 文件系统
登录 PolarDB-X,执行如下SQL创建 NFS 的配置:
create filestorage external_disk with ('file_uri' = 'file:///home/admin/polardbx-external-disk')
创建和使用列存索引
下面通过一个例子介绍如何快速创建和使用列存索引。
建库建表
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》