《MySQL——外部检测与内部统计 判断 主库是否出现问题》

目录

    • 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都用相同的更新命令,就可能出现行冲突,从而导致主备同步停止。

我们可以在表上存入多行数据,用A,B的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_modified=now();

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 ENABLED='YES', Timed='YES' 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_WAIT>200*1000000000;

发生异常后,取得需要数据后再:

mysql> truncate table performance_schema.file_summary_by_event_name;

把之前的统计信息清空。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NIM的完整形式是什么?

NIM:无内部消息 (NIM: No Internal Message) NIM is an abbreviation of "No Internal Message". NIM是“无内部消息”的缩写。 It is an expression, which is commonly used in the Gmail platform. It is written in the subject of the mail, if the…

[Json] C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json (转载)...

点击下载 ConvertJson.rar 本类实现了 C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json|等功能大家先预览一下 请看代码 /// <summary> /// 类说明&#xff1a;Assistant /// 编 码 人&#xff1a;苏飞 /// 联系方式&#xff1a;361983679 …

let 只能在严格模式下吗_LET的完整形式是什么?

let 只能在严格模式下吗LET&#xff1a;今天早早离开 (LET: Leaving Early Today) LET is an abbreviation of "Leaving Early Today". LET是“ Leaveing Today Today”的缩写 。 It is an expression, which is commonly used in the Gmail platform. It is writt…

js 遮罩层 loading 效果

//调用方法 //关闭事件<button οnclickLayerHide()>关闭</button>&#xff0c;在loadDiv(text)中&#xff0c;剔除出来 //调用LayerShow(text)&#xff0c;text为参数&#xff0c;可以写入想要写入的提示语 //本方法在调用时会自动生成一个添加到body的div&#x…

centos6.5安装配置LDAP服务[转]

centos6.5安装配置LDAP服务[转] 安装之前查一下 1find / -name openldap*centos6.4默认安装了LDAP&#xff0c;但没有装ldap-server和ldap-client 于是yum安装 1su root2yum install -y openldap openldap-servers openldap-clients不建议编译源码包&#xff0c;有依赖比较麻烦…

《MySQL——恢复数据-误删行、表、库》

目录误删行事前预防误删行数据方法误删表/库延迟复制备库事前预防误删库/表方法传统的架构不能预防误删数据&#xff0c;因为主库的一个drop table命令&#xff0c;会通过binlog传给所有从库和级联从库&#xff0c;进而导致整个集群的实例都会执行这个命令。 MySQL相关的误删除…

python图例位置_Python | 图例位置

python图例位置Legends are one of the key components of data visualization and plotting. Matplotlib can automatically define a position for a legend in addition to this, it allows us to locate it in our required positions. Following is the list of locations…

Freemarker中遍历List实例

Freemarker中如何遍历List摘要&#xff1a;在Freemarker应用中经常会遍历List获取需要的数据&#xff0c;并对需要的数据进行排序加工后呈现给用户。那么在Freemarker中如何遍历List&#xff0c;并对List中数据进行适当的排序呢&#xff1f;通过下文的介绍&#xff0c;相信您一…

工作总结:文件对话框的分类(C++)

原文地址&#xff1a;http://www.jizhuomi.com/software/173.html 文件对话框分为打开文件对话框和保存文件对话框&#xff0c;相信大家在Windows系统中经常见到这两种文件对话框。例如&#xff0c;很多编辑软件像记事本等都有“打开”选项&#xff0c;选择“打开”后会弹出一个…

《MySQL——Innodb改进LRU算法》

Innodb改进LRU.算法&#xff0c;实质上将内存链表分成两段。 靠近头部的young和靠近末尾的old&#xff0c;取5/12段为分界。 新数据在一定时间内只能在old段的头部&#xff0c;当在old段保持了一定的时间后被再次访问才能升级到young。 实质上是分了两段lru&#xff0c;这样做的…

nfc/nfc模式_NFC的完整形式是什么?

nfc/nfc模式NFC&#xff1a;没有进一步评论 (NFC: No Further Comment) NFC is an abbreviation of "No Further Comment". NFC是“没有进一步评论”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking s…

dx小记(2)

1.构造一个平截台体&#xff08;Frustum&#xff09; 最近距离-projMatirx.43/projMatrix.33 projMatrix。33 深度/&#xff08;深度-最近距离&#xff09; projMatrix。44-最近距离*&#xff08;深度/&#xff08;深度-最近距离&#xff09;&#xff09; FrustumMatrix proje…

jQuery: 整理4---创建元素和添加元素

1.创建元素&#xff1a;$("内容") const p "<p>这是一个p标签</p>" console.log(p)console.log($(p)) 2. 添加元素 2.1 前追加子元素 1. 指定元素.prepend(内容) -> 在指定元素的内部的最前面追加内容&#xff0c;内容可以是字符串、…

Design a high performance cache for multi-threaded environment

如何设计一个支持高并发的高性能缓存库 不 考虑并发情况下的缓存的设计大家应该都比较清楚&#xff0c;基本上就是用map/hashmap存储键值&#xff0c;然后用双向链表记录一个LRU来用于缓存的清理。这篇文章 应该是讲得很清楚http://timday.bitbucket.org/lru.html。但是考虑到高…

《MySQL——join语句优化tips》

目录要不要用joinJoin驱动表选择Multi-Range Read优化Batched Key Access &#xff08;BKA&#xff09;对NLJ进行优化BNL算法性能问题BNL转BKA要不要用join 1、如果使用的是Index Nested-Loop Join算法&#xff0c;即可以用上被驱动表的索引&#xff0c;可以用 2、如果使用的…

scala中抽象类_Scala中的抽象类

scala中抽象类抽象类 (Abstract Class) In the Scala programming language, abstraction is achieved using abstract class. 在Scala编程语言&#xff0c; 抽象是使用抽象类来实现的。 Abstraction is the process of showing only functionality and hiding the details fr…

不能catch Fatal的exception

Clemens Vasters - Are you catching falling knives?里给了一个判断C#的exception是不是fatal的代码&#xff0c;可以参考参考。 public static bool IsFatal(this Exception exception) {while (exception ! null){if (exception as OutOfMemoryException ! null &&…

HDU 2824 The Euler function

筛法计算欧拉函数 #include <iostream> #include <cstdio> using namespace std; const int maxn3000005; long long phi[maxn]; int main(){int i,j,a,b;for(i1;i<maxn;i) phi[i]i;for(i2;i<maxn;i2) phi[i]/2;for(i3;i<maxn;i2)if(phi[i]i){for(ji;j<…

LinkChecker 8.1 发布,网页链接检查

LinkChecker 8.1 可对检查时间和最大的 URL 数量进行配置&#xff1b;当使用 HTTP 请求时发送 do-not-track 头&#xff1b;生成 XML 的 sitemap 用于搜索引擎优化&#xff1b;检测 URL 长度和重复的页面内容&#xff1b;修复了很多检查的 bug。 LinkChecker 是一个网页链接检查…

c语言语言教程0基础_C语言基础

c语言语言教程0基础Hey, Folks here I am back with my second article on C language. Hope you are through with my previous article C language - History, Popularity reasons, Characteristics, Basic structure etc. In this one, I will cover some fundamental conce…