历史上MySQL是伟大的在水平阅读规模。提供的扩展,在这种情况下,不同数量的副本节点,无论如果使用标准的异步复制或同步复制。
然而,这些解决方案不提供相同级别的比例为写操作。
为什么?因为解决方案仍然依靠在一个节点作为主要工作。对于multi-Primary,写将分布式事务。在这两种情况下,当使用virtually-synchronous复制,这个过程需要每个节点的认证和地方(节点)写;因此,写的数量而不是分布在多个节点复制。
这背后的主要原因是,MySQL是一个关系数据库管理系统(RDBMS),以及任何数据,是写在它必须尊重RDBMS规则。简而言之,任何书面的数据必须与数据一致。为达到这一目的,需要检查数据与现有的通过定义和约束关系。这个动作是影响非常大的数据集,可以非常昂贵。考虑用数百万行更新一个表引用另一个表与另一个几百万行。
一个图像可以帮助:
每次我将插入一个订单,我必须确保所有的相关元素和一致的。
这个操作是相当昂贵的但我们的数据库可以运行它在几毫秒,多亏了一些优化,允许节点执行他们中的大多数在内存中没有或很少访问海量存储器。
整个数据结构的关键因素是驻留在相同的位置(节点),方便操作。
一旦我们明白,它也将成为清楚为什么我们不能有关系数据在多个节点分裂,分发写表。如果我只有一个节点,管理项目,另一个订单,和另一个支付,我需要解决方案能够处理分布式事务,每一种都需要认证和验证其他节点的数据。
这种程度的分布将严重影响操作的效率,这将显著增加响应时间。这是它。没有什么是不可能的;然而,演出将非常影响,每个操作可能需要秒而不是毫秒或一小部分,除非取消的一些规则打破了关系模型。
以及其他RDBMS, MySQL是设计工作尊重规模模型,不能以任何方式被分裂和分布模式,规模可以做什么?
替代方法是一致的数据集分割成碎片。一致的数据集是什么?这一切都取决于我们正在处理的信息。记住上面的例子,我们有一个网上购物服务多个客户,我们需要确定哪些是最有效的方式把数据。
例如,如果我们试图将数据产品类型(书籍、CD / DVD等),我们将有一个巨大的重复的数据与客户/订单/发货等等,所有这些数据也很动态我会有客户经常订购的事情。
为什么复制数据?因为如果我不重复的数据,我不知道如果客户已经购买或具体项目,否则我将不得不又问关于装运地址等等。这也意味着,当一个客户买东西或把愿望清单上的东西,我必须协调所有集群节点中的数据。
另一方面,如果我选择把我的数据由客户的居住的国家,我将不得不重复的唯一数据并保持同步的相关产品,其中最具活力的一个库存数量。当然,除非我可以组织产品的国家,如今这有点不寻常,但并非不可能。
另一个可能的情况是如果我是一个健康组织和管理几家医院。对于上面的示例,它将被医院容易分裂我的数据,鉴于大多数病人有关的数据绑定到医院本身,以及治疗和其他医院管理相关的元素。相反,它将毫无意义将病人的居住的国家。
这种技术把数据分解为更小的片段分片,目前我们必须RDBMS规模水平的唯一途径。
在MySQL开源生态系统,我们只有两种合并方式进行切分,维塔斯和ProxySQL。第一个是一个完整的解决方案,数据库的所有权和管理其业务的几乎所有方面在分片的环境中,包括很多具体特性等dba处理日常运营表修改,备份等等。
尽管这可能看起来不错,它也有一些附加条件,包括环境的复杂性和专有的。让维塔斯适合“复杂”分片场景其他解决方案可能还不够。
ProxySQL没有分片机制”本身”,但鉴于其工作方式和特性,它允许我们构建简单的分片解决方案。
重要的是要注意,大多数DBA操作仍将DBA执行,以增加复杂性给分片环境。
还有第三个选择感知应用程序分片。
该解决方案将应用程序意识到需要将数据分割成更小的碎片和内部数据指向不同的“连接器”连接到多个数据源。
在这种情况下,应用程序是意识到客户的国家,将重定向与他相关的所有操作数据源负责特定的片段。
通常这种解决方案需要完整的代码设计和注射时可能非常难以实现在最初的代码架构定义。
另一方面,如果在设计完成的,它可能是最好的解决方案,因为它将允许应用程序定义切分规则,还可以使用不同的技术优化不同数据源的不同用途。
一个例子可以使用RDBMS的大部分时间在线事务处理(OLTP)数据共享的国家,与一个不同的产品作为分布式内存缓存技术。同时,所有的数据相关的订单,付款,和客户历史可以合并在一个数据仓库用于生成报告。
说,最后一个可能是最强大的,可伸缩的,并且难以设计,不幸的是,它可能代表了目前不到5%的解决方案部署。
很少的情况下,需要有一个完整的系统/解决方案提供可伸缩性和分片。
通过经验,大部分需求水平扩展了在这个简单的场景中,哪里有需要实现分片和数据分离,经常与sharding-nothing架构。在无共享,每个碎片都可以生活在一个完全独立的逻辑模式实例/物理数据库服务器/数据中心/大陆。没有持续的需要保留共享访问(从碎片)到另一个分区表在其他碎片。
POC的
为什么这个POC吗?
多年来,我遇到很多客户讨论扩展他们的数据库解决方案,看着非常复杂的分片维塔斯是第一个也是唯一一个路要走。
这甚至没有考虑如果他们需要推动他们的真实的。
以我的经验和几个同事聊天,我不是一个人在分析真正的需求。与各方讨论影响后,只有一个非常小的比例的客户实际需要复杂的解决方案。大多数人只是试图避免一个项目,该项目将实现简单的无共享的解决方案。为什么?因为很明显,这是简单的数据迁移到一个平台,为你做所有比接受一点额外的工作,挑战开始但保持一个简单的方法。同时,要最后一个闪亮的东西总有它的魔力。
最重要的是,随着Kubernetes的兴起和MySQL运营商,很多困惑开始流传,其中大部分是由总缺乏理解,数据库和关系数据库是两个独立的事情。缺乏理解的差异和附加到RDBMS的实际问题带来了一些谈论水平扩展数据库,涉及肤浅,没有澄清如果他们谈论RDBMS。因此,一些澄清长是因为以及把KISS原则为主要焦点。
鉴于此,我认为刷新ProxySQL如何帮助构建一个简单的切分方案可能有助于澄清问题,重置的期望和展示我们可以用一种更简单的方法做事情。(见我的老帖子,MySQL分片与ProxySQL。)
为此,我做了一个简单的POC,演示了如何使用雷竞技下载官网Percona运营商MySQL(POM)和ProxySQL构建分片环境与一些标准的好级别的自动化操作,比如备份/恢复软件升级和资源扩展。
为什么ProxySQL ?
在接下来的例子中,我们模拟一个我们需要的情况一个简单的切分方案,这意味着我们需要将数据重定向到不同的数据容器,保持数据库维护操作。在这个情况下,我们不需要实现一个完整的切分系统如维塔斯。
如前所述,使用ProxySQL允许我们建立一个共同的应用程序的入口点,然后重定向流量的基础上确定分片键。它还将使我们能够读/写流量重定向到主和只读交通辅助。
另一个有趣的事情是,我们可以有ProxySQL作为应用程序的一部分,或作为一个独立的服务。最佳实践表明,拥有ProxySQL接近应用程序将更有效,特别是如果我们决定激活缓存功能。
为什么POM ?
雷竞技下载官网Percona运营商MySQL有三个主要的解决方案:雷竞技下载官网Percona运营商为Percona XtraDB集群Pe雷竞技下载官网rcona运营商为MySQL组复制和Percona运营商为MySQL Percona服务器。前两个是基于virtually-synchronous复制和允许集群保持所有舱数据状态一致,保证服务总是提供一致的数据。美丽的背景下,我们可以看到POM作为一个服务与本地读取横向扩展,而对于写道,我们将采用提到切分方法。
使用POM-based解决方案的另一个重要方面是与自动化。部署POM,你将能够设置自动备份、软件更新、监控(使用raybet雷竞技竞猜在线官网raybetapp官方下载 (PMM)),和最后但并非最不重要,可能规模向上或向下只是通过改变所需的资源。
使用的元素
在我们的POC中,我将使用一种修改版的sysbench (https://github.com/Tusamarco/sysbench一个额外的字段)大陆我将使用作为一个分片键。目前,这个简单的POC的目的,我只会有两个碎片。
如上图中所示,我们有一个简单的部署,但足以说明切分的方法。
我们有:
- 应用程序(s)节点(s) -这是真的取决于你,如果你想测试一个应用程序节点或更多。不会发生任何改变,以及ProxySQL节点,但是请记住,如果您使用多个ProxySQL节点最好激活内部集群支持或使用高同步。
- 碎片是基于POM PXC;它有以下:
- 服务入口点负载均衡器
- 入口点r / w
- 只读的入口点
- 三个豆荚Haproxy
- Haproxy容器
- Pmm剂容器
- 三个吊舱与数据节点(PXC)
- PXC集群节点的容器
- 日志流
- Pmm容器
- 备份/恢复服务
- 切分的两个基于POM Percona服务器MySQL和组复制雷竞技下载官网(技术预览版)
- 服务入口点负载均衡器
- 入口点r / w
- 入口点只读
- 三个豆荚MySQL路由器(测试)
- MySQL路由器容器
- 三舱数据节点与GR (PS)
- PS gr集群节点的容器
- 日志流
- Pmm容器
- 备份/恢复调度程序
- 服务入口点负载均衡器
现在你可能已经注意到,表示节点的大小是不同的;这不是一个错误而画。这表明我有分配更多的资源(CPU和内存)比shard2 shard1。为什么?因为我可以和我模拟一个shard2流量少,至少暂时,因此我不想给它shard1一样的资源。我最终会增加他们如果我看到的需要。
的设置
数据层
让我们从简单的开始,数据层配置。正确配置环境是关键,为此,我使用一个工具,我写了具体计算k8 POM环境中所需的配置。你可以在这里找到它(https://github.com/Tusamarco/mysqloperatorcalculator)。
一旦你编译并运行它,您可以简单地问什么支持“维度”,或者你可以定义一个自定义级别的资源,但你仍然需要显示预期的负载级别。在任何情况下,请参阅自述在存储库中所有的指令。
的完整cr.yaml PXC shard1在这里,而一个PS-GR在这里。
Shard1:我要求资源覆盖2型(光OLTP)的交通,配置类型1000 (2 xlarge)连接。
Shard2:我要求资源覆盖交通2型(光OLTP),配置2型(小),100个连接。
CRs定义之后,您可以按照官方指南设置环境:
现在是时候去看ProxySQL设置。
ProxySQL和切分规则
如前所述,我们将测试负载分片大陆,我们知道ProxySQL不会自动分片环境管理提供额外的帮助。
考虑到这样做的方法之一是创建一个DBA帐户/碎片或注入碎片信息的命令而执行。我将使用更少的舒适来证明如果成功的话,不同的管理员帐户。
我们将有两个碎片:切分关键是欧洲大陆,大陆将分组如下:
- 碎片一:
- 亚洲
- 非洲
- 南极洲
- 欧洲
- 北美
- 碎片二:
- 大洋洲
- 南美
dba用户:
- dba_g1
- dba_g2
应用程序用户:
- app_test
主持人组会:
- 碎片之一
- 100年读和写
- 101年只读
- 切分两
- 200年读和写
- 201年只读
一旦被定义,我们需要确定哪些查询规则将为我们服务和如何。我们想要的是重定向所有传入的查询:
- 亚洲、非洲、南极洲、欧洲和北美shard1。
- 大洋洲和南美洲shard2
- 将在R / W和只读查询
- 防止任何查询的执行没有碎片的关键
- 定期备份数据并将其存储在一个安全的地方
鉴于上述,我们首先定义的规则dba账户。
我们设置为每一个DBA Hostgroup然后如果查询匹配切分规则,我们把输出重定向到正确的切分。否则,HG仍将作为集。
这使我们能够执行查询创建/删除表没有问题,但在我们的碎片将使我们能够在需要时发送数据。
例如,下面是查询的输出sysbench将运行。
准备:
|
1
|
插入
成
windmills_test1
/ *亚洲大陆= * /
(uuidmillid kwatts_s,日期、位置、大陆、活跃,strrecordtype)
值(UUID(),79年,3949999,现在(),“mr18n2L9K88eMlGn7CcctT9RwKSB1FebW397”,“亚洲”0,“quq”)
|
在这种情况下,我有应用程序简单地注入评论INSERT SQL声明分片键;给我使用帐户dba_g1创建/准备模式,将使用32/32规则并给予我洞穴应用= 1,ProxySQL将退出查询规则解析和有关hostgroup发送命令。
运行:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
选择
id,millid,
日期大陆,活跃,kwatts_s
从
windmills_test1
在哪里
id
之间的
吗?
和
吗?
和
大陆=南美的
选择
总和(kwatts_s)
从
windmills_test1
在哪里
id
之间的
吗?
和
吗?
和
活跃的=1
和
大陆=“亚洲”
选择
id,millid,
日期大陆,活跃,kwatts_s
从
windmills_test1
在哪里
id
之间的
吗?
和
吗?
和
大陆=大洋洲的
命令
millid
选择
截然不同的
millid,大陆,活跃,kwatts_s
从
windmills_test1
在哪里
id
之间的
吗?
和
吗?
和
活跃的= 1
和
大陆=大洋洲的
命令
millid
更新
windmills_test1
集
主动= ?
在哪里
id = ?
和
大陆=“亚洲”
更新
windmills_test1
集
strrecordtype = ?
在哪里
id = ?
和
大陆=北美的
删除
从
windmills_test1
在哪里
id = ?
和
大陆=“南极洲”
插入
成
windmills_test1
/ *南极洲大陆= * /
(身份证、uuidmillid kwatts_s,日期、位置、大陆、活跃,strrecordtype)
值
(?,
UUID(),?,?,
现在(),?,?,? ?)
重复关键更新
kwatts_s=kwatts_s+1
|
上述测试期间执行。在所有的分片键存在,在WHERE子句中或作为一个评论。
当然,如果我没有分片键,执行其中一个防火墙规则将停止查询执行,例如:
|
1
2
|
mysql>
选择
id,millid,
日期大陆,活跃,kwatts_s
从
windmills_test1
在哪里
id
之间的
吗?
和
?;
错误1148年(42000):它
是
不可能的
来
重定向这命令
来
一个定义碎片。请是确定你有的大陆定义
在
你的查询,
或
那你
使用
一个定义DBA账户(dba_g {1/2})
|
检查在这里完整的命令列表。
设置数据集
一旦规则设置,该设置模式和数据使用sysbench (https://github.com/Tusamarco/sysbench)。记住要使用windmills_sharding测试。
第一个操作模式是建立在SHARD2没有用数据填充它。这是一个DBA行动;因此,我们将执行它使用dba_g2帐户:
|
1
|
sysbench
。
/
src
/
lua
/
windmills_sharding
/
oltp_read
.lua
- - -
mysql
- - - - - -
主机
=
10.0.1.96
- - -
mysql
- - - - - -
港口
=
6033年
- - -
mysql
- - - - - -
用户
=
dba_g2
- - -
mysql
- - - - - -
密码
=
xxx
- - -
mysql
- - - - - -
db
=
windmills_large
- - -
mysql_storage_engine
=
innodb
- - -
db
- - - - - -
司机
=
mysql
- - -
表
=
4
- - -
table_size
=
0
- - -
table_name
=
风车
- - -
mysql
- - - - - -
忽略
- - - - - -
错误
=
所有
- - -
线程
=
1
准备
|
设置table_size和指向ProxySQL IP /端口将会做什么,我将有以下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
|
mysql>
选择
current_user(),@@hostname;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
current_user()|@@hostname|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1
行
在
集
(0.01sec)
mysql>
使用
windmills_large;
数据库
改变了
mysql>
显示
表;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|Tables_in_windmills_large|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|windmills1|
|windmills2|
|windmills3|
|windmills4|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
4
行
在
集
(0.01sec)
mysql>
选择数(*)
从
windmills1;
+ - - - - - - - - - - - +
|
数(*)|
+ - - - - - - - - - - - +
|0|
+ - - - - - - - - - - - +
1
行
在
集
(0.09sec)
|
都准备好了,但空。
现在让我们做同样的事情,但另一个DBA用户:
|
1
|
sysbench
。
/
src
/
lua
/
windmills_sharding
/
oltp_read
.lua
- - -
mysql
- - - - - -
主机
=
10.0.1.96
- - -
mysql
- - - - - -
港口
=
6033年
- - -
mysql
- - - - - -
用户
=
dba_g1
- - -
mysql
- - - - - -
密码
=
xxx
- - -
mysql
- - - - - -
db
=
windmills_large
- - -
mysql_storage_engine
=
innodb
- - -
db
- - - - - -
司机
=
mysql
- - -
表
=
4
- - -
table_size
=
400年
- - -
table_name
=
风车
- - -
mysql
- - - - - -
忽略
- - - - - -
错误
=
所有
- - -
线程
=
1
准备
|
如果我现在做的与用户dba_g2上面的选择:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
mysql>
选择
current_user(),@@hostname;选择数(*)
从
windmills1;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
current_user()|@@hostname|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1
行
在
集
(0.00sec)
+ - - - - - - - - - - - +
|
数(*)|
+ - - - - - - - - - - - +
|113年|
+ - - - - - - - - - - - +
1
行
在
集
(0.00sec)
|
而如果我重新连接和使用dba_g1:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
mysql>
选择
current_user(),@@hostname;选择数(*)
从
windmills1;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
current_user()|@@hostname|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1
行
在
集
(0.00sec)
+ - - - - - - - - - - - +
|
数(*)|
+ - - - - - - - - - - - +
|287年|
+ - - - - - - - - - - - +
1
行
在
集
(0.01sec)
|
我还可以检查ProxySQL看到哪些规则是使用:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
|
选择
活跃,点击率,destination_hostgroup,mysql_query_rules.rule_id,match_digest,match_pattern,replace_pattern,cache_ttl,运用,flagIn flagOUT
从
mysql_query_rules
自然
加入
stats.stats_mysql_query_rules
命令
mysql_query_rules.rule_id;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
|支安打|destination_hostgroup|rule_id|match_digest|match_pattern|应用|flagIN|flagOUT|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
|3261年|One hundred.|20.|
零
|
零
|0|0|500年|
|51|200年|21|
零
|
零
|0|0|600年|
|2320年|One hundred.|31日|
零
|scontinents * (= |就像)*‘*(亚洲非洲欧洲南极洲| | | |北美)”*|1|500年|0|
|880年|200年|32|
零
|scontinents * (= |就像)*“*(南美大洋洲|)”*|1|500年|0|
|0|One hundred.|34|
零
|scontinents * (= |就像)*‘*(亚洲非洲欧洲南极洲| | | |北美)”*|1|600年|0|
|0|200年|35|
零
|scontinents * (= |就像)*“*(南美大洋洲|)”*|1|600年|0|
|2|One hundred.|51|
零
|scontinents * (= |就像)*‘*(亚洲非洲欧洲南极洲| | | |北美)”*|0|0|1001年|
|0|200年|54|
零
|scontinents * (= |就像)*“*(南美大洋洲|)”*|0|0|1002年|
|0|One hundred.|60|
零
|
零
|0|50|1001年|
|0|200年|62年|
零
|
零
|0|60|1002年|
|7|
零
|2000年|。|
零
|1|0|
零
|
|0|One hundred.|2040年|^选择。*更新
|
零
|1|1001年|
零
|
|2|101年|2041年|^选择* $。|
零
|1|1001年|
零
|
|0|200年|2050年|^选择。*更新
|
零
|1|1002年|
零
|
|0|201年|2051年|^选择* $。|
零
|1|1002年|
零
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
|
运行应用程序
现在数据负载测试是成功的让我们做真正的负载后上面的指示,但使用80表和记录20000,没有巨大的。
加载数据后,我们将有两个碎片与不同数量的记录。如果一切顺利,shard2总应该¼,shard1¾。
加载结束后,我有像预期的那样:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
mysql>
选择
current_user(),@@hostname;选择数(*)
作为
shard1
从
windmills_large.windmills80;选择
/ *大陆= shard2 * /
数(*)
作为
shard2
从
windmills_large.windmills80;
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
current_user()|@@hostname|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1
行
在
集
(0.00sec)
+ - - - - - - - - - - +
|shard1|
+ - - - - - - - - - - +
|14272年|←
表
windmills80
在
SHARD1
+ - - - - - - - - - - +
+ - - - - - - - - - - +
|shard2|
+ - - - - - - - - - - +
|5728年|←
表
windmills80
在
SHARD2
+ - - - - - - - - - - +
|
正如你可能已经注意到的,我使用一个方法使用dba_g1用户查询其他碎片,我只是通过查询shard2定义的评论。这是我们所需要的。
让我们执行运行命令在sysbench写道,看看会发生什么。
我们可以注意到在做写的第一件事就是查询地理分布:
|
1
2
3
4
5
6
7
8
|
+ - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
|重量|hostgroup|srv_host|srv_port|
状态
|ConnUsed|ConnFree|ConnOK|ConnERR|MaxConnUsed|查询|
+ - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
|10000年|One hundred.|ac966f7d46c04400fb92a3603f0e2634- - - - - -193113472.欧盟- - - - - -中央- - - - - -1. elb.amazonaws.com|3306年|在线|24|0|138年|66年|25|1309353|
|One hundred.|101年|a5c8836b7c05b41928ca84f2beb48aee- - - - - -1936458168.欧盟- - - - - -中央- - - - - -1. elb.amazonaws.com|3306年|在线|0|0|0|0|0|0|
|10000年|200年|a039ab70e9f564f5e879d5e1374d9ffa- - - - - -1769267689.欧盟- - - - - -中央- - - - - -1. elb.amazonaws.com|3306年|在线|24|1|129年|66年|25|516407年|
|10000年|201年|a039ab70e9f564f5e879d5e1374d9ffa- - - - - -1769267689.欧盟- - - - - -中央- - - - - -1. elb.amazonaws.com|6447年|在线|0|0|0|0|0|0|
+ - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
|
我们可以注意到连接的负载均匀分布,而负荷主要是将shard1正如我们预期的一样,给我们有一个不平衡的分片设计。
在MySQL层面,我们有:
问题
Com类型
最后一点是,获得使用该分片的方法是什么?
我们仍然需要考虑我们正在测试在一个非常小的数据集。然而,如果我们已经可以确定一些好处,这将是一个有趣的结果。
让我们看看24和64个线程的写操作:
我们得到~ 33%只是用分片的增益,而对于延迟,我们没有成本。相反,也有一个小负荷的增加,我们可以看到分片解决方案执行得更好。当然,我们仍在谈论一个低和运行的线程,但获得的行数。
备份
备份和恢复操作在使用POM是完全由操作员(参见POM文件https://docs.雷竞技下载官网percona.com/percona-operator-for-mysql/pxc/backups.html和https://docs.雷竞技下载官网percona.com/percona-operator-for-mysql/ps/backups.html)。
有趣的部分是我们可以有多个类型的备份解决方案,如:
- 随需应变
- 计划
- 完整的时间点恢复日志流
自动化将使我们能够设置一个时间表这么简单:
|
1
2
3
4
5
6
7
8
9
|
时间表
:
——名字
:“sat-night-backup”
时间表
:“0 0 * * 6”
保持
:3
storageName
:s3-eu-west
——名字
:“每日备份”
时间表
:“0 3 * * *”
保持
:7
storageName
:s3-eu-west
|
或者,如果你想按需运行:
|
1
|
kubectl
应用
- - - - - -
f
备份
.yaml
|
的备份。yaml文件非常简单的信息:
|
1
2
3
4
5
6
7
8
9
|
apiVersion
:ps.p雷竞技下载官网ercona.com/v1alpha1
类
:P雷竞技下载官网erconaServerMySQLBackup
元数据
:
的名字
:ps-gr-sharding-test-2nd-of-may
#终结器:
#——delete-backup
规范
:
clusterName
:ps-mysql1
storageName
:s3-ondemand
|
使用两种方法,我们将能够很快一套好的备份:
POM (PXC)
|
1
2
3
4
|
cron
- - - - - -
太
- - - - - -
集群
- - - - - -
1
- - - - - -
s3
- - - - - -
欧盟
- - - - - -
西
- - - - - -
20234293010
- - - - - -
3 vsve
太
- - - - - -
集群
- - - - - -
1
s3
- - - - - -
欧盟
- - - - - -
西
s3
:
/
/
太
- - - - - -
桶
- - - - - -
备份
- - - - - -
tl
/
计划
/
太
- - - - - -
集群
- - - - - -
1
- - - - - -
2023年
- - - - - -
04
- - - - - -
29日
- - - - - -
03
:
00
:
10
- - - - - -
完整的
成功
3 d9h
3 d9h
cron
- - - - - -
太
- - - - - -
集群
- - - - - -
1
- - - - - -
s3
- - - - - -
欧盟
- - - - - -
西
- - - - - -
20234303010
- - - - - -
3 vsve
太
- - - - - -
集群
- - - - - -
1
s3
- - - - - -
欧盟
- - - - - -
西
s3
:
/
/
太
- - - - - -
桶
- - - - - -
备份
- - - - - -
tl
/
计划
/
太
- - - - - -
集群
- - - - - -
1
- - - - - -
2023年
- - - - - -
04
- - - - - -
30.
- - - - - -
03
:
00
:
10
- - - - - -
完整的
成功
2 d9h
2 d9h
cron
- - - - - -
太
- - - - - -
集群
- - - - - -
1
- - - - - -
s3
- - - - - -
欧盟
- - - - - -
西
- - - - - -
2023513010
- - - - - -
3 vsve
太
- - - - - -
集群
- - - - - -
1
s3
- - - - - -
欧盟
- - - - - -
西
s3
:
/
/
太
- - - - - -
桶
- - - - - -
备份
- - - - - -
tl
/
计划
/
太
- - - - - -
集群
- - - - - -
1
- - - - - -
2023年
- - - - - -
05年
- - - - - -
01
- - - - - -
03
:
00
:
10
- - - - - -
完整的
成功
33 h
33 h
cron
- - - - - -
太
- - - - - -
集群
- - - - - -
1
- - - - - -
s3
- - - - - -
欧盟
- - - - - -
西
- - - - - -
2023523010
- - - - - -
3 vsve
太
- - - - - -
集群
- - - - - -
1
s3
- - - - - -
欧盟
- - - - - -
西
s3
:
/
/
太
- - - - - -
桶
- - - - - -
备份
- - - - - -
tl
/
计划
/
太
- - - - - -
集群
- - - - - -
1
- - - - - -
2023年
- - - - - -
05年
- - - - - -
02
- - - - - -
03
:
00
:
10
- - - - - -
完整的
成功
9小时
9小时
|
POM (PS) *
|
1
2
3
|
的名字
存储
目的地
状态
完成
年龄
ps
- - - - - -
gr
- - - - - -
分片
- - - - - -
测试
s3
- - - - - -
调控
s3
:
/
/
太
- - - - - -
桶
- - - - - -
备份
- - - - - -
tl
/
调控
/
调控
/
ps
- - - - - -
mysql1
- - - - - -
2023年
- - - - - -
05年
- - - - - -
01
- - - - - -
15
:
10
:
04
- - - - - -
完整的
成功
21小时
21小时
ps
- - - - - -
gr
- - - - - -
分片
- - - - - -
测试
- - - - - -
2日
- - - - - -
的
- - - - - -
可能
s3
- - - - - -
调控
s3
:
/
/
太
- - - - - -
桶
- - - - - -
备份
- - - - - -
tl
/
调控
/
调控
/
ps
- - - - - -
mysql1
- - - - - -
2023年
- - - - - -
05年
- - - - - -
02
- - - - - -
12
:
22
:
24
- - - - - -
完整的
成功
27米
27米
|
注意,DBA,我们仍然需要验证备份与恢复过程。这部分不是自动化(还)。
*请注意,对POM PS只能备份需求,给出解决方案仍在技术预览版。
这个解决方案适合?
多次提到过,这个解决方案可以覆盖简单分片的情况下;更好的如果你有无共享。
它还需要工作从DBA DDL操作或重新切分。
您还需要能够改变一些SQL代码一定要呈现在任何SQL执行分片键/信息。
这个解决方案不适合在?
几件事可以阻止你使用这个解决方案。最常见的是:
- 你需要查询多个碎片在同一时间。这与ProxySQL是不可能的。
- 你没有DBA执行管理工作,需要依靠一个自动化系统。
- 分布式事务跨切分。
- 不能访问SQL代码。
结论
我们没有对分片或不分片Amletic困境。
当使用RDBMS像MySQL,如果你需要横向扩展,您需要切分。
关键是没有魔杖或解决方案;搬到切分是一项昂贵的和影响操作。在一开始,如果你选择它做任何应用程序开发,努力可以大大减少。
做早也将允许您测试的解决方案,适当的是一个吻的解决方案。总是不那么复杂的事情,因为在两年你会非常高兴你的决定。
相反,如果您必须将当前的解决方案,然后准备流血,或至少一次长途旅行。
在任何情况下,我们需要记住几个要点:
- 不相信的大部分文章在互联网上向你保证无限数据库的可伸缩性。如果没有区别在文章中一个简单的数据库和RDBMS,跑开了。
- 不要去过去的事情只是因为他们发光。测试和评估,如果这对你是有意义的。最好花四分之一测试现在几个解决方案争取多年你不完全理解的东西。
- 使用容器/运营商/ Kubernetes不规模本身;你必须找到一种机制扩展的解决方案。没有绝对的区别与前提。你可能会是一个很好的的自动化水平。然而,会有一个很好的水平的复杂性,并由你来评估它是否有意义。
在一开始说,MySQL,选择是有限的。维塔斯是完整的完整的解决方案,有很多编码为您提供一个完整的平台来处理您的扩展需求。
然而,不要这么快拒绝ProxySQL作为一个可能的解决方案。已经有了许多使用它也进行切分。
这个小POC使用合成情况,但它也表明,只有四个规则,您可以实现一个体面的解决方案。真实的场景可能会稍微复杂一点…。
引用
ProxySQL (https://proxysql.com/documentation/)
防火墙与ProxySQL (https://www.tusacentral.com/joomla/index.php/mysql-blogs/197-proxysql-firewalling)
分片:
- MySQL分片与ProxySQL
- 水平扩展在MySQL——分片跟踪
- 分片Pinterest:如何扩展我们的MySQL舰队
- 在Quora MySQL分片
- 人行天桥的新存储功能基于ShardingSphere-Proxy: MySQL-Sharding
的Per雷竞技下载官网cona Kubernetes运营商自动创建、变更或删除成员在你的MySQL Percona分布,MongoDB或PostgreSQL的环境。














这个比较TiDB如何?
它不是。TiDB是一个不同的解决方案基于不同技术我没有比较这两个。但是你只期待我的下一个步骤就是使用TiDB编写扩展测试。
所以请继续关注