主备切换有两种场景,一种是主动切换,一种是被动切换。被动切换,往往是因为主库出问题了,有HA熊发起的。
怎么判断一个主库出问题了?
连上MySQL执行一个select 1,成功返回了,就表示主库没问题吗?
select 1判断
成功返回,只能说明这个库的进程还在,并不能说明主库没问题。
查表判断
一般做法是,在系统里(mysql库)创建一个表,比如health_check,里面只放一行数据,然后定期执行:
select * from mysql.health_check;
这个方法可以检测出由于并发线程过多导致的数据库不可用的情况。
但是,空间满了以后,这种方法又会变得不好使。
更新判断
常见的做法是放一个timestamp字段,用来表示最后一次执行检测的时间。更新语句类似于:
update mysql.health_check set t_modified=now();
节点可用性检测都应该包含主库和备库。如果用更新来检测主库的话,那么备库也要进行更新检测。
这样的话,mysql。health_check就不能只有一行数据了,因为只有一行数据会导致主备同步停止(主备之间更新产生冲突)。
可以在mysql.health_check表上存入多行数据,并用A、B的server_id做主键。
mysql> CREATE TABLE `health_check` (
`id` int(11) NOT NULL,
`t_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;/* 检测命令 */
insert into mysql.health_check(id, t_modified) values (@@server_id, now()) on duplicate key update t_modified=now();
内部判断
如果MySQL可以告诉我们,内部每一次IO请求的时间,那判断数据库是否出问题的方法就可靠多了。
MySQL 5.6版本以后提供的performance_schema库,就在file_summary_by_event_name表里统计了每次IO请求的时间。
建议:优先考虑update系统表,然后再配合增加检测performance_schema的信息。
上一篇:28 | 读写分离有哪些坑