可擴展性: 經過增長資源提高容量的能力ios
容量能夠簡單地認爲是處理負載的能力,考慮負載可從如下幾個角度算法
數據量: 不少應用從不物理刪除任何數據,應用所積累的數據量是可擴展的廣泛挑戰sql
用戶量: 更多的用戶意味着更多的事務,更多的複雜查詢數據庫
用戶活躍度服務器
相關數據集的大小架構
估算須要承擔的負載到底有多少負載均衡
大體正確地估計日程表分佈式
應用的功能完成多少工具
預期的最大負載是多少性能
若是依賴系統的每一個部分分擔負載,某個部分失效時會發生什麼
單臺服務器增長各類高性能硬件
燒錢有效的方法
不該該無限制向上擴展
策略: 複製,拆分,數據分片
按功能拆分: 常見作法,根據功能將應用部署在不一樣服務器,並使用專用的數據庫服務器
數據分片是目前擴展大型MySQL最通用且最成功的方法
應用設計初期考慮到,後期實現就比較容易,不然很難將應用從單一數據存儲轉換爲分片架構
文中舉例: 經過用戶id來對文章和評論進行分片,而將用戶的信息保留在單個節點上
數據庫訪問抽象層,下降應用和分片數據之間通訊的複雜度
如非必要儘可能不分片
數據分片最大的挑戰就是查找和獲取數據
相似於表分區,選擇分區鍵和數據分片方式是關鍵,具體請細查
可使用集羣或數據庫分佈式技術根據場景適當解決一些問題
書中提到技術: NDB Cluster, Clustrix等技術
對再也不須要的數據進行歸檔和清理
須要考慮對應用的影響
須要考慮數據邏輯的一致性,例如清理A表歷史數據時須要考慮全部關聯數據的處理
冷熱數據分離
可擴展性: 如讀寫分離時從備庫讀數據
高效性: 把更多工做分配給更好的機器
可用性: 使用時刻保持可用的服務器
透明性: 客戶端無需知道服務器
一致性: 若是應用是有狀態的,負載均衡器就應該將相關的查詢指向同一個服務器
基於查詢分離: 將不能容忍髒數據的查詢分配到主庫,其餘分配到備庫
基於髒數據分離: 讓應用檢查複製延遲,許多報表類應用使用這個策略
基於會話分離: 能夠在會話層作一個標記,若是用戶修改了數據,則一段時間內老是指向主庫
基於版本分離: 給用戶的操做增長版本號,檢查版本號決定從主庫仍是備庫讀取數據
經過變動DNS名指定的服務器實現
缺點不少,不建議
在服務器之間轉移虛擬地址
給服務器分配固定的ip地址,爲每一個邏輯上的服務使用一個虛擬ip地址
負載均衡器,如HAproxy
負載均衡算法: 隨機, 輪詢,最少鏈接數,最快響應,哈希,權重
服務器池中增長或移除服務器: 在配置鏈接池中的服務器時,要保證有足夠多未使用的容量
高可用性意味着更少的宕機時間
磁盤空間不足
糟糕的sql或者服務器bug引發
糟糕的表和索引設計
複製問題一般因爲主備數據不一致致使
衡量指標: 平均失效時間(MTBF), 平均恢復時間(MTTR)
避免問題: 適當的配置,監控和規範
保證在宕機時能快速恢復,系統製造冗餘,具有故障轉移能力
經過增長冗餘避免
共享存儲或磁盤複製,若是服務器掛了,備用服務器能夠掛載相同的文件系統執行須要的恢復操做
MySQL同步複製
提高備庫或切換角色
虛擬IP地址或IP接管: 當MySQL實例失效時能夠將IP地址轉移到另外一臺MySQL服務器上
使用中間件解決方案
在線備份仍是離線備份
邏輯備份仍是物理備份
非顯著數據: 如二進制日誌和InnoDB事務日誌
代碼: 存儲過程,觸發器
服務器配置和複製配置
外部配置,管理腳本
增量備份和差別備份
存儲引擎和數據一致性
文件系統中或SAN快照中直接複製數據文件
Percona XtraBackup 作熱備份
二級索引損壞: 使用OPTIMIZE TABLE修復損壞的二級索引,此外能夠經過構建一個新表重建受影響的索引
聚簇索引損壞: innodb_force_recovery導出表
損壞系統結構: 系統結構包括事務日誌等,可能須要作整個數據庫的導出和還原,由於InnoDB內部絕大部分的工做可能受影響
工欲善其事,必先利其器
MySQL Workbench: 一站式的工具
SQLyog: 可視化工具之一
Percona Toolkit
MySQL Workbench 工具集
common_schema
MySQL Forge
Nagios
Zabbix: 同時支持監控和指標收集的完整系統
Zenoss: Python寫的
Hyperic HQ: 基於Java
主要包括如下功能
事務列表
當前運行的查詢
當前鎖和鎖等待列表
服務器狀態和變量彙總信息
InnoDB內部信息
複製監控