福州网站开发定制,国外WordPress主题购买,中国建设协会官网证件查询,把自己做的网站开放到外网目录select1判断查表判断更新判断外部检测弊端内部统计一主一备的双M架构里#xff0c;主备切换只需要把客户端流量切换到备库。
在一主多从的架构里#xff0c;主备切换要把客户端流量切换到备库#xff0c;也需要把从库接到新主库上。
切换有两种场景#xff1a;1、主动… 目录select1判断查表判断更新判断外部检测弊端内部统计 一主一备的双M架构里主备切换只需要把客户端流量切换到备库。
在一主多从的架构里主备切换要把客户端流量切换到备库也需要把从库接到新主库上。
切换有两种场景1、主动切换 2、被动切换。
被动切换是由于主库出问题了下面是几种判断主库出问题的方法
select1判断
select 1 成功返回说明这个库的进程孩子啊但是不能说明主库没问题。
如果在执行语句超过了设置的innodb_thread_concurrency此时select 1语句是成功的但是CPU不能满足线程查询要求了新的查询要求进来只会阻塞。
查表判断
在系统库(mysql库)里创建一个表命名为health_check里面只放一行数据然后定期执行语句
select * from mysql.headlth_check;使用这个方法可以检测出由于并发线程过多导致的数据库不可用的情况。
但是这个方法也会有一个问题空间满了失效
更新事务要写binlog一旦binlog所在的磁盘空间占用率达到100%那么所有的更新语句和事务提交commit语句就会堵住。但是系统此时是可以正常读数据的。
更新判断
放一个timestamp字段用来表示最后一次执行检测的时间
update mysql.health_check set t_modified now();这种节点可用性检测应该包含主库和备库。
备库检测也要写binlog 一般只能主库写备库不能写。这里是为了检测备库所以才能写但是binlog是双M结构所以会互相同步这一个检测sql那么有可能会造成主从数据不一致t_modified内容不同
如果主库A和备库B都用相同的更新命令就可能出现行冲突从而导致主备同步停止。
我们可以在表上存入多行数据用AB的server_id做主键
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_modifiednow();MySQL规定了主库和备库的server_id必须不同就可以保证主、备库各自的检测命令不会发生冲突
这种方法仍然存在问题判定慢
所有的检测逻辑都需要一个超时时间N。即执行一条update语句超过N秒后还不返回就认为系统不可用。
如果一个日志盘的IO利用率已经是100%的场景此时系统响应非常慢已经需要做主备切换了。
我们检测使用的update命令由于需要的资源比较少很可能在拿到IO资源的时候就可以提交成功并且在超时时间N秒未到达之前就返回给检测系统。所以update命令没有超时然后得到系统正常的错误结论。
外部检测弊端
上面的三种方法都是基于外部检测的。外部检测天然有个问题就是随机性。
外部检测都需要定时轮询所以系统可能已经出现问题了但是却要等到下一个检测语句执行的时候才能发现问题。运气不好第一次轮询还不能发现。
内部统计
MySQL5.6版本后提供了performance_schema库在file_summary_by_event_name表里统计每次IO请求的时间。
该行数据统计的是redo log的写入时间。
COUNT_STAR是所有IO总次数。
前缀SUM、MIN、AVG、MAX指统计项的总和、最小值、平均值、最大值。
SUM_NUMBER_OF_BYTES_READ 统计总共从redo log里读了多少字节
需要注意的是每进行一次统计是由性能损耗的所以建议只打开自己需要的项进行统计。
如打开 redo log 的时间监控
mysql update setup_instruments set ENABLEDYES, TimedYES where name like %wait/io/file/innodb/innodb_log_file%;然后通过MAX_TIMER值来判断数据库是否出现问题。可以设定阈值单次IO请求时间超过200ms属于异常然后使用类似于下面的语句检测
mysql select event_name,MAX_TIMER_WAIT FROM performance_schema.file_summary_by_event_name where event_name in (wait/io/file/innodb/innodb_log_file,wait/io/file/sql/binlog) and MAX_TIMER_WAIT200*1000000000;发生异常后取得需要数据后再
mysql truncate table performance_schema.file_summary_by_event_name;把之前的统计信息清空。