首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 支撐百萬級流量高並發架構實戰:從分庫分表到文件落地異步入庫的演進之路

     編輯:MySQL 綜合教學

前言

面對百萬級日 PV、高並發寫入場景,單庫單表 MySQL 早已力不從心。本文記錄某團隊從「集群方案不可行 → 分而治之維護成本高 → 同步寫入鎖表 → 異步文件落地 + 批量 Load Data」的架構演進全過程,揭示「換思路勝過換硬件」的工程智慧。

一、 方案演進時間軸

階段方案核心痛點結果
1.0MySQL Cluster / 主從同步集群成本高、技術門檻高、運維複雜❌ 否決
2.0業務拆分:不同統計模塊部署不同廉價服務器數據聚合極其痛苦、非長久之計⚠️ 緩解但未根治
3.0改同步寫入為「來一條插一條」,去掉判重邏輯索引維護開銷大、單表 5000萬行 Insert 慢、鎖爭用劇烈❌ 服務器仍跑死
4.0異步文件落地 + 定時批量 Load Data 入庫無✅ 徹底解決,成本極低

二、 終極方案核心架構


[客戶端請求]
      │
      ▼
[PHP/Java 應用層] ──▶ 組裝 CSV/JSON 行數據
      │
      ▼
[error_log() 寫入本地磁盤文件]  ◀─── 關鍵技巧:非阻塞、高性能、無依賴
      │
      ▼
[文件命名規則:日期小時_IP前綴.log]
      │
      ▼
[定時任務] 掃描文件 → 去重/聚合 → LOAD DATA INFILE 入庫
      │
      ▼
[MySQL 核心業務表 / 數據倉庫]

三、 關鍵技術細節

3.1 非阻塞寫入:error_log() 妙用

// PHP 示例
$line = sprintf("%s,%s,%s\r\n", $ip, $referer, $ua);
error_log($line, 3, "/data/logs/stat_2023101514_221.log");
  • 系統調用級別,無 PHP 解析開銷
  • 追加寫入,極快(SSD 可達 100MB/s+)
  • 無需引入 Kafka/RocketMQ 等重組件

3.2 文件命名策略:時間粒度 + IP 前綴

// 文件名:stat_YYYYMMDDHH_IP前3位.log
$filename = sprintf("stat_%s_%s.log", date('YmdH'), substr($ip, 0, strrpos($ip, '.')));
  • 按小時切分:單文件大小可控,天然支援定時任務按小時處理
  • IP 前綴分桶:同一 IP 訪問集中在同一文件,便於後續去重、會話聚合

3.3 入庫前處理:去重與聚合

# Shell/Python 掃描處理邏輯
for file in stat_2023101514_*.log; do
    # 1. 去重(同 IP+URL+UA 視為同一 PV)
    sort -u $file > $file.uniq
    # 2. 聚合(同 IP 多頁面合併為一行 Session)
    python aggregate.py $file.uniq > $file.agg
    # 3. 入庫
    mysql -e "LOAD DATA INFILE '$file.agg' INTO TABLE stats 
              FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'
              (ip, referer, ua, pv_count, session_start, session_end);"
done

3.4 LOAD DATA INFILE 極速入庫

LOAD DATA INFILE '/data/logs/stat_2023101514_221.agg'
INTO TABLE stats
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\r\n'
(ip, referer, ua, pv_count, session_start, session_end);
  • 繞過 SQL 解析、優化器、Undo/Redo Log(可配合 SET SESSION sql_log_bin=0)
  • 批量構建 B+ 樹索引,比逐行 Insert 快 20-50 倍
  • 單表 50萬行導入耗時 < 1 秒

四、 架構優勢總結

維度同步直寫異步文件 + Load Data
寫入延遲毫秒級(含索引維護)微秒級(僅追加文件)
並發承載受限於鎖/索引近無上限(文件系統並發寫入)
數據不丟失依賴 Binlog/雙寫文件落地即持久化,可備份/重放
入庫效率單行 Insert,索引碎片化批量 Load Data,索引緊湊
運維成本高(需集群/分庫分表)低(單機文件 + 定時腳本)

五、 避坑指南

  1. 文件輪轉:配合 logrotate 或腳本定時壓縮/清理歷史文件
  2. 異常重試:Load Data 失敗需保留文件,下一輪重試
  3. 幂等性:文件名含時間/IP,天然去重;入庫表加唯一鍵防重複導入
  4. 監控告警:文件積壓超閾值、Load Data 耗時異常、磁盤剩餘空間
  5. 時序一致性:接受「數據延遲 1 小時可見」,業務層面通常可接受

六、 總結

百萬級流量並不一定需要分庫分表、NewSQL 或昂貴集群。「寫文件異步化 + 批量 Load Data 入庫」 以極低成本、極簡架構、極高吞吐,完美解決了高並發寫入瓶頸。這體現了工程師的核心價值:在約束條件下,用最簡單的方案解決最複雜的問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved