主备切换有两种场景,一种是主动切换,一种是被动切换。其中被动切换就是主库出现故障,由HA系统发起进行切换的。

那么今天的问题就是:如何判断主库出现了问题?

select 1判断

select 1成功返回,说明这个库的进程还在,并不能说明主库没有问题。

mysql对并发执行的线程数是由innodb_thread_concurrency 参数控制的,达到这个限制之后,后续对表的查询都会进入等待,但是select 1不会查表所以不会等待。因此就检查不出这个问题了。

查表判断

为了能够检测innodb并发线程数过多导致系统不可用的情况,在系统库中创建一个表,命令为health_check,里面只放一行数据,然后定期执行。

但是这对于磁盘满了,能够正常读取数据,无法写数据的情况无法判断。

更新判断

将查询语句改为更新语句就可以判断了,放一个timestamp字段,用来表示最后一次执行检测的时间,类似于:

update mysql.health_check set t_modified=now();

但是这样在IO利用率100%的系统上,正常的SQL已经很慢了,但是更新的语句占用的资源很少,所以可能在超时之间执行结束并返回,导致HA认为这个系统是正常的。

这就会导致切换慢的问题出现。

内部统计

让mysql告诉每一次请求的时间,mysql5.6版本以后提供的performance_schema库,在file_summary_by_event_name表中统计了每次IO请求的时间。

开启这个功能,每次操作都需要额外记录这些信息,所以是有性能损耗的。

利用MAX_TIMER_WAIT的值来判断数据库是否出现问题,当累计异常之后,执行切换。