2025年12月29日 星期一

Ubuntu 上透過 Docker 部署 MySQL (SQL) 與 MongoDB (NoSQL)

 在 Ubuntu 上透過 Docker 部署 MySQL (SQL) 與 MongoDB (NoSQL) 時,效能優化的核心在於減少 I/O 損耗正確分配硬體資源以及針對不同資料庫特性進行微調

以下是針對存取效率改善的重點建議:


1. 儲存層優化:避免使用容器寫入層

這是提升效能最關鍵的一點。預設情況下,Docker 的寫入層(Copy-on-Write)效能非常差,不適合頻繁讀寫的資料庫。

  • 使用具名磁碟卷 (Named Volumes): 這是官方推薦做法,Docker 會管理主機上的特定路徑,繞過儲存驅動程式的效能損耗。

  • 使用主機掛載 (Bind Mounts): 如果您需要直接管理主機上的 SSD 路徑,使用 -v /opt/data/mysql:/var/lib/mysql

  • 檔案系統選擇: 確保 Ubuntu 宿主機使用的是 ext4XFS 檔案系統,並建議將資料庫放在 NVMe SSD 上。


2. 資源限制與分配 (Resource Allocation)

資料庫是貪婪的,如果沒有限制資源,多個容器可能會互相搶奪。

  • 設定內存限制: 避免 OOM (Out of Memory) 導致資料庫崩潰。

    YAML
    # docker-compose.yml 範例
    deploy:
      resources:
        limits:
          memory: 4G
    
  • MySQL 快取優化:my.cnf 中調整 innodb_buffer_pool_size。通常建議設定為給予該容器總內存的 70-80%

  • MongoDB 快取優化: MongoDB 的 WiredTiger 引擎預設會佔用 50% RAM - 1GB。在 Docker 中,請手動設定 --wiredTigerCacheSizeGB,確保它不會超出容器被分配的限制。


3. 網路效能改善

Docker 預設的橋接網路 (Bridge Network) 會有一層 NAT 轉換,這在高併發時會增加延遲。

  • 使用 Host 模式(僅限單機且注重極致效能): network_mode: "host" 可以消除網路虛擬化開銷,但要注意埠號衝突。

  • 優化 DNS: 在 Docker 設定中停用不必要的 DNS 查詢,或直接在連線字串中使用 IP。


4. 資料庫特定調優

MySQL (關係型資料庫)

  • 日誌優化: 設定 innodb_flush_log_at_trx_commit = 2。這在容許極小機率遺失資料的情況下,能大幅提升寫入速度(從每秒幾百次提升到幾千次)。

  • 連線池: 確保應用端使用 Connection Pooling,避免頻繁建立 Docker 網路連線。

MongoDB (文件型資料庫)

  • 關閉透明大頁面 (Transparent Huge Pages): 這對 MongoDB 效能傷害很大。在 Ubuntu 宿主機執行:

    Bash
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    
  • 索引優化: MongoDB 非常依賴索引。使用 explain() 檢查查詢是否導致了全表掃描 (COLLSCAN)。

  • Write Concern: 視需求調整。如果不需要強一致性,改用 w: 1 甚至 w: 0 (不推薦用於生產) 來提升寫入效率。


5. 監控與維護建議

工具用途
docker stats即時觀察 CPU/內存 使用率,判斷是否有資源瓶頸。
iostat在 Ubuntu 上檢查磁碟 I/O 等待時間 (wait)。
MySQL Slow Query Log找出執行緩慢的 SQL 語句。
MongoDB Profiler分析慢查詢並優化索引設定。

下一步建議

如果您打算同時運行這兩個資料庫,我建議您撰寫一個 docker-compose.yml 檔案,並在其中明確定義 NetworksVolumes

您需要我提供一份包含上述效能優化參數的 docker-compose 模板嗎?

沒有留言:

張貼留言