TA的每日心情 | 开心 2019-10-10 16:07 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]测试小兵
|
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,源码如下 :
- <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开始找。
但是在自动切换中需要提前检测并解决该问题。
|
|