MySQL 單機支撐幾十萬 IP 尚可,但面對百萬甚至千萬級流量便力不從心。本文記錄某團隊從集群、分治、代碼優化到架構重構的演進之路,最終以「寫文件+批量導入」策略破解寫入瓶頸。
受限於資金、人才、技術成熟度,叢集方案對中小團隊不現實。叢集本質是將單機壓力分散到多節點,但運維複雜度極高。
利用現有低配服務器,將百萬流量拆分為十個十萬級節點統計。
優點:充分利用現有資源,快速解決燃眉之急。
缺點:非長久之計,數據聚合統計極其麻煩,維護成本高。
移除插入前的 IP 存在性判斷、來源檢查,直接寫入。雖保留全量數據,但龐大數據量導致後續處理把服務器跑死;保留索引拖慢寫入,去掉索引又導致後處理極慢,得不償失。
格式可為 XML、JSON 或自定義規則,例如:
221.2.70.52,https://www.baidu.com,windowxp\r\n
221.2.70.52,https://www.baidu.com,windowxp\r\n
關鍵技巧:使用 error_log() 寫文件
原為寫錯誤日誌,實則極適合高併發追加寫入:
error_log("內容", 3, "/date.dat");
date('YmdH') 如 2008121112,自動生成小時級文件,無需判斷邏輯。入庫前處理:將同 IP 文件拆分、去重、聚合頁面訪問生成新數據。
高效導入:使用 LOAD DATA INFILE:
$sql = "LOAD DATA INFILE '$file' INTO TABLE `test`
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'
(`time`, `md5`)";
十萬級數據導入秒級完成。核心啟示:解決資料庫瓶頸不一定要加設備、換資料庫,換個思路往往更有效。