当使用PXC,集群依赖wsrep_OSU_method参数定义在线模式升级(俄勒冈州立大学)方法的节点使用复制DDL语句。
直到现在,我们通常有三个选择:
- 使用隔离订单总额(钢铁洪流,默认)
- 使用滚动模式升级(RSU)
- 使用Pe雷竞技下载官网rcona在线模式改变工具(钢铁洪流+<一个href="//m.doggingzone.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html">PTOSC一个>)
每个方法有一些积极的和消极的方面。钢铁洪流将锁定整个集群无法接受数据修改为整个时间执行DDL操作。RSU将位移之间的模式定义节点,并在任何情况下,节点执行DDL操作仍然是锁着的。最后,钢铁洪流+ PTOSC将依赖于创建触发器和复制数据,所以在某些情况下,这可能是非常有效的。
新的非阻塞操作(NBO)方法是帮助减少对集群的影响,使其更容易执行一些DDL操作。
目前我们只支持一组有限的操作和NBO:
- 改变指数
- 创建索引
- 指数下降
任何其他命令将导致ER_NOT_SUPPORTED_YET一条错误消息。
但让我们看看它的工作原理和影响是什么,我们也会比较它与默认的方法钢铁洪流。
我们要做的就是使用四个连接:
1 -执行ddl
2 -执行表中插入数据被修改
3 -在一个不同的表执行插入数据
4 - 5 -检查其他两个节点的操作
8.0.25-15.1 PXC必须至少版本。
我们将修改的表:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
|
DC1- - - - - -1 (<一个href="//m.doggingzone.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1664797962567a7975777a7e796562">(电子邮件保护)一个>)(windmills_s)>
显示
创建
表
windmills_test \ G
* * * * * * * * * * * * * * * * * * * * * * * * * * *1。
行
* * * * * * * * * * * * * * * * * * * * * * * * * * *
表:windmills_test
创建
表:
创建
表
“windmills_test”(
“id”
长整型数字
非空
AUTO_INCREMENT,
”uuid”
字符(36)
字符集
use utf8
核对
utf8_bin
非空,
“millid”
短整型
非空,
“kwatts_s”
int
非空,
”日期”
日期
非空,
“位置”
varchar(50)
字符集
use utf8
核对
utf8_bin
非空,
“活跃”
非常小的整数
非空
默认的
' 1 ',
”时间”
时间戳
非空
默认的
CURRENT_TIMESTAMP
在更新
CURRENT_TIMESTAMP,
“strrecordtype”
字符(3)
字符集
use utf8
核对
utf8_bin
非空,
主键
(“id”),
关键
“IDX_millid”(“millid”、“活跃的”),
关键
“IDX_active”(“id”、“活跃的”),
关键
“kuuid_x”('uuid”),
关键
“millid_x”(“millid”),
关键
“active_x”(“活跃的”)
)
引擎
=
InnoDB
AUTO_INCREMENT
=8199260
默认的
字符集
=utf8mb3
核对
=utf8_bin
ROW_FORMAT
=
动态
1
行
在
集
(0.00sec)
|
和包含~五百万行。
|
1
2
3
4
5
6
7
|
DC1
- - - - - -
1
(
根
@
本地主机
)
(
windmills_s
]
>
选择
数
(
*
)
从
windmills_test
;
+
- - -
- - -
- - -
- - -
- - -
+
|
数
(
*
)
|
+
- - -
- - -
- - -
- - -
- - -
+
|
5002909
|
+
- - -
- - -
- - -
- - -
- - -
+
1
行
在
集
(
0.44
证券交易委员会
)
|
的命令
连接1:
|
1
2
|
改变
表
windmills_test
添加
指数
idx_1
(
”
uuid
”
,
”
活跃的
”
)
,
算法
=
原地
;
改变
表
windmills_test
下降
指数
idx_1
,
算法
=
原地
;
|
连接2:
|
1
|
而
(
1
=
1
]
;
做
达
=
美元
(
日期
+
“% s % 3 n”
)
;
/
选择
/
mysql_templates
/
PXC8P
/
本
/
mysql
- - -
违约
- - - - - -
文件
=
。
/
我的
.cnf
- - - - - -
uroot
- - - - - -
D
windmills_s
- - - - - -
e
“插入windmills_test选择零、uuid millid, kwatts_s,日期,地点,活跃,时间,从windmills7 strrecordtype限制1;”
- - - - - -
e
“select count(*)从windmills_s.windmills_test;“
>
/
dev
/
零
;
db
=
美元
(
日期
+
“% s % 3 n”
)
;
回声
“$(回声”
(
$ db
- - - - - -
美元哒
)
“| bc)”
;
睡眠
1
;
完成
|
连接3:
|
1
|
而
(
1
=
1
]
;
做
达
=
美元
(
日期
+
“% s % 3 n”
)
;
/
选择
/
mysql_templates
/
PXC8P
/
本
/
mysql
- - -
违约
- - - - - -
文件
=
。
/
我的
.cnf
- - - - - -
uroot
- - - - - -
D
windmills_s
- - - - - -
e
“插入windmills8选择零、uuid millid, kwatts_s,日期,地点,活跃,时间,从windmills7 strrecordtype限制1;”
- - - - - -
e
“select count(*)从windmills_s.windmills_test;“
>
/
dev
/
零
;
db
=
美元
(
日期
+
“% s % 3 n”
)
;
回声
“$(回声”
(
$ db
- - - - - -
美元哒
)
“| bc)”
;
睡眠
1
;
完成
|
连接4 - 5:
|
1
|
而
(
1
=
1
]
;
做
回声
“$(日期+ % t . % 3 n)”
;
/
选择
/
mysql_templates
/
PXC8P
/
本
/
mysql
- - -
违约
- - - - - -
文件
=
。
/
我的
.cnf
- - - - - -
uroot
- - - - - -
D
windmills_s
- - - - - -
e
“显示全部processlist;”
|
egrep
- - - - - -
我
- - - - - -
e
”(windmills_test | windmills_s)”
|
grep
- - - - - -
我
- - - - - -
v
本地主机
;
睡眠
1
;
完成
|
操作
- 开始插入连接
- 启动命令连接4 - 5在其他节点上
- 执行:
- 对钢铁洪流
-
1DC1 - - - - - - 1 ( 根 @ 本地主机 ) ( windmills_s ] & gt ; 集 会话 wsrep_OSU_method = 钢铁洪流 ;
-
- 对于NBO
-
1DC1 - - - - - - 1 ( 根 @ 本地主机 ) ( windmills_s ] & gt ; 集 会话 wsrep_OSU_method = NBO ;
-
- 对于这两个
-
1DC1 - - - - - - 1 ( 根 @ 本地主机 ) ( windmills_s ] & gt ; 改变 表 windmills_test 添加 指数 idx_1 ( ” uuid ” , ” 活跃的 ” ) , 算法 = 原地 , 锁 = 共享 ;
-
- 对钢铁洪流
让我们来运行它
修改一个表与钢铁洪流
|
1
2
3
|
DC1
- - - - - -
1
(
根
@
本地主机
)
(
windmills_s
]
>
改变
表
windmills_test
添加
指数
idx_1
(
”
uuid
”
,
”
活跃的
”
)
,
算法
=
原地
;
查询
好吧
,
0
行
影响
(
1
最小值
4.74
证券交易委员会
)
记录
:
0
重复的
:
0
警告
:
0
|
改变表中插入连接(2):
|
1
2
3
4
5
|
。
450年
。
492年
64.993
<
- - -
- - - - - -
改变
块
所有
插入
在
的
表
我们
是
改变
。
788年
。
609年
|
插入的表(3)连接:
|
1
2
3
4
5
|
。
455年
。
461年
64.161
<
- - -
- - - - - -
改变
块
所有
插入
在
所有
的
其他
表
作为
好吧
。
641年
。
483年
|
其他节点在同一时间的改变,我们可以看到:
|
1
2
|
Id
用户
db
命令
时间
状态
信息
Time_ms
Rows_sent
行
_检查
15
系统
用户
windmills_s
查询
102年
改变
表
改变
表
windmills_test
添加
指数
idx_1
(
”
uuid
”
,
”
活跃的
”
)
,
算法
=
原地
102238年
0
0
<
- - -
- - - - - -
时间
从
开始
|
简而言之,我们有整个集群锁定~ 64秒。在这段时间里,所有的操作来修改数据或结构。
现在让我们尝试NBO
改变表中插入:
|
1
2
3
4
5
|
。
437年
。
487年
120.758
<
- - -
- - -
执行
时间
增加
。
617年
。
510年
|
插入的表:
|
1
2
3
4
5
|
。
468年
。
485年
25.061
<
- - -
- - -
仍然
一个
metalock
,
但
不
锁定
的
其他
表
为
的
整个
持续时间
。
494年
。
471年
|
其他节点在同一时间的改变,我们可以看到:
|
1
2
|
Id
用户
db
命令
时间
状态
信息
Time_ms
Rows_sent
行
_检查
110068年
系统
用户
windmills_s
连接
86年
改变
表
改变
表
windmills_test
添加
指数
idx_1
(
”
uuid
”
,
”
活跃的
”
)
,
算法
=
原地
120420年
0
0
|
在这种情况下,是什么还值得注意的是:
- 我们有一个时刻metalock:
-
1110174年 pmm 127.0.0.1 : 42728年 零 查询 2 等待 为 表 元数据 锁 选择 x 从 information_schema 。 表 在哪里 TABLE_SCHEMA = “windmills_s” 1486年 10 0
-
1110068年 系统 用户 连接 主机 windmills_s 连接 111年 关闭 表 改变 表 windmills_test 添加 指数 idx_1 ( ” uuid ” , ” 活跃的 ” ) , 算法 = 原地 111000年 0 0
-
- 执行时间更长
总结:
|
1
2
3
4
|
钢铁洪流
NBO
时间
在
持有
为
插入
为
改变
表
~
64年
证券交易委员会
~
120年
证券交易委员会
时间
在
持有
为
插入
为
另一个
表
~
64年
证券交易委员会
~
25
证券交易委员会
metalock
整个
时间
只有
在
的
结束
|
发生了什么?有什么区别和和NBO为什么它要花很长的时间吗?
让我们看看如何在非常高的水平两个工作:
- 钢铁洪流:当你发出一个DDL喜欢添加索引元数据锁被放在桌子上,它将发布只有最后的操作。在这段时间里,你不能:
- 任何集群节点上执行摘要
- 改变集群中的另一个表
- NBO:元数据锁在开始和结束时很短暂的一段时间。添加索引操作会在每个节点独立工作。锁在最后是所有节点达成一致的操作和提交或回滚(使用集群错误投票)。成本多一点时间和最后阶段就是添加一个几秒钟的操作执行。但是在操作:
- 你可以改变另一个表(使用NBO)
- 您可以继续插入数据,除了表中(s)改变。
- 在节点崩溃,其他节点上的操作将继续,如果成功,它将持续下去。
简而言之,集群服务器使用NBO时行为变化显著,钢铁洪流相比提供了很大的灵活性。时间不应该线性增加的成本的维度表,但更与单一节点执行ALTER操作的效率。
结论
NBO可以大大有助于减少DDL在集群上的影响,目前,局限于广泛使用索引的创建/修改/删除。但在未来…我们可以扩大。
功能仍然是一个技术预览版,所以不相信它在生产,但是测试它,让我们知道你的想法。
最后的评论:另一个分布引入了NBO,但只有如果你购买企业版。
雷竞技下载官网Percona,真正开源不仅用事实的话,实现NBO标准PXC,完全开源的代码。这不是第一个,但只是另一个的许多特性Percona提供免费当别人问你购买企业版。雷竞技下载官网
享受你们的产品和我们反馈!伟大的MySQL所有!
雷竞技下载官网Percona XtraDB集群8.0.25 (PXC)一个>引入了一个新选项执行在线模式修改:NBO (<一个href="//m.doggingzone.com/doc/percona-xtradb-cluster/LATEST/features/nbo.html">非阻塞操作一个>)。





马可,
我困惑。你国家可以继续原地插入数据而改变算法,但它看起来像在你的例子中有60秒“块”我缺少什么呢?
彼得,
~ 60”是钢铁洪流。与钢铁洪流不能插入或修改在任何表。和NBO可以插入或修改其他表。
“发生了什么”一节中解释。