开发者学堂课程【PolarDB-X 开源人才初级认证培训课程:用 PolarDB-X 开发应用】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1075/detail/15542
用 PolarDB-X 开发应用
课程内容:
一、体验 Spring Boot+PolarDB-X 开发
二、体验 WordPress+PolarDB-X 建站
三、PolarDB-X 最佳实践
课程准备
能搭 PolarDB-X 实例,基于此条件开启课程内容
一、体验 Spring Boot+PolarDB-X 开发
找到 Spring Boot,进入 GUIDES。进入 Accessing data with MySQL内容,文档内容基于 MySQL 建立 Spring Boot 的开发框架。把 MySQL替换为 PolarDB-X,认为 PolarDB-X 是 MySQL 两者使用完全一致。
根据文档看使用步骤,第一步下载工程。
git clone
https://github.com/spring-guides/gs-accessing-data-m
ysgl.git
工程下载完毕如下
进入目录
cd into gs-accessing-data-mysql/initial
创建数据库
搭建好基于 K8S 的 PolarDB-X的实例,有一个 wumu-changeset实例,把实例的 MySQL 端口转化到本地。
kc get pxc
NAME VER GMS CN DN CDC PHASE DISK AGE
wumu-changeset 1/1 3/3 3/3-Running 170.9 GiB 8d
~kubectl port-forward svc/wumu-changeset
error: TYPE/NAME and list of ports are required for port-forward See 'kubectl port-forward -h' for help and examples
~ kubectl port-forward svc/wumu-changeset 3306
Forwarding from 127.0.0.1:3306 ->3306
Forwarding from [::1]:3306 -> 3306
测试 MySQL,MySQL 页面里。
根据官方文档建一个 db_example,已经创建库,执行语句。
配置 Spring Boot 数据库里的连接地址 COPY
src/main/resources/application.properties
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_example
spring.datasource.username=springuser spring.datasource.password=ThePassword
建一个 model,COPY 以下文件
src/main/java/com/example/accessingdatamysql/User.java
建一个 controller,COPY 以下文件
src/main/java/com/example/accessingdatamysql/UserRepository.java
创建一个 application,COPY 以下文件
src/main/java/com/example/accessingdatamysql/AccessingApplication.java
运行系统./gradlew bootRun
测试curl localhost:8080/demo/add-d name=first-d
Email=someemail@someeamil provider.com
看数据curl localhost:8080/demo/all
数据库中检查数据是否插入成功,插入成功。
二、体验 WordPress+PolarDB-X 建站
进入 WordPress 的 dockerhub 页面,根据引导搭建 WordPress。
docker pull 拉 WordPress 的计价
docker pull wordpress
Using default tag:lastest
启动 WordPress
docker run--name some-wordpress-p8081-d wordpress
Be8f30ea2d6f832abbf6ef9623587f57ba93b97efe34a988c7c00541a1289df6
查看 WordPress,WordPress 安装引导页面如下,点击现在就开始
用户名 polardbx_root,密码 9q4ltt7bcl4d,数据库主机 localhost:3306
进WordPress库,库建好。
连接出错,重新改主机IP。
WordPress docker 拉取,本地的 MySQL 端口通过 K8S 转化到本地。
修改转化的地址
kubectl port-forward svc/wumu-changeset--address 30.225.188.151 3306
Forwarding from 30.225.188.151.3306->3306
30.225.188.151连WordPress
数据库配置成功,WordPress 默认 MySQL 连接,连接成功表明 PolarDB-X 可完全当作 MySQL 使用。
登录
打开一篇博客,文档更新。
查看文档,数据写到 PolarDB-X 中,WordPress 到此结束。
Spring Boot 和 PolarDB-X 两个框架默认使用 MySQL 开发,通过演示,进入后无脑复制,不用任何配置,可将 PolarDB-X 当作 MySQL使用。使用 PolarDB-X 非常简单,基本可当作 MySQL 使用。
三、PolarDB-X 最佳实践
1.PolarDB-X 架构
PolarDB-X 主要由数个部分组成,主要有 CN、DN、CDC、GMS。CN是计算节点,CN 是数据节点,GMS 元数据中心。CDC 产品中心的组件,负责和下游做数据同步,是全局 binlog 的组件。
组件应用打交道的是 CN,一条 SQL 发来后,经过 CN,CN 做基础校验、解析、执行优化。将优化后的 SQL 发到 DN,DN 做数据的执行,数据最终存在 DN 节点,通过 GMS 管理元数据。
打开 PolarDB-X.com 页面,开源的官方文档,如何选择应用端链接池。使用任何数据库,不管什么开发,第一件事配连接,配连接最主要的是配链接池。
之前配链接池,按照经验,配大概的数值。使用 PolarDB-X 可通过精确的公式,计算出需要多大的链接池。
PolarDB-X 分前端连接和后端连接,前端连接应用到 CN 连接,后端连接 CN 到 DN 的连接。用户不需要关心后端连接,只需关心前端连接,应用到 CN 的连接。
2.QPS 和 RT 的关系
QPS 是每秒的请求数,以秒为单位。RT 是响应时间,以毫秒为单位,与 QPS 差1000的倍数。PolarDB-X 是 MySQL 协议的,请求在每个连接上串行执行,不同连接上的请求可并行执行。单个连接的 QPS上限=1000/RT,1秒=1000毫秒,RT以毫秒为单位,连接 QPS 上限是1000个毫秒里能有多少执行的请求,1000/RT。单个 CN 的 QPS上限是单个连接的 QPS上限*连接数,平均RT为5毫秒,单个连接的QPS上限为200,如果应用预估需要的 QPS 为5000,至少建立250个连接。
3.连接数限制
PolarDB-X 收到请求后,CN 有一个网络模块做限权,权限通过后在CN 内部的线程池里分配一个线程,给连接做相应的请求。PolarDB-X默认维护一个1024大小的线程池,如果并发查询数量超过线程池大小,后续连接排队,连接不能无限大。
实例应用访问单个 CN 的 QPS 上限是单个连接的 QPS 上限MIN×连接数或线程池大小的最小值,以两者最小值的下行为准。
整体数据库QPS上限是单个连接的QPS上限xCN数量
4.示例
(1)示例1
问:查询的平均 RT 为10ms,理想情况下两节点 CN 能提供多少QPS?
答:平均 RT 为10ms,单个连接的QPS上限为100。理想情况下CN有1024线程值,100x1024*2=204800,理想情况下有204800个QPS上限。实际场景下不能做到所有 SQL 并发执行,204800是理想的上限值。
(2)示例2
问:在 CN 规格为16C的PolarDB-X实例上压测,CPU刚好跑满时,某查询的平均RT为5ms。仅考虑 CN 节点,支撑40w的 QPS 应当如何选择实例和设置应用端连接池?
答:平均 RT 为5ms,单个连接的 QPS 上限为200。应用端连接池大小设置为400000/200=2000,需要2000个连接支撑400000QPS。单个CN上限是1024,至少需要两个CN。通过计算,可精确计算出配连接池时,链接池怎样写,写多大。知道公式,可填链接池的数值。
AUTO 模式数据库与DRDS模式数据库。
常见的分布式数据库需要分库、分表键,需要手动管理分库、分表键规则。分布式数据库需要对数据库的数据分布,每张表的结构非常清晰,才能用好分布式数据库。PolarDB-X 提出透明分布式的概念,分布式的细节对用户透明,使用单机数据库,可使用分布式能力,极大降低用户使用分布式数据库的门槛。
从 PolarDB-X5.4.13版本开始,新增支持 AUTO 模式的数据库。对应老版本 DRDS 数据库,分库、分表数据库,用户需要手动管理,分库键和分表键。AUTO 模式的数据库用户可忘记分库、分表键,只需要建单表,不需要关心分表,使用更加方便。
创建数据库 CREATE DATABASE 时加一个参数 MODE AUTO,建出的库是自动分区的库,不带此参数默认建 DRDS 模式数据库。AUTO 数据库可给用户手动指定分区键、分区函数。
5.DRDS 模式数据库如下
执行键表语句,键表CREATE TABLE,一个字段、组件,键出的表是单表,表只存在于某个边上,CREATE TABLE的结构是一张单表。
SHOW FULL CREATE TABLE tb \G
***************1 row*********
Table: tb
Create Table: CREATE TABLE`tb`(
`a`int(11) NOT NULL,
`b`int(11) DEFAULT NULL,
PRIMARY KEY(`a`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set(0.02 sec)
6.AUTO 模式数据库如下
AUTO模式数据库使用同样的键表语句,键出后是分区表,默认用组件进行分区,数据自动在不同的CN之间均衡的打散。
通过SHOW FULL CREATE TABLE 看结构,PARTITION BY KEY(`a`) ,
PARTITIONS 是16,默认是16分区。此模式使用键单表的方式,键一个分区表。
SHOW FULL CREATE TABLE tb \G
***************1 row*********
TABLE:tb
CREATE TABLE: CREATE PARTITION TABLE`tb’(
a`int(11) NOT NULL,
`b`int(11) DEFAULT NULL,
PRIMARY KEY(`a`)
)ENGINE =InnoDB DEFAULT CHARSET=utf8mb4
PARTITION BY KEY(`a`)
PARTITIONS 16
1 row in set (0.01 sec)
AUTO 模式数据库使用方便,可手动指定分区函数,支持HASH、RANG
LIST 等分区函数,DRDS 模式只有HASH。两者的路由算法不同,路由算法是数据按照什么规则分散到不同的节点上,分散的规则叫做路由算法。DRDS 模式和AUTO模式有很大区别,DRDS 模式用简单的HASH做数据路由,新增变更区,所有数据都需要进行rehash,造成不必要的性能损耗。如果数据太大,构成非常慢。
分区表模式的算法使用range一致性HASH算法,做分区新增时,只需要改目标分区附近的数据,不需要改变所有数据,造成的影响非常小,非常灵活。
7.AUTO 模式典型场景
热点分裂,分布式数据库下最担心出现热点数据。淘宝里有大卖家和小卖家,大卖家的流量是其他小卖家的成千上万倍,访问大卖家的请求,常常影响访问小卖家。热点数据出现对整个分布式数据库进行损耗,所有资源集中到热点数据中,非热点数据分配不到资源。
AUTO 模式的解决方案,把热点数据迁移到新的分区,把分区移到单独 DN,DN 专门为热点数据提供服务。把热点数据分开,用专门 DN提供服务,不影响其他非热点数据。放在单独 DN,不能支撑业务,把热点数据再进行分区,热点数据打散后分散到其他 DN 节点上。进一步拆开热点,利用分布式的 LIST 能力处理请求。
8.分区调度
AUTO 模式有更灵活的调度力度,传统模式以库为单位,分库与分表的位置是强绑定的。表非常大,需要以分库级别把表迁移,分库很大,怎样迁都出现 DN 不均衡。
AUTO 可以分区为主进行迁移,P1数据量大,做与 DN 进行均衡,P1进行再划分,分为P1-1、P1-2,把P1-1移到另一个 DN 上,以分区为主做迁移,可灵活解决数据间不均衡问题。
9.TTL
有些业务随着数据的推移,不需要老数据。数据按修改时间进行分区,隔一个月分一个区,数据12个月自动过期,功能可很好满足TTL业务,按照分区自动删除过期的分区。
10.Locality
进一步指定数据放在哪里,特殊的业务场景需要把数据放到特定、就近的 DN 上。通过 Locality 参数把指定的库放到指定的 DN 上,把某一张逻辑表放到指定 DN 上。
可按某一分区做数据划分
TABLE orders_region(
t,
ry varchar(64),
/archar(64),
_time datetime not null)
[ON BY LIST COLUMNS(countrycity)
[TION p1 VALUES IN((China’'Hangzhou’),(China’'Beiiing))LOCALITY=
dn=xc-xdb-s-pxce)
[TION p2 VALUES IN ((United States’'NewYork’)(United StatesChicag
o))LOCALITY='dn=p
[TION p3 VALUES IN(('Russian’Moscow’))LOCALITY='dn=pxc-xdb-s-
pxcexample3'
11.性能
自动分区是否因为做自动构成导致性能损耗
对比发现,oltp 点查情况下,AUTO 与 DRDS 数据库几乎持平,有略微降低,AUTO 路由算法比普通算法复杂,有略微下低。oltp_read_
only 和 oltp_read_write 中,性能大大提高,oltp 执行过程中 AUTO比较好的分区优化,得益于优化的过程,读写的情况下性能提高33%以上。
通过最佳实践讲解、实操,体会到使用 PolarDB-X 像使用 MySQL一样简单,基本秒复制,不需要任何改动。最佳实践从原理上PolarDB-X 极大降低了使用分布式的门槛,提高分布式数据库强大的能力,使用 PolarDB-X 分布式数据库非常简单。