共计 1499 个字符,预计需要花费 4 分钟才能阅读完成。
MySQL 常见问题
一、CPU 升高
1、大量慢 SQL 导致 CPU 升高
解决方案:
SHOW PROCESSLIST 查看 sql 慢查,执行 explain [慢 SQL 语句],分析相应慢 SQL 语句(例如库表结构设计不合理、索引缺失、扫描行数太多等)多表关联查询时,关联字段要加上索引。尽量避免用 select* 语句进行全表扫描,可以指定字段或者添加 where 条件。
2、业务请求增高导致
解决方案:
创建只读实例专门负责查询。减轻主实例负载,分担数据库压力。临时方案:临时配置扩容,应急场景可以借助 SQL 限流以及 KILL 会话功能来临时 kill 规避“烂 SQL”。
3、数据库出现大量行锁冲突,内核中大量 update/insert 会话在等待行锁释放
解决方案:
执行 SHOW PROCESSLIST 查询死锁 SQL,排查并优化死锁表相关的业务。业务上合理使用外键,避免更新冲突,避免产生死锁。
二、磁盘打满
1、慢 SQL 问题(复杂查询可能会造成磁盘打满)解决方案:执行 explain [慢 SQL 语句],分析相应慢 SQL 语句, 观察 explain 语句输出的 extra 列,是否有 using temporary、using filesort,如果有,说明该语句用到了临时表或临时文件,数据量大的情况下,会导致磁盘占用高。如果不得不使用临时表,那么一定要减少并发度。
2、业务正常上涨(临时扩容)解决方案:查看物理文件大小 Top50 库表,识别可以删除的历史表数据。可在业务低峰期对碎片率高的表执行 optimize 优化,以便释放空间 Binlog 日志文件占用过多,可以清理本地 Binlog 日志,来释放磁盘空间。针对大量排序查询导致的临时文件过大,建议优化 SQL 查询。
三、内存打满
内存分配可划分为 Engine 层与 Server 层。Engine 层的内存包括 InnoDB Buffer Pool、Log Buffer、Full Text Index Cache,其中 InnoDB Buffer Pool 为常驻内存,占用内存较大。InnoDB 缓冲池是一个内存区域,用于保存 InnoDB 表、索引和其他辅助缓冲区的缓存数据,可以通过参数“innodb_buffer_pool_size”定义缓冲池大小。云上的 MySQL 本身具有内存动态平衡机制,建议内存使用率告警阈值设置不低于 90%。Server 层的内存占用较高的包括 Thread Cache、BinLog Cache、Sort Buffer、Read Buffer、Join Buffer 等线程缓存,这类缓存非常驻内存,往往会随着连接关闭而释放。
四、性能突然下降
数据库迁移到云上 RDS,发现同一条 sql 语句执行性能远差于原数据库。
可能是由数据库的 buffer_pool 机制决定的:第 1 次执行时,数据在磁盘上,称之为冷数据,读取需要一定的耗时。
Lb 负载均衡常见问题
一、请求分布不均衡
1、总体的请求数较少。
2、后端服务器组中 ECS 实例的权重不一致。
3、后端服务器的健康状态异常。
4、负载均衡 SLB 实例开启了会话保持功能。
二、服务地址访问超时
1、LB 实例的服务地址被安全防护,如流量黑洞和流量清洗、WAF 防护。
2、客户端端口不足。
3、后端服务器访问四层负载均衡 SLB 的服务地址会导致连接失败。
云上常见的高可用的基础架构
1、使用负载均衡服务 LB 来分配流量,提高系统的并发处理能力和容错能力。
2、利用弹性计算服务 ECS 部署应用程序实例,并结合弹性伸缩 AS 根据负载动态增减实例数量。
3、将数据存储在高性能的对象存储或关系型数据库 RDS 中,确保数据的持久性和可靠性。
4、实施多可用区部署策略,即在不同地理位置的可用区间复制关键组件,以增强系统的可用性和灾难恢复能力。