Featured image of post Database

Database

mysql

1. mysql查询突然变的很慢,需要怎么排查

检查查询本身

  • 查看SQL查询是否可以优化,比如使用合适的索引、避免全表扫描等。
  • 复杂的JOIN操作:确认是否有多个大的表连接,或者是不必要的复杂操作

查看数据库性能

慢查询日志:启用并查看慢查询日志(slow_query_log)。查看最近哪些查询执行时间较长。

检查系统负载

系统资源:查看CPU、内存、磁盘IO、网络等资源是否有瓶颈,可以通过 top 或 htop 等工具监控。 磁盘IO:查看磁盘读写是否成为瓶颈。可以用 iostat 或 vmstat 等工具查看磁盘IO情况。

检查锁和并发问题

锁情况:查看是否有锁等待或死锁问题。使用以下SQL语句查看当前的锁状态: 如果有很多线程处于“Locked”状态,可能需要进一步分析锁的来源和解决方法。

网络延迟

如果是远程连接MySQL,确认网络连接是否稳定,延迟是否较高。

redis

1.热key、大key问题

热key问题

  • 热key:指被频繁访问的key,可能导致数据库性能下降。

影响:

  • CPU 集中在一个 Redis 节点
  • QPS 不均匀,集群负载失衡
  • 延迟飙升、请求超时
  • 导致节点触发 failover

解决方案

  • 业务层分流/分桶 将热请求拆成多个 key,提高并发承载。
  • 增加缓存层:本地缓存 + Redis 二级缓存,减少对 Redis 的直接访问
  • 使用多 Key 拆分读压力,一个热门大 key 分成多个子 key
  • Redis Proxy 层热点保护,代理层可识别热点并做降级
  • 客户端本地限流 + 降级

大key问题

  • 大key:指key对应的值非常大,占用了大量的内存空间。

影响:

  • 迁移槽时(CLUSTER ADDSLOTS/MIGRATE)非常慢
  • 可能阻塞 Redis 主线程
  • 删除时触发阻塞(del O(n) 操作
  • 压垮网络带宽
  • 读写延迟变大
  • Failover 恢复慢

解决方案

  • 业务层拆分:将大 key 拆分成多个小 key,每个小 key 只存储一部分数据。
  • 分页读取:不使用 hgetall/smembers/zrange,使用scan / 分段取
  • 提前限制 value 的大小: 在服务侧做 key 大小限制
  • 避免在 Redis 存储日志、消息、长文本

如何发现大key

  • Redis的SCAN命令
  • redis-cli -h 127.0.0.1 -p 6379 —bigkeys
  • 开源工具Redis RDB Tools,分析RDB文件,扫描出Redis大key。

kafka

1.消费堆积如何处理

消息堆积原因

  • 生产者短时间内生产大量消息到Topic,消费者无法及时消费。
  • 消费者的消费能力不足(消费者并发低、消息处理时间长),导致消费效率低于生产效率。
  • 消费者异常(如消费者故障、消费者网络异常等)导致无法消费消息。
  • Topic分区设置不合理,或新增分区无消费者消费。
  • Topic频繁重分配导致消费效率降低。

解决方法

从消息堆积的原因看,消息堆积问题可以从消费者端、生产者端和服务端三个方面进行处理。

  • 消费者端
    • 根据实际业务需求,合理增加消费者个数(消费并发度),确保分区数/消费者数=整数,建议消费者数和分区数保持一致。
    • 提高消费者的消费速度,通过优化消费者处理逻辑(减少复杂计算、第三方接口调用和读库操作),减少消费时间。
    • 增加消费者每次拉取消息的数量:拉取数据/处理时间 >= 生产速度。
  • 生产者端
    • 生产消息时,给消息Key加随机后缀,使消息均衡分布到不同分区上。
  • 服务端
    • 合理设置Topic的分区数,在不影响业务处理效率的情况下,调大Topic的分区数量。
    • 当服务端出现消息堆积时,对生产者进行熔断,或将生产者的消息转发到其他Topic。

Powered by Hugo | Theme by Stack
Deployed with GitHub Actions 🚀
使用 Hugo 构建
主题 StackJimmy 设计