创建列存组件

背景

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 等特性。

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

results matching ""

    No results matching ""