51Testing软件测试论坛

标题: MHA常见问题记录 [打印本页]

作者: TimiZheng    时间: 2019-10-17 16:38
标题: MHA常见问题记录
1、从库ip地址更换,会导致从库同步假死,停止接收,但不报任何错误,直接stop  slave 再走start slave 即可
在使用mha过程中,就会发现切换一直卡住下不去

2、业务用户权限不正确,如果使用的用户有super权限,那么在切换的过程中,设置read-only是不起作用的,所以用户必须去掉super权限。

3、误切换的风险,如果只是mha manager节点到主库之间的问题,会被误认为主库已经宕机(或者失联),从而强行启动切换,并且在切换中由于已经无法连接主库,那么主库也是不能被设置为readonly或者上锁,就会出现问题。通过增加旁路检测可以避免这样的风险。

4、主从数据库版本不一致。在切换中mha要设新的主库,必须是版本最旧的mysql实例才能作为新的从库。如果主库版本比从库版本要高,在手动切换的时候会出错。
ServiceManager.pm  中的 get_bad_candidate_masters,源码如下 :
  1. <p style="margin: 8px 0px;"># The following servers can not be master:</p>
  2. <p style="margin: 8px 0px;"># - dead servers</p>
  3. <p style="margin: 8px 0px;"># - Set no_master in conf files (i.e. DR servers)</p>
  4. <p style="margin: 8px 0px;"># - log_bin is disabled</p>
  5. <p style="margin: 8px 0px;"># - Major version is not the oldest</p>
  6. <p style="margin: 8px 0px;"># - too much replication delay</p>
  7. <p style="margin: 8px 0px;">sub get_bad_candidate_masters($) {</p>
  8. <p style="margin: 8px 0px;"> <wbr> my $self <wbr>  <wbr>  <wbr>  <wbr>  <wbr>
  9. <wbr>  <wbr>  <wbr>  <wbr>  <wbr> = shift;</p>
  10. <p style="margin: 8px 0px;"> <wbr> my $latest_slave <wbr>  <wbr>  <wbr>  <wbr>
  11. <wbr>  <wbr> = shift;</p>
  12. <p style="margin: 8px 0px;"> <wbr> my $check_replication_delay = shift;</p>
  13. <p style="margin: 8px 0px;"> <wbr> my $log <wbr>  <wbr>  <wbr>  <wbr>  <wbr>
  14. <wbr>  <wbr>  <wbr>  <wbr>  <wbr>  <wbr>= $self->{logger};</p>
  15. <p style="margin: 8px 0px;">
  16. </p>
  17. <p style="margin: 8px 0px;"> <wbr> my @servers <wbr>  <wbr>  <wbr>=
  18. $self->get_alive_slaves();</p>
  19. <p style="margin: 8px 0px;"> <wbr> my @ret_servers = ();</p>
  20. <p style="margin: 8px 0px;"> <wbr> foreach (@servers) {</p>
  21. <p style="margin: 8px 0px;"> <wbr>  <wbr> if (</p>
  22. <p style="margin: 8px 0px;"> <wbr>  <wbr>  <wbr>  <wbr>  <wbr>$_->{no_master}
  23. >= 1</p>
  24. <p style="margin: 8px 0px;"> <wbr>  <wbr>  <wbr> || $_->{log_bin} eq '0'</p>
  25. <p style="margin: 8px 0px;"> <wbr>  <wbr>  <wbr> || $_->{oldest_major_version}
  26. eq '0'</p>
  27. <p style="margin: 8px 0px;"> <wbr>  <wbr>  <wbr> || (</p>
  28. <p style="margin: 8px 0px;"> <wbr>  <wbr>  <wbr>  <wbr> $latest_slave</p>
  29. <p style="margin: 8px 0px;"> <wbr>  <wbr>  <wbr>  <wbr> && (
  30. $check_replication_delay</p>
  31. <p style="margin: 8px 0px;"> <wbr>  <wbr>  <wbr>  <wbr>  <wbr> &&
  32. $self->check_slave_delay( $_, $latest_slave ) >= 1 )</p>
  33. <p style="margin: 8px 0px;"> <wbr>  <wbr>  <wbr> )</p>
  34. <p style="margin: 8px 0px;"> <wbr>  <wbr>  <wbr> )</p>
  35. <p style="margin: 8px 0px;"> <wbr>  <wbr> {</p>
  36. <p style="margin: 8px 0px;"> <wbr>  <wbr>  <wbr> push( @ret_servers, $_ );</p>
  37. <p style="margin: 8px 0px;"> <wbr>  <wbr> }</p>
  38. <p style="margin: 8px 0px;"> <wbr> }</p>
  39. <p style="margin: 8px 0px;"> <wbr> return @ret_servers;</p>
  40. <p style="margin: 8px 0px;">}</p>
复制代码



5、GTID的潜在风险。
gtid模式由于不使用文件和位移,直接使用gtid编号来同步,所以实际在使用中,切换之后新的gtid必须是连续才能设置成功。
假设A 原来是主库,B、C是从库,都指向A
B从建库之后,执行了几个自己的命令,如更改了用户权限表等,就产生了一个GTID,如UUID-B-1
这个GTID-B-1 在binlog文件中,随着时间推移,日志文件被清理掉了
突然有一天A故障,B被提升为主库,C将主库指向B,这时C就无法找到GTID-B-1,于是同步就出错了。mha切换程序会一直卡在那里。
这种风险需要被消除。处理上是比较简单的,我们在C上指定一个空事务来作为GTID-B-1,这样c就会从后面GTID-B-2开始找。
但是在自动切换中需要提前检测并解决该问题。

[attach]126881[/attach]
文章来源:沧海大声啸的博客           作者:Kervin(博为峰网校讲师)
讲师作品: MySQL实战校园业务数据库:http://www.atstudy.com/course/2001







欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2