MHA常见问题记录
1、从库ip地址更换,会导致从库同步假死,停止接收,但不报任何错误,直接stopslave 再走start slave 即可在使用mha过程中,就会发现切换一直卡住下不去
2、业务用户权限不正确,如果使用的用户有super权限,那么在切换的过程中,设置read-only是不起作用的,所以用户必须去掉super权限。
3、误切换的风险,如果只是mha manager节点到主库之间的问题,会被误认为主库已经宕机(或者失联),从而强行启动切换,并且在切换中由于已经无法连接主库,那么主库也是不能被设置为readonly或者上锁,就会出现问题。通过增加旁路检测可以避免这样的风险。
4、主从数据库版本不一致。在切换中mha要设新的主库,必须是版本最旧的mysql实例才能作为新的从库。如果主库版本比从库版本要高,在手动切换的时候会出错。
ServiceManager.pm中的 get_bad_candidate_masters,源码如下 :
<p style="margin: 8px 0px;"># The following servers can not be master:</p>
<p style="margin: 8px 0px;"># - dead servers</p>
<p style="margin: 8px 0px;"># - Set no_master in conf files (i.e. DR servers)</p>
<p style="margin: 8px 0px;"># - log_bin is disabled</p>
<p style="margin: 8px 0px;"># - Major version is not the oldest</p>
<p style="margin: 8px 0px;"># - too much replication delay</p>
<p style="margin: 8px 0px;">sub get_bad_candidate_masters($) {</p>
<p style="margin: 8px 0px;"> <wbr> my $self <wbr><wbr><wbr><wbr><wbr>
<wbr><wbr><wbr><wbr><wbr> = shift;</p>
<p style="margin: 8px 0px;"> <wbr> my $latest_slave <wbr><wbr><wbr><wbr>
<wbr><wbr> = shift;</p>
<p style="margin: 8px 0px;"> <wbr> my $check_replication_delay = shift;</p>
<p style="margin: 8px 0px;"> <wbr> my $log <wbr><wbr><wbr><wbr><wbr>
<wbr><wbr><wbr><wbr><wbr><wbr>= $self->{logger};</p>
<p style="margin: 8px 0px;">
</p>
<p style="margin: 8px 0px;"> <wbr> my @servers <wbr><wbr><wbr>=
$self->get_alive_slaves();</p>
<p style="margin: 8px 0px;"> <wbr> my @ret_servers = ();</p>
<p style="margin: 8px 0px;"> <wbr> foreach (@servers) {</p>
<p style="margin: 8px 0px;"> <wbr><wbr> if (</p>
<p style="margin: 8px 0px;"> <wbr><wbr><wbr><wbr><wbr>$_->{no_master}
>= 1</p>
<p style="margin: 8px 0px;"> <wbr><wbr><wbr> || $_->{log_bin} eq '0'</p>
<p style="margin: 8px 0px;"> <wbr><wbr><wbr> || $_->{oldest_major_version}
eq '0'</p>
<p style="margin: 8px 0px;"> <wbr><wbr><wbr> || (</p>
<p style="margin: 8px 0px;"> <wbr><wbr><wbr><wbr> $latest_slave</p>
<p style="margin: 8px 0px;"> <wbr><wbr><wbr><wbr> && (
$check_replication_delay</p>
<p style="margin: 8px 0px;"> <wbr><wbr><wbr><wbr><wbr> &&
$self->check_slave_delay( $_, $latest_slave ) >= 1 )</p>
<p style="margin: 8px 0px;"> <wbr><wbr><wbr> )</p>
<p style="margin: 8px 0px;"> <wbr><wbr><wbr> )</p>
<p style="margin: 8px 0px;"> <wbr><wbr> {</p>
<p style="margin: 8px 0px;"> <wbr><wbr><wbr> push( @ret_servers, $_ );</p>
<p style="margin: 8px 0px;"> <wbr><wbr> }</p>
<p style="margin: 8px 0px;"> <wbr> }</p>
<p style="margin: 8px 0px;"> <wbr> return @ret_servers;</p>
<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开始找。
但是在自动切换中需要提前检测并解决该问题。
文章来源:沧海大声啸的博客 作者:Kervin(博为峰网校讲师)讲师作品: MySQL实战校园业务数据库:http://www.atstudy.com/course/2001
页:
[1]