本文演示了MySQL和ProxySQL分片是如何工作的。
最近我的一位同事问我来提供一个简单的例子如何ProxySQL进行切分。
作为回应,我写这个简短的教程,希望它将说明ProxySQL切分功能,和帮助人们更好地理解如何使用它。
ProxySQL是一个非常强大的平台,让我们来操作和管理连接和查询在一个简单而有效的方法。本文向您展示如何去做。
开始前,让我们澄清一些基本概念。
- ProxySQL组织其内部设置的服务器主机组(HG),并且每个HG可以与用户和关联查询规则(QR)
- 每个QR可以最终(应用= 1)或者其他QRs =让ProxySQL继续解析
- QR可以重写操作,是一个简单的比赛,有一个特定的目标HG,或者是通用的
- QRs定义使用正则表达式
你可以看到QRs过滤和转换的序列,你可以安排。
这些简单的基本规则给我们巨大的灵活性。他们允许我们创建非常简单的行为像一个简单的查询重写,或非常复杂的链,可以看到数十名QR连接。可以找到文档<一个href="https://github.com/sysown/proxysql/blob/v1.2.2/doc/configuration_howto.md" rel="nofollow">在这里一个>。
硫化汞或QRs的相关信息是方便的使用ProxySQL管理员界面,在表mysql_servers mysql_query_rules stats.stats_mysql_query_rules。最后一个允许我们评估是否以及如何使用规则(s)。
至于分片,ProxySQL能做些什么来帮助我们实现我们需要的(在一个相对简单的方法)?一些人/公司包括分片逻辑在应用程序中,使用多个连接到不同的目标,或者有一些逻辑将加载跨多个模式/表。ProxySQL允许我们简化连接和查询分布应该是工作的方式查询中读取数据或接受提示。
不管什么要求,分片锻炼可以归纳为几个不同的类别。
- 通过分割数据在相同的容器(如有碎片的状态,每个状态都是一个模式)
- 通过物理数据位置(这可以有多个MySQL服务器在同一个房间里,以及在地理上分布)
- 两者的结合,使用专用服务器我分裂的状态,又分裂由模式/表不管性别(比方说)
在下面的例子中,我展示了如何使用ProxySQL封面上面定义的三种不同的场景(以及更多)。
下面的例子将报告文本从管理ProxySQL接口和MySQL控制台。我将每一个如下:
- Mc MySQL控制台
- Pa为ProxySQL管理
请注意,必须使用MySQL控制台
我将演示程序,你可以复制你的笔记本电脑上,并在可能的情况下我将提到真正的实现。因为我想让你直接测试ProxySQL功能。
例如下面描述我有PrxySQL v1.2.2将在几天内成为大师。你可以下载它从:
|
1
2
|
git
克隆
https
:
/
/
github
com
/
sysown
/
proxysql
.
git
结帐
v1
。
2.2
|
然后编译:
|
1
2
3
|
cd
<
路径
来
代理
源
代码
>
使
使
安装
|
如果你需要完整的说明如何安装和配置ProxySQL,阅读<一个href="https://github.com/sysown/proxysql/blob/v1.2.2/INSTALL.md" rel="nofollow">在这里一个>和<一个href="https://github.com/sysown/proxysql/blob/v1.2.2/doc/configuration_howto.md" rel="nofollow">在这里一个>。
最后,您需要测试数据库加载的世界。世界可以找到测试数据库<一个href="https://dev.mysql.com/doc/index-other.html" rel="nofollow">在这里一个>。
碎片在相同的MySQL服务器使用三种不同的模式分裂的大陆
显然,您可以拥有任意数量的碎片和相对模式。这里相关演示交通被重定向到不同的目标(模式),保持相同的结构(表),通过识别目标基于一些相关信息的数据或应用程序通过的。
好吧,让我们滚球。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
(Mc)
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
|
|
|
|
|
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|
对于这个练习,我将使用三个主机复制品。
总而言之,我将需要:
- 三个主持人:192.168.1 [5-6-7]。
- 三种模式:大陆X +世界模式
- 一个用户:user_shardRW
- 三个hostgroups: 10、20、30(用于将来使用)
首先,我们将创建一个模式亚洲、非洲、欧洲:
|
1
2
3
4
5
6
7
8
9
10
11
|
(
Mc
]
创建
模式
(
亚洲
|
欧洲
|
North_America
|
非洲
]
;
创建
表
亚洲
.City
作为
选择
一个
。
*
从
世界
.City
一个
加入
国家
在
一个
.CountryCode
=
国家
.code
在哪里
大陆
=
“亚洲”
;
创建
表
欧洲
.City
作为
选择
一个
。
*
从
世界
.City
一个
加入
国家
在
一个
.CountryCode
=
国家
.code
在哪里
大陆
=
“欧洲”
;
创建
表
非洲
.City
作为
选择
一个
。
*
从
世界
.City
一个
加入
国家
在
一个
.CountryCode
=
国家
.code
在哪里
大陆
=
“非洲”
;
创建
表
North_America
.City
作为
选择
一个
。
*
从
世界
.City
一个
加入
国家
在
一个
.CountryCode
=
国家
.code
在哪里
大陆
=
北美的
;
创建
表
亚洲
.Country
作为
选择
*
从
世界
.Country
在哪里
大陆
=
“亚洲”
;
创建
表
欧洲
.Country
作为
选择
*
从
世界
.Country
在哪里
大陆
=
“欧洲”
;
创建
表
非洲
.Country
作为
选择
*
从
世界
.Country
在哪里
大陆
=
“非洲”
;
创建
表
North_America
.Country
作为
选择
*
从
世界
.Country
在哪里
大陆
=
北美的
;
|
现在,创建用户
|
1
|
格兰特
所有
在
* . * |
现在让我们开始配置ProxySQL:
|
1
2
3
4
5
6
7
8
|
(Pa)
插入
成
mysql_users
负载
MYSQL
插入
成
mysql_servers
插入
成
mysql_servers
插入
成
mysql_servers
负载
MYSQL |
我们已经定义了用户,服务器和主机组。
让我们开始定义查询的逻辑规则:
|
1
2
3
4
|
(Pa)
删除
从
mysql_query_rules
插入
成
mysql_query_rules
负载
MYSQL |
我现在去查询主(或单个节点),但我期待ProxySQL查询重定向到正确的切分,抓住大陆的价值:
|
1
2
3
4
5
6
7
|
(Mc)
选择
名称、数量
+ - - - - - - - - - - - - - - - - - - +
|
+ - - - - - - - - - - - - - - - - - - +
|
+ - - - - - - - - - - - - - - - - - - +
|
你可以说:“嘿!你是查询模式的世界,当然你得到正确的数据。”
这不是到底发生了什么。世界ProxySQL没有查询模式,但欧洲模式。
让我们看一下细节:
|
1
2
3
4
|
(Pa)
选择
*
原始
改变了 |
让我解释一下发生了什么事。
31日在ProxySQL规则将所有字段我们将通过查询中。将抓住大陆在WHERE子句中,它将采取任何条件,并将重组后的查询都使用正则表达式。
这对任何工作表在分片模式吗?当然它。
查询:
将转换为:
|
1
2
3
4
5
6
7
8
9
10
11
|
(Mc)
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
|
|
|
<剪断
|
|
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
|
另一个可能的方法是指导ProxySQL碎片是通过一个提示在评论。让看看。
首先让我禁用规则插入。这不是真正需要的,但我们会做,这样你就能看到。
|
1
2
3
4
5
|
(Pa)
mysql
查询
mysql
查询 |
完成了。
现在我想要的是* *查询包含评论/ *大陆= X * /去欧洲大陆模式,相同的服务器。
为此,我指示ProxySQL替换任何引用世界模式在查询我要提交。
|
1
2
3
4
5
6
7
8
9
|
(Pa)
删除
从
mysql_query_rules
插入
成
mysql_query_rules
插入
成
mysql_query_rules
插入
成
mysql_query_rules
插入
成
mysql_query_rules
插入
成
mysql_query_rules
插入
成
mysql_query_rules
负载
MYSQL |
这是如何工作的呢?
我已经定义了两个连接规则。第一个捕获传入的查询包含所需的值(如亚洲大陆=)。如果匹配,ProxySQL退出这一行动,但这样做将阅读应用领域。如果应用为0,它将阅读FlagOUT价值。在这一点上,它将去第一个规则(按顺序),FlagOUT FlagIN相等的价值。
第二条规则获取请求,并将取代的价值世界与我的定义。简而言之,它取代任何在match_pattern replace_pattern值。
现在ProxySQL实现Re2公司谷歌为正则表达式库。Re2公司非常迅速,但有一定的局限性,它不支持(在写作的时候)标记选项
因此,查询:
|
1
|
选择
/ * =欧洲大陆* /
* |
将转换为:
|
1
|
选择
/ * =欧洲大陆* /
* |
和失败。
一天,Rene和我讨论如何解决这个鉴于Re2公司缺乏实施。最后,我们选择了递归操作。
这是什么意思?这意味着从v1.2.2 ProxySQL现在有一个新功能,允许递归调用查询规则。的最大迭代数,ProxySQL可以运行管理的选项(全局变量) 这个新的实现允许我们引用一个查询规则本身多次执行。
如果你回去你会注意到QR 34 FlagIN和25 FlagOUT指向相同的值和应用= 0。这让ProxySQL递归地调用规则34,直到改变这个词的所有值 结果如下:
你可以看到ProxySQL内部信息使用以下查询:
和:
正如你所看到的ProxySQL已经很好地取代了这个词 这显然是为插入/更新/删除工作。
查询:
将转换为:
和执行只有在所需的模式。
我如何切分和重定向查询到主机(而不是一个模式)?这是更容易!
的主要观点是,无论比赛规则应该去定义HG。没有重写,这意味着更少的工作。
这是如何实现的呢?和之前一样,我有三个节点:192.168.1。[5-6-7]。对于这个例子,我将使用世界DB(没有大陆模式),分布在每一个节点,我将检索节点绑定到IP可以肯定的是我将正确的位置。
我指示ProxySQL发送查询通过使用特定主机的提示。我选择提示“shard_host_HG”,我要查询中注入作为一个评论。
这样的查询规则将:
当我要查询测试:
运行查询的非洲,我会:
会给我:
在这个例子中,我们没有replace_patter。这只是一个匹配和重定向规则,目的地HG的价值定义 服务器在HG 30是:
这完全匹配我们的返回值。
你可以通过你自己的其他两个大洲。
指定查询的最终宿主的另一种方法是使用destination_hostgroup,设置 例如:
然后查询中做类似:
我提到这个方法,因为它是目前最常见的一个在大公司使用分片。
但它是不安全的,因为它传递的查询将在执行所需的HG。错误的风险很高。
只是觉得如果一个查询做加入反对指定的碎片:
这可能会产生一个错误,因为shard03包含shard01可能不是现在的主机上。
这样可以使用这种方法只有当你100%确定你在做什么,当你确定没有查询将声明一个显式的模式。
最后,显然是可以结合这两种方法和碎片主机只有一个子集的模式。
为此,让我们用三个节点和模式分布为:
我已经查询规则集使用提示,我所要做的就是使用它们来将操作:
可以看到规则11有两支安打,这意味着我的查询将相关的HG。但考虑到申请规则11 = 0,ProxySQL首先将继续处理查询规则。
因此也会变换31和32的查询规则,每一个有预期命中数(一个第一和第二个四,因为循环)。
这是我们不得不做的执行一个完美的两层分片ProxySQL。
ProxySQL允许用户访问数据分发的碎片在一个非常简单的方法。查询规则,遵循巩固正则表达式的模式,结合的可能性连接规则和主机群方法定义给了我们巨大的灵活性相对简单。
https://github.com/sysown/proxysql/tree/v1.2.2/doc一个> 很明显,我需要承认和荣誉<一个href="https://www.linkedin.com/in/renecannao" rel="nofollow">刘若英的Cannao一个>做使ProxySQL坚实、快速和灵活的产品。我也应该提到,我经常与他合作(通常他喜欢),问他修正和讨论优化策略。请求他满足以惊人的速度和效率。
分片的主机
使用提示
使用destination_hostgroup
碎片由主机和模式
结论
引用:
https://github.com/google/re2/wiki/Syntax一个>
http://www.proxysql.com/2015/09/proxysql-tutorial-setup-in-mysql.html一个>
https://github.com/sysown/proxysql/blob/v1.2.2/doc/configuration_howto.md一个>
https://github.com/sysown/proxysql/blob/v1.2.2/INSTALL.md一个>
https://dev.mysql.com/doc/index-other.html一个>学分
以下QR:一定有毛病插入mysql_query_rules (rule_id、活跃用户名、match_pattern replace_pattern,适用)值(31岁,1,“user_shardRW”,“^选择\ s *(. *)从\ \ s * *世界。(\ s *) \ s(. *)。*大陆= ' (\ s *) \ s *美元(\ s *。*)”,“选择\ 1 \ 4。2,1 = 1 \ 5 \ ",1);
3 \不见了…
除此之外,我认为SQL入侵似乎有点太多,作为列大陆表中不存在的城市。
卢克,由于花一些时间阅读这篇文章。我将这两个问题的答案。
在上面的示例中我做了,我解释说,您需要创建一些尊重欧洲大陆模式:
创建模式[亚洲欧洲| | North_America |非洲);代码>就像这样的查询:
选择的名字,从世界人口。城市在哪里大陆=“欧洲”人口和CountryCode = ITA的order by desc限制1;代码>明确上述成为:
将指向的欧洲模式,而不是桌子上。
原:选择名字,从世界人口。城市在哪里大陆=’Europe’ and CountryCode=’ITA’ order by population desc limit 1;
人口转变:选择名字,来自欧洲。城市= ?CountryCode = ?按人口desc限制?
最后如果你仔细阅读正则表达式不需要你会发现组3,不包括分解:组1组。7日-<代码>名称、数量代码>
组2。品种马非常<代码>城市代码>
组3。39-46<代码>在哪里代码>
组4。57 - 63<代码>欧洲代码>
5组。65 - 120<代码>人口和CountryCode = ITA的order by desc限制1;代码>
组3是哪里,我不需要给它已经包含在replace_pattern:
“选择\ 1 \ 4。\ 2,1 = 1 \ 5”代码>希望这将帮助你更好地理解这篇文章。
谢谢你的快速反应。1,如果你的意思是你只创建这个QR指定的查询,然后失踪\ 3就可以了。2,我理解ProxySQL如何处理转换,只是觉得有点奇怪,如果我需要编写原始SQL应用程序。
就我所知,ProxySQL只能一个SQL路由到一个后端MySQL实例。如果我需要在一个SQL查询多碎片(如。大陆(“亚洲”、“欧洲”)),然后ProxySQL不能压低SQL合并每个切分的结果,最后返回到用户,对吗?
你好卢克,我认为你可能会发现额外的答案<一个href="https://www.slideshare.net/marcotusa/proxysql-sharding" rel="nofollow ugc">https://www.slideshare.net/marcotusa/proxysql-sharding一个>83年限制看到幻灯片问候
我跟着一步一步但无法登录
mysql - u user_shardRW - p - h - p 6033 - e”主机名选择名字,从世界人口。城市在哪里大陆=’Europe’ and CountryCode=’ITA’ order by population desc limit 1;”
我们使用proxysql好几次发生非常严重的事故,所以我们有一个测试,在那之后我们发现三个主要问题:1。我们杀后端程序的mysql,但这台机器的状态仍回避超过半天,加上真正的连接请求是dispached那台机器被杀的mysql程序2。proxysql。Client_Connections_connected /统计= stats_mysql_global默认最大价值2048多,但我们的业务并发远非这个值与php短链接,为什么发生?3所示。我们没有发现日志打印超过一个半小时,所以我们不能分析事故在某些时刻
业务
我们使用proxysql好几次发生非常严重的事故,所以我们有一个测试,在那之后我们发现三个主要问题:1。我们杀后端程序的mysql,但这台机器的状态仍回避超过半天,加上真正的连接请求是dispached那台机器被杀的mysql程序2。proxysql。Client_Connections_connected /统计= stats_mysql_global默认最大价值2048多,但我们的业务并发远非这个值与php短链接,为什么发生?3所示。我们没有发现日志打印超过一个半小时,所以我们不能通过日志在某些时刻分析事故
谢谢你带我们proxysql,最美好的祝福!
想要每周更新清单的最新博客文章?
现在订阅,我们将送你一个更新每周五下午1点等。
相关的博客文章
为dba洞察力
MySQL
雷竞技下载官网Percona软件
为dba洞察力
MySQL
为dba洞察力
了解开发人员
MySQL
雷竞技下载官网Percona软件
云
了解开发人员
雷竞技下载官网Percona软件
PostgreSQL
云
MongoDB
雷竞技下载官网Percona软件
云
为dba洞察力
MySQL
雷竞技下载官网Percona软件
推荐的文章
2023年7月27日,
Bartek Gatz一个>
LTS和创新版本为MySQL Percona服务器雷竞技下载官网
2023年7月27日,
大卫·斯托克斯一个>
快速浏览一下MySQL 8.0.34和MySQL 8.1.0
2023年7月25日
萨提亚Bodapati一个>
快20倍备份准备与Percona XtraBackup 8.0.33-雷竞技下载官网28 !
最受欢迎文章
2023年6月20日
谢尔盖Pronin一个>
上部署Django Kubernetes PostgreSQL P雷竞技下载官网ercona运营商
2023年3月15日
谢尔盖Pronin一个>和<一个href="//m.doggingzone.com/blog/author/ege-gunes" class="co-author-display-name">针对枪一个>
自动化Kubernetes MongoDB的物理备份
2023年2月10日
马塞洛•阿尔特曼一个>
雷竞技下载官网Percona XtraBackup现在支持我实例配置文件