1.什么是分布式数据库

分布式数据库,是相对于单体数据库而言的,
简单的说,分布式数据库就是用分布式架构实现的数据库。

当前分布式数据库可以分为三个技术方向,

  • 一是以 DRDS、TDSQL 等为代表的 Sharding 技术,其最大的优势在于继承了 MySQL 存储多年的的技术积累;

  • 二是以 Cockroach/YugabyteDB/TiDB 为代表的NewSQL,最大的优势在于全自研的技术栈,提供了水平伸缩和原生分布式的能力,重点以 Raft/Paxos 数据高可用、分布式强一致事务为典型技术,满足用户对于分布式下数据一致性的要求;

  • 三是以 PolarDB/Aurora 为代表的云原生DB,特点是基于云的虚拟化的技术,提供资源池化的能力。

关于PolarDB-X 如何牛逼,我们就不在这里介绍了,有兴趣可以搜一搜。

接下来,本文主要介绍PolarDB-X架构和安装方式。

2.PolarDB-X 是什么样的存在

2.1 产品架构

在这里插入图片描述

PolarDB-X整个架构核心分为4部分:

  • CN(全称:Compute Node/计算节点,代号GalaxySQL),主要提供分布式SQL引擎,解决分布式事务协调、优化器、执行器等。
  • DN(全称:Data Node/存储节点,代号GalaxyEngine),主要提供数据存储引擎,比如InnoDB和自研存储引擎(X-Engine和神秘列存),解决数据一致性和持久化,并提供计算下推能力满足分布式要求,可支持本地盘和共享存储。
  • GMS(全称:Global Meta Service/全局元数据服务),主要提供分布式下元数据和全局授时服务,比如TSO、表的metadata信息等。
  • CDC(全称:Change Data Capture/日志节点,代号GalaxyCDC)负责全局增量日志的生成、分发和订阅。通过GalaxyCDC,PolarDB-X 数据库可以对外提供完全兼容 MySQL Binlog 格式和协议的增量日志,可实现与 MySQL Binlog 下游生态工具的无缝对接。

2.2 物理拓扑

在这里插入图片描述

PolarDB-X在交互上提供面向后台的数据库管控和用户控制台,并提供OpenAPI,用户可以基于OpenAPI完成管控集成。

PolarDB-X提供数据库实例化,实例规格有8c32g/32c128g等。

一个实例在物理上会有4种资源组成:

  • 三副本的GMS
  • 一组CN节点(计算节点)
  • 一组DN节点(存储节点)
  • 一组CDC(提供全局binlog)

组件之间会进行元数据和RPC请求的交互。

不同的实例规格的最大区别在于CN/DN节点数量的不同,实例规格会和CN/DN节点数保持线性一致。

对于外部用户的使用来说,一个PolarDB-X的实例最终会通过接入点(endpoint)的vip/dns来访问,对于用户的感觉就是一个MySQL实例,可以使用MySQL命令行、GUI客户端等进行访问。

3. 部署PolarDB-X

PolarDB-X的部署方式主要包括 通过 PXD 部署、通过 K8S 部署、通过源码编译部署等。

接下里以 PXD的部署方式介绍安装和使用。

通过 PXD 工具部署 PolarDB-X 数据库需要先安装 Python3 和 Docker。

安装 Python3 ,如果是Mac,可以使用 brew install python。更多具体安装方式可以网上搜索。
安装 Docker Desktop for Mac,参考文档:https://docs.docker.com/desktop/mac/install/

3.1 安装PXD

python3 -m venv venv
source venv/bin/activate

# 安装前建议先执行如下命令升级 pip
pip install --upgrade pip

pip install pxd

3.2 部署 PolarDB-X

直接运行 pxd tryout 命令会创建一个最新版本的 PolarDB-X 数据库,其中 GMS, CN, DN, CDC 节点各 1 个:

pxd tryout

也可以指定 CN,DN, CDC 节点的个数以及版本,命令如下:

pxd tryout -cn_replica 1 -cn_version latest -dn_replica 1 -dn_version latest -cdc_replica 1 -cdc_version latest

tryout 模式创建的 GMS 和 DN 默认采用单副本模式,如果想创建基于 Paxos 的三副本的集群,使用如下命令:

pxd tryout -leader_only false

output:

pxd tryout
/Users/lanyangyang/workspace/venv/lib/python3.9/site-packages/deployer
Start creating PolarDB-X cluster pxc-tryout on your local machine
PolarDB-X Cluster params:
 * cn count: 1, version: latest
 * dn count: 1, version: latest
 * cdc count: 1, version: latest
 * gms count: 1, version: latest
 * leader_only: True
