一、复习一下
在一主一备的双 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模式)