今天突然MariaDB Galera Cluster收到一个报错日志分析请求:
错误如下:
[Warning] WSREP: transaction size limit (4294901759) exceeded: 4294967296
[ERROR] WSREP: rbr write fail, data_len: 0, 2
大致意思,事务超过了边界大小 所以失败。下面来看看 是什么问题导致的吧。
1)Galera Cluster原理:
当客户端提交一个commit命令,在事务提交之前,所有对数据库的操作都会被写入write-set中,包括主键,
然后数据库会将这个write-set发给所有其他节点,
write-set将在每个节点(包括生成write-set的节点)上使用主键进行认证尝试。
如果认证失败,节点会丢弃这个write-set,同时集群会回滚到之前的事务点;
如果认证成功,commit正常提交,事务会应用到其他节点上。
所有节点以相同的顺序接受事务,所有节点对事务是否提交做一致性决定。
事务提交成功之后,首先生成此事务的节点会通知应用程序事务已正确提交。
备注:主键认证(Certification)成功之后 才提交commit,
首先生成此事务的节点会通知应用。所以这里就存在一个问题,
除了通知节点,其他个节点都没法确认是否完成事务成功。
2)以下错误信息是在commit 的时候触发的。
所以进入了执行阶段。
WSREP: rbr write fail, data_len: 0, 2:
WSREP: transaction size limit (4294901759) exceeded: 4294967296:
3) [Warning] WSREP: transaction size limit (4294901759) exceeded: 4294967296
这里是 4294967296 =4M
调整repl.max_ws_size为128M
MariaDB [test]> set global wsrep_provider_options="repl.max_ws_size=134217728";
4) 查看了 mariadb 10.1 , 10.2, 10.3 ,10.4 各版本源码基本上都有这个问题,
10.4 稍微进行了优化,
但基本原理没变认证(Certification)成功之后 才提交commit,
首先生成此事务的节点会通知应用。除了通知节点,
其他个节点都没法确认是否完成事务成功。
之后跟一个很熟悉的同事,电话交流了一下心得,
mariadb Galera Cluster 强一致性只是做到了一半,个人感觉还不如mysql5.7增强半同步或则MGR呢。
今天分享到这里。
做好准备,做好备份,微信公众号,请关注