在 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 宿主機使用的是 ext4 或 XFS 檔案系統,並建議將資料庫放在 NVMe SSD 上。
2. 資源限制與分配 (Resource Allocation)
資料庫是貪婪的,如果沒有限制資源,多個容器可能會互相搶奪。
設定內存限制: 避免 OOM (Out of Memory) 導致資料庫崩潰。
YAML# docker-compose.yml 範例 deploy: resources: limits: memory: 4GMySQL 快取優化: 在
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 宿主機執行:
Bashecho 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 檔案,並在其中明確定義 Networks 與 Volumes。
您需要我提供一份包含上述效能優化參數的 docker-compose 模板嗎?
沒有留言:
張貼留言