当我在我的工作grFailOver POC,我还做了一些额外的并行测试。其中一个是看看网上执行DDL在一群集群复制。
在线DDL特性提供了支持即时和就地和并发DML表更改。检查小组复制(GR)官方文档,我试图确定是否存在任何限制,但我唯一发现的是:
“并发DDL和DML操作。并发数据定义语句和数据操纵语句执行对相同的对象,但在不同的服务器上使用multi-primary时不支持模式。在执行数据定义语言(DDL)语句的一个对象,执行并发数据操作语言(DML)相同的对象,而是一个不同的服务器实例执行DDL冲突的风险在不同实例没有被发现。”
这个影响只有当你有一个multi-primary场景中,这并不是建议,而不是我的情况。所以,在理论上,GR应该能够处理在线DDL没有问题。
我的情况:
我有两个DCs和我要做的动作我DC1,看看它如何传播,和它将产生何种影响。
测试
做测试,我将从选择运行和插入。
|
1
|
插入
成
windmills_test
选择
零,uuidmillid kwatts_s,日期、位置、活跃,时间,strrecordtype
从
windmills7
限制
1;
|
和选择,主节点gr1一起,在另一个连接执行改变:
|
1
|
改变
表
windmills_test
添加
指数
idx_1('uuid”、“活跃的”),
算法
=原地,
锁
=
没有一个;
|
正如你可能已经注意到,我没有明确要求原地和锁。所以在这种情况下,MySQL无法满足;它应该退出,而不是执行命令。
与此同时,其他所有节点上,我将运行一个命令查看我的改变正在发生。让我们滚球:
在我的小学,命令来插入数据:
|
1
|
(
根
@
gr1一起
通
]
#虽然[1 = 1];做da = $(日期+ ' % s % 3 n '); / opt / mysql_templates / mysql-8P / bin / mysql——defaults-file -uroot - d =。/ my . cnf中所做windmills_s - e”插入windmills_test选择零,uuid、millid kwatts_s,日期,地点,活跃,时间,从windmills7 strrecordtype限制1;”- - - - - -e"select count(*) from windmills_s.windmills_test;" > /dev/null;db=$(date +'%s.%3N'); echo "$(echo "($db - $da)"|bc)";sleep 1;done
|
再次主要另一个会话执行改变:
|
1
|
DC1- - - - - -1 ((电子邮件保护))(windmills_s)>
改变
表
windmills_test
添加
指数
idx_1('uuid”、“活跃的”),
算法
=原地,
锁
=
没有一个;
|
在其他节点监控改变将开始:raybet雷竞技竞猜在线官网
|
1
|
而
(
1
=
1
]
;
做
回声
“$(日期+ % t . % 3 n)”
;
/
选择
/
mysql_templates
/
mysql
- - - - - -
8页
/
本
/
mysql
- - -
违约
- - - - - -
文件
=
。
/
我的
.cnf
- - - - - -
uroot
- - - - - -
D
windmills_s
- - - - - -
e
“显示processlist;”
|
grep
- - - - - -
我
“改变”
;
睡眠
1
;
完成
|
会发生什么
插入的数据循环。
改变开始,但我仍能在我的表插入数据,最重要的是,数据传播到DC1集群的所有节点。
没有改变的行动在其他节点上。
|
1
2
3
4
5
6
7
8
9
|
。
559年
。
502年
。
446年
。
529年
。
543年
。
553年
。
533年
。
602年
。
458年
<
- - -
- - -
结束
的
的
改变
在本地
|
修改完成后在本地节点(主)然后执行(广播)参与集群的所有节点。
|
1
|
(错误1205年(HY000)
在
行1:
锁
等待超时超过了;试一试重新启动
事务
<- - - - - -——等待等待处理程序提交不允许插入
|
但是写的是暂停,等待:
|
1
|
37411年|根
|本地主机
|windmills_s|查询
|
19|等待
为
表
元数据
锁
|
插入
成
windmills_test
选择
零,uuidmillid kwatts_s,日期、位置、活跃,时间,strrecordtype
|
最终,它会超时。
另一点是,任何写挂起直到节点申请改变最慢。重要的是要注意,所有节点,不仅主,仍等待等待缓慢的节点:t他慢的驱动器。
GR3:
|
1
2
|
11
:
01
:
28.649
48
系统
用户
windmills_s
查询
171年
改变
表
改变
表
windmills_test
添加
指数
idx_1
(
”
uuid
”
,
”
活跃的
”
)
,
算法
=
原地
,
锁
=
没有一个
11
:
01
:
29.674
48
系统
用户
windmills_s
查询
172年
等待
为
处理程序
提交
改变
表
windmills_test
添加
指数
idx_1
(
”
uuid
”
,
”
活跃的
”
)
,
算法
=
原地
,
锁
=
没有一个
|
GR2:
|
1
2
|
开始
11
:
00
:
14.438
18
系统
用户
windmills_s
查询
97年
改变
表
改变
表
windmills_test
添加
指数
idx_1
(
”
uuid
”
,
”
活跃的
”
)
,
算法
=
原地
,
锁
=
没有一个
结束
11
:
02
:
00.107
18
系统
用户
windmills_s
查询
203年
改变
表
改变
表
windmills_test
添加
指数
idx_1
(
”
uuid
”
,
”
活跃的
”
)
,
算法
=
原地
,
锁
=
没有一个
|
最后,当集群中的最后一个节点GR应用改变,写简历,和副本节点DC2将首先启动主节点的ALTER操作,然后在其他节点上。
总结:
- 主要写执行
- 改变在主节点上执行
- DDL不影响写操作和尊重不阻塞指令。
- 改变是完成小学和传递给所有节点
- 元锁在节点
- 所有集群等待最慢的节点完成
- 当所有在DC1那么行动是DC2的复制
- 转到2
结论
看来,目前我们有部分的报道在线ddl当使用group_replication特性。当然,必须等待二级节点和更少的影响比等主要第一中学。
但它是令人困惑,因为我希望有完整的在线报道(我曾明确要求,在DDL命令)或一个消息告诉我不能在线执行。当然,我更希望有完整的在线报道。,0)
请记住我的设置也非常标准,改变group_replication_consistency不影响结果。但不确定我可以把这归为一个错误,更意外的不良行为。








马克,谢谢你的这些信息!我很好奇:如果迁移完成后在主,一秒钟之后你杀主?意思,中学都开始运行复制改变,但阻挡插入。如果你杀主,所有写在中学和最终将应用,还是插入损失?
有趣的问题,我以后会回归到你的答案。没有跟踪特定的一个。
Shlomi,
结果:
主要完成当地手术后辅助节点开始改变。
——写在小学
——杀主
——辅助节点无法选出主虽然在本地应用改变。
——写仍锁定(没有初级选举)
——第一中学完成改变,成为初级,但仍然被metalock锁定
——第二次要完成改变
——锁了
——继续写道。
所以我们仍然锁但数据插入在网上段主要是正确复制,然后修改表按预期辅助节点和集群没有问题。
谢谢你马克!系统是群龙无首的时间改变在次要的,因为没有一个辅助加强为主,直到所有(?)完成改变,如果我理解正确。意思,如果10小时改变在主节点上完成,下一个10小时是一个可用性风险:如果主下降在未来10小时,系统实际上是只读的,如果我理解正确。超级有趣!
正确的。
总之从测试,最快的二次将成为主要的。然后等待metalock给其余次要仍然是处理。
谢谢分享!
我恭敬地不同意,对我来说这无疑是一个错误。
它至少应该被记录和一个警告…
希望它可以解决在未来,添加索引是相当常见的。
伊凡,如果你指的是事实我们不得到一个错误当特别要求“算法=原地,锁=没有”然后我同意。我们应该得到一个消息说Onlne DDL不能遵循我们的要求执行。
说,DDL的方式处理(在线在主)然后锁有它自己的逻辑,是我们在某种程度上比钢铁洪流Galera。
在任何情况下我想在线尊重同样在二级,但我会听从甲骨文。
最后总是记住,为了避免这种行为我们可以使用PT-OSC (PT在线模式变化),我们要做的不兼容的更改。这将减少锁定“时刻”。
谢谢你阅读这个博客