Processing  [------------------------------------]    0%    pre check
Processing  [##----------------------------------]    7%    generate topology
Processing  [#####-------------------------------]   15%    check docker engine version
Processing  [########----------------------------]   23%    pull images
Pull image: polardbx/galaxysql:latest at 127.0.0.1


latest:Pulling from polardbx/galaxysql
... ...

Status: Downloaded newer image for polardbx/galaxycdc:latest
Processing  [###########-------------------------]   30%    create gms node



Processing  [#############-----------------------]   38%    create gms db and tables
Processing  [################--------------------]   46%    create PolarDB-X root account
Processing  [###################-----------------]   53%    create dn
Processing  [######################--------------]   61%    register dn to gms
Processing  [########################------------]   69%    create cn
Processing  [###########################---------]   76%    wait cn ready
Processing  [##############################------]   84%    create cdc containers
Processing  [#################################---]   92%    wait PolarDB-X ready
Processing  [####################################]  100%


PolarDB-X cluster create successfully, you can try it out now.
Connect PolarDB-X using the following command:

    mysql -h127.0.0.1 -P62450 -upolardbx_root -pxxxx

PolarDB-X 数据库创建完成后,会输出对应的连接信息。

通过MySQL命令行连接 PolarDB-X实例,执行如下 SQL 初步体验 PolarDB-X 的分布式特性。

检查GMS

> select * from information_schema.schemata;
+--------------+--------------------+----------------------------+------------------------+----------+--------------------+
| CATALOG_NAME | SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | DEFAULT_ENCRYPTION |
+--------------+--------------------+----------------------------+------------------------+----------+--------------------+
| def          | information_schema | utf8                       | UTF8_GENERAL_CI        | NULL     | NO                 |
+--------------+--------------------+----------------------------+------------------------+----------+--------------------+
1 row in set (1.59 sec)

创建分区表

create database polarx_example partition_mode='partitioning';

use polarx_example;

create table example (
  `id` bigint(11) auto_increment NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `score` bigint(11) DEFAULT NULL,
  primary key (`id`)
) engine=InnoDB default charset=utf8 
partition by hash(id) 
partitions 8;

插入数据

insert into example values(null,'lily',375),(null,'lisa',400),(null,'ljh',500);
mysql> select * from example;
+----+------+-------+
| id | name | score |
+----+------+-------+
|  3 | ljh  |   500 |
|  1 | lily |   375 |
|  2 | lisa |   400 |
+----+------+-------+
3 rows in set (0.09 sec)
mysql> show topology from example;
+------+-----------------------------+---------------+----------------+-----------------------+-----------------+
| ID   | GROUP_NAME                  | TABLE_NAME    | PARTITION_NAME | PHY_DB_NAME           | DN_ID           |
+------+-----------------------------+---------------+----------------+-----------------------+-----------------+
|    0 | POLARX_EXAMPLE_P00000_GROUP | example_00000 | p1             | polarx_example_p00000 | pxc-tryout-dn-0 |
|    1 | POLARX_EXAMPLE_P00000_GROUP | example_00001 | p2             | polarx_example_p00000 | pxc-tryout-dn-0 |
|    2 | POLARX_EXAMPLE_P00000_GROUP | example_00002 | p3             | polarx_example_p00000 | pxc-tryout-dn-0 |
|    3 | POLARX_EXAMPLE_P00000_GROUP | example_00003 | p4             | polarx_example_p00000 | pxc-tryout-dn-0 |
|    4 | POLARX_EXAMPLE_P00000_GROUP | example_00004 | p5             | polarx_example_p00000 | pxc-tryout-dn-0 |
|    5 | POLARX_EXAMPLE_P00000_GROUP | example_00005 | p6             | polarx_example_p00000 | pxc-tryout-dn-0 |
|    6 | POLARX_EXAMPLE_P00000_GROUP | example_00006 | p7             | polarx_example_p00000 | pxc-tryout-dn-0 |
|    7 | POLARX_EXAMPLE_P00000_GROUP | example_00007 | p8             | polarx_example_p00000 | pxc-tryout-dn-0 |
+------+-----------------------------+---------------+----------------+-----------------------+-----------------+
8 rows in set (0.01 sec)

检查CDC

mysql> show master status ;
+---------------+----------+--------------+------------------+-------------------+
| FILE          | POSITION | BINLOG_DO_DB | BINLOG_IGNORE_DB | EXECUTED_GTID_SET |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000001 |        4 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.78 sec) 

show binlog events in 'binlog.000001' from 4;

检查DN

mysql> show storage;
+-----------------+------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
| STORAGE_INST_ID | LEADER_NODE      | IS_HEALTHY | INST_KIND | DB_COUNT | GROUP_COUNT | STATUS | DELETABLE | DELAY | ACTIVE |
+-----------------+------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
| pxc-tryout-dn-0 | 172.17.0.3:16689 | true       | MASTER    | 1        | 1           | 0      | false     | null  | null   |
| pxc-tryout-gms  | 172.17.0.2:17415 | true       | META_DB   | 2        | 2           | 0      | false     | null  | null   |
+-----------------+------------------+------------+-----------+----------+-------------+--------+-----------+-------+--------+
2 rows in set (0.02 sec)

检查CN

mysql> show mpp;
+------------+------------------+------+--------+
| ID         | NODE             | ROLE | LEADER |
+------------+------------------+------+--------+
| pxc-tryout | 172.17.0.4:62452 | W    | Y      |
+------------+------------------+------+--------+
1 row in set (0.01 sec)

查看 PolarDB-X 状态

执行如下命令,查看当前环境的 PolarDB-X 列表:

(venv)  ~/workspace> pxd list
/Users/lanyangyang/workspace/venv/lib/python3.9/site-packages/deployer
NAME                          CN        DN        CDC       STATUS
pxc-tryout                    1         1         1         running

清理 PolarDB-X
执行如下命令,即可清理本地环境所有的 PolarDB-X:

(venv)  ~/workspace > pxd cleanup
/Users/lanyangyang/workspace/venv/lib/python3.9/site-packages/deployer
Prepare to delete all PolarDB-X clusters
All PolarDB-X clusters will be deleted, do you want to continue? [y/N]: y
Prepare to delete PolarDB-X cluster: pxc-tryout
stop and remove container: pxc-tryout-cn-DmUZ-62450, id: e04d9b3925 at 127.0.0.1
stop and remove container: pxc-tryout-cdc-Ssvv, id: f3bfd66e1f at 127.0.0.1
stop and remove container: pxc-tryout-gms-Cand-17415, id: b26d81089d at 127.0.0.1
stop and remove container: pxc-tryout-dn-0-Cand-16689, id: ea2f00e4ea at 127.0.0.1

4.参考

github地址

PolarDB-X官方知乎账号

PolarDB-X 开源系列课程

DOC

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