29 | 如何判断一个数据库是不是出问题了?(研发也要懂运维呀)

一、复习一下

在一主一备的双 M 架构里,主备切换只需要把客户端流量切到备库,一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。

二、瀑布式记忆

1.如何判断一个主库是否出了问题(4种方法)?

  • select 1一下

  • 查表判断

  • 更新判断

  • 内部统计

2.select 1的问题是什么?如何解决?

  • 只能查看当前系统是否真的GG了,当达到innodb并发线程上限时【innodb_thread_concurrency】,select 1会仍然可用。

  • 3的查表方法。

2.1.并发线程innodb_thread_concurrency设置多少合适?这个参数跟“并发查询”和“并发连接【show processlist】”的关系是什么?热点行更新会导致参数中的值快速耗尽从而导致系统GG?

  • 把 innodb_thread_concurrency 设置为 64~128 之间的值。个人理解:这个值跟show status like 'Threads%';中的running数上限基本上就是这个值,与系统QPS的关系为?就是汽车中的转速表和速率表的关系。

  • 并发查询过高会造成CPU飙升;跟并发连接没有关系,连接多最多就是占内存。个人理解:避免慢SQL也是从此处考虑,比如多个select sleep(100) from t就很快把并发线程数打满。

  • 不会,在线程进入锁等待以后,并发线程的计数会减一,也就是说等行锁(也包括间隙锁)的线程是不算在 128 里面的。通俗解释:每当有一个线程执行查询时,计数值加1,假如innodb_thread_concurrency = 128,计数值到达128时,就不允许其它线程再来执行查询了,但是如果其中的某些线程,是进入了锁等待状态,并没有执行查询,那么计数值就会减1。

3.查表判断的好处是什么?怎么做?问题是什么?怎么解决?

  • 能够检测 InnoDB 并发线程数过多导致的系统不可用情况。

  • 一般的做法是,在系统库(mysql 库)里创建一个表,比如命名为 health_check,里面只放一行数据,然后定期执行:select * from mysql.health_check;

  • 当磁盘io利用率满了以后所有的更新语句和事务提交的 commit 语句就都会被堵住。但是,系统这时候还是可以正常读数据的。

  • 用4的更新判断:新增一个时间字段,定时用更新这个表数据。

4.更新判断再主备库中怎么做?双M架构中如何解决循环更新?问题是什么?如何解决?

  • mysql> update mysql.health_check set t_modified=now()

  • 再增加一列表识server_id,当出现行冲突就会报错。

  • 外部检测会出现“判定慢”的情况。举例:更新语句,如果失败或者超时,就可以发起主备切换了,出现判定慢是因为IO资源分配具有随机性,有可能你这个更新语句恰好分配到了资源执行了,但是业务正常的SQL已经出现执行很慢的情况了,导致本次更新没有发现。

  • 使用5.内部统计方式

5.内部统计原理是什么?如果打开所有performance_schema会有什么问题,建议是什么?打开监控后需要怎么做?

  • MySQL 5.6 版本以后提供的 performance_schema 库,就在 file_summary_by_event_name 表里统计了每次 IO 请求的时间。redo log为event_name='wait/io/file/innodb/innodb_log_file’。binlog为event_name = "wait/io/file/sql/binlog"。

  • 监控是会导致性能下降的,只打开自己需要的。打开 redo log 的时间监控命令:mysql> update setup_instruments set ENABLED='YES', Timed='YES' where name like '%wait/io/file/innodb/innodb_log_file%';

  • 通过查询命令来看单此io请求时间超过多少秒的有哪些。命令: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;

三、课后题

实战中怎么判定服务有没有出问题?

 

四、评论出真相

双M出现主键插入冲突会导致主备同步停止。怎么理解?

👍:这个语句记录到binlog就是一条insert语句,包含完整的插入数据,没有 on duplicate key update相关的信息了,所以会导致主键冲突(row模式)

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值