1. 機器標準化 2. 參數標準化 3. 統一安裝包 4. 目錄標準化 5. 多實例部署 6. 自動化部署
1. 源碼包 2. rpm 3. 二進制
數據目錄 | 日誌目錄 | binlog |
---|---|---|
data | logs | binlog |
實例 | u01 | u02 | u03 | u04 |
---|---|---|---|---|
端口 | 3306 | 3307 | 3308 | 3309 |
數據目錄 | /data/3306/data | /data/3307/data | /data/3308/data | /data/3309/data |
日誌目錄 | /data/3306/logs | /data/3307/logs | /data/3308/logs | /data/3309/logs |
硬盤容量 | 500G+100G | 500G+100G | 500G+100G | 500G+100G |
1. 打通SSH互信(saltstack、Ansible、puppet) 2. 修改主機名(惟一) 3. 建立並掛載目錄 4. 安裝agent端(salt-minion) 5. 安裝zabbix agent端 6. 安裝MySQL並加載監控項 7. 調整MySQL 參數(port、server_id、innodb_buffer_pool_size) 8. 啓動MySQL 初始化環境(管理用戶、查詢用戶、監控用戶)
關閉防火牆 配置sysctl.conf 檢查操做系統上是否安裝了MySQL 下載mysql源碼包 添加用戶和組 配MySQL環境變量 建立目錄及受權 解壓mysql5.6 MySQL參數配置 初始化MySQL腳本 啓動MySQL 登陸MySQL
備份恢復的使用場景 備份類型 備份有效性測試 自動化備份設計 MySQL備份工具 Xtrabackup安裝 Xtrabackup備份實現 innobackupex整個備份過程 innobackupex恢復原理 Innobackupex備份恢復演示
監管要求 搭建備庫 異常恢復
熱備 冷備 溫備
1. 邏輯備份將數據庫的內容轉儲到文本文件中 2. 這些文本文件包含 SQL 語句,這些 SQL 語句包含重建MySQL 數據庫和表所需的所有信息 3. 可使用該文本文件在運行不一樣體系結構的其餘主機上從新裝入數據庫 4. 在建立邏輯備份時,MySQL 服務器必須處於運行狀態,由於服務器在建立文件時要讀取備份的表的結構和內容 5. 採用邏輯備份時,能夠備份本地和遠程的 SQL 服務器。只能在本地 MySQL 服務器上執行其餘類型的備份
1. 物理備份是 MySQL 數據庫文件的二進制副本。這些副本以徹底相同的格式保留數據庫存儲在磁盤上; 2. 原始備份是數據庫文件位的完整表現形式,所以必須將其恢復到使用相同數據庫引擎的MySQL 服務器; 3. 在從 InnoDB 表恢復原始 MySQL 備份時,會在目標服務器上保留一個 InnoDB 表; 4. 原始二進制備份的速度比邏輯備份快,由於該過程是簡單的文件複製,不須要了解文件的內部結構
冷備(MySQL服務器CLOSE)php
1. 可經過關閉 MySQL 服務器,而後再進行備份 2. 備份時,必須確保在備份進行期間服務器不修改文件
熱備(MySQL服務器OPEN)html
1. 可使用快照、複製或專有方法,最大限度地減少對 MySQL 和應用程序的影響 2. 對於某些存儲引擎,更好的辦法是暫時鎖定數據庫,進行備份,而後再將數據庫解鎖,鎖在熱備作了兩件事:第一記錄binlog文件的位置、第二冷備非事務引擎引的表(MYISAM)
# mysqldump工具使用 1. mysqldump --help 2.mysqldump -h127.0.0.1 -P3306 -uroot -p --single-transaction linux > /tmp/linux.sql # 分析mysqldump流程 打開general.log————>執行mysqldump————>分析general.log————>關閉general.log
# 下載 https://launchpad.net/mydumper # 編譯安裝 cmake . make make install # mysqldumper 備份 mydumper --user=root --password='123456' --socket=/tmp/mysql3306.sock --regex '^(?!(mysql))' --outputdir=/u01/backup/ --compress --verbose=3 --logfile=/apps/backup/mydumper.log
1. Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上唯一一款開源的可以對innodb和xtradb數據庫進行熱備的工。 Xtrabackup中主要包含兩個工具: 1. xtrabackup:是用於熱備份innodb, xtradb表中數據的工具,不能備份其餘類型的表,也不能備份數據表結構. 2. innobackupex:是將xtrabackup進行封裝的perl腳本,能夠備份和恢復MyISAM表以及數據表結構。
rpm -Uvh https://www.percona.com/downloads/XtraBackup/LATEST/percona-xtrabackup-24-2.4.5-1.el6.x86_64.rpm
yum install percona-xtrabackup
1. 解壓源碼包 tar -xzvf percona-xtrabackup-2.1.7.tar.gz 2. 安裝perl環境(DBI/DBD) yum install perl-DBIx-Simple.noarch perl-DBD-MySQL.x86_64 perl* 3. Prerequisites yum -y install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bison libtool ncurses-devel libgcrypt-devel libev-devel 4. 開始編譯 ./utils/build.sh #根據版本確認build.sh的參數 ./utils/build.sh innodb56 #開始編譯 5.把xtrabackup_5.6複製到/usr/bin下 cp /u01/percona-xtrabackup-2.1.7/src/xtrabackup_56 /usr/bin/
主從複製的架構 線上快速搭建主從複製 主從複製的詳細過程分析 主從複製相關參數 Semi-sync複製 主從複製常見問題
Master上建立複製帳號並受權 grant replication slave,replication client on *.* to repl@'%' identified by ‘password’; Master、Slave上分別設置不一樣的Server_id vim my.cnf; set global server_id=xxxxx; Master上執行一次完整邏輯(物理)備份 #ibbackup, xtrabackup, mysqldump mysqldump --single-transaction --master-data Slave上,拿到Master全備在Slave作一次全量恢復 Slave上執行CHANCE MASTER配置主從複製 Slave上執行Start slave啓動複製 start slave; show slave status\G
# Master server-id read_only mysql_log_bin binlog_format binlog_cache_size max_binlog_size expire_logs_days binlog-do-db binlog-ignore-db #Slave server-id read_only sql_log_bin log_slave_updates replicate-do-db replicate-ignore-db replicate-do-table replicate-ignore-table
每一條會修改數據的sql都會記錄在binlog中 優勢: 不須要記錄每一行的變化,減小了 binlog日誌量,節約了IO,提升性能。 缺點: 因爲記錄的只是執行語句,爲了這些語 句能在slave上正確運行,所以還必須 記錄每條語句在執行的時候的一些相關 信息,以保證全部語句能在slave獲得 和在master端執行時候相同 的結果。 另外mysql 的複製,像一些特定函數功 能,slave可與master上要保持一致會 有不少相關問題(如now()函數, sysdate(),以及uuid()會出現問題).
不記錄sql語句上下文相關信息,僅保存哪條記錄 被修改。 優勢 binlog僅須要記錄那一條記錄被修改爲什麼了。 因此row模式的日誌內容會很是清楚的記錄下每一 行數據修改的細節。並且不會出現某些特定狀況 下的存儲過程,或function,以及trigger的調用 和觸發沒法被正確複製的問題. 缺點 全部的執行的語句當記錄到日誌中的時候,都 將以每行記錄的修改來記錄,這樣可能會產生大 量的日誌內容,好比一條update語句,修改多條記 錄,則binlog中每一條修改都會有記錄,這樣造 成binlog日誌量會很大. 從數據的安全性考慮出發,推薦使用row模式。
結合SBR與RBR 一般使用SBR 非肯定狀況使用RBR 是row和statement模式的混合使用,通常的語句 修改使用statment格式保存binlog,如一些函數, statement沒法完成主從複製的操做,則採用row 格式保存binlog,MySQL會根據執行的每一條具體 的sql語句來區分對待記錄的日誌形式,也就是在 Statement和Row之間選擇一種.具體的能夠參看 官方的文檔: http://dev.mysql.com/doc/refman/5.6/en/binary-log-mixed.html
Semi-sync最先是由Google實現的一個補丁,代碼主要由Mark Callaghan、Wei Li(@Google)等人 貢獻。Google本來是將需求提給Hekki的,可是後來等不及就本身實現了。5.5版本正式合併到官方的版本。
Semi-sync就是保證主庫將日誌先傳輸到備庫,而後再返回給應用事務提交成功,流程以下:
java
MySQL構架設計 容量評估 Sysbench壓測 業務痛點 讀寫分離方案 數據分區方案 分表的兩種方案 混合方案 實現路線分析 業內解決方案
見sysbench安裝及性能測試.docx文檔mysql
海量數據的存儲及訪問,經過對數據庫進行讀寫分離,來提高數據的處理能力。讀寫分離它的方案特色是數據庫產生多個副本,數據庫的寫操做都集中到一個數據庫上,而一些讀的操做呢,能夠分解到其它數據庫上。這樣,只要付出數據複製的成本,就可使得數據庫的處理壓力分解到多個數據庫上,從而大大提高數據處理能力。
優勢:因爲全部的數據庫副本,都有數據的全拷貝,所以全部的數據庫特性均可以實現,部分機器當機不影響系統的使用。
缺點:數據的複製同步是一個問題,要麼採用數據庫自身的複製方案,要麼自行實現數據複製方案。須要考慮數據的遲滯性,一致性方面的問題。linux
原來全部的數據都是在一個數據庫上的,網絡IO及文件IO都集中在一個數據庫上的,所以CPU、內存、文件IO、網絡IO均可能會成爲系統瓶頸。而分區的方案就是把某一個或某幾張相關的表的數據放在一個獨立的數據庫上,這樣就能夠把CPU、內存、文件IO、網絡IO分解到多個機器中,從而提高系統處理能力。
優勢:不存在數據庫副本複製,性能更高。
缺點:分區策略必須通過充分考慮,避免多個分區之間的數據存在關聯關係,每一個分區都是單點,若是某個分區宕機,就會影響到系統的使用。c++
無論是上面的讀寫分離方案仍是數據分區方案,當數據量大到必定程度的時候,都會致使處理性能的不足,這個時候就沒有辦法了,只能進行分表處理。也就是把數據庫當中數據根據按照分庫原則分到多個數據表當中,這樣,就能夠把大表變成多個小表,不一樣的分表中數據不重複,從而提升處理效率。
優勢:數據不存在多個副本,沒必要進行數據複製,性能更高。
缺點:分表之間的數據不多進行集合運算;分表都是單點,若是某個分表宕機,若是使用的數據不在此分表,不影響使用。sql
- 同庫分表:全部的分表都在一個數據庫中,因爲數據庫中表名不能重複,所以須要把數據表名起成不一樣的名字。
優勢:因爲都在一個數據庫中,公共表,沒必要進行復制,處理更簡單
缺點:因爲還在一個數據庫中,CPU、內存、文件IO、網絡IO等瓶頸仍是沒法解決,只能下降單表中的數據記錄數。表名不一致會導後續的處理複雜。
- 不一樣庫分表: 因爲分表在不一樣的數據庫中,這個時候就可使用一樣的表名。
優勢:CPU、內存、文件IO、網絡IO等瓶頸能夠獲得有效解決,表名相同,處理起來相對簡單
缺點:公共表因爲在全部的分表都要使用,所以要進行復制、同步。
經過上面的描述,咱們理解了讀寫分離,數據分區,數據分表三個解決方案,實際上都各有優勢
,也各有缺,所以,實踐當中,會把三種方案混合使用。因爲數據一天比一天長多,實際上,在 剛開始的時候,可能只採用其中一種方案,隨着應用的複雜, 數據量的增加,會逐步採用多個方案混合的方案。以提高處理能力,避免單點。shell
正所謂條條大路通羅馬,解決這個問題的方案也有多種,但究其深源,均可以歸到兩種方案之上,一種是對用戶透明的方案,即用戶只用像普通的J
DBC數據源同樣訪問便可,由框架解決全部的數據訪問問題。另一種是應用層解決,具體通常是在Dao層進行封裝。
JDBC層方案
優勢:開發人員使用很是方便,開發工做量比較小;能夠實現數據庫無關。
缺點:框架實現難度比較大,性能不必定能作到最優。 一樣是JDBC方案,也有兩種解決方案,一種是有代理模式,一種是無代理模式。
有代理模式,有一臺專門的代理服務器,來接收用戶請求,而後發送請求給數據庫集羣中的數據,並對數據進行聚集後再提交給請求方。 無代理模式,就是說沒有代理服務器,集羣框架直接部署在應用訪問端。 有代理模式,可以提供的功能更強大,甚至可買提供中間庫進行數據處理,無代理模式處理性能較強有代理模式少一次網絡訪問,相對來講性能更好,可是功能性不若有代理模式。
DAO層方案
優勢:開發人員自由度很是大,性能調優更精準。
缺點:開發人員在必定程度上受影響,與具體的Dao技術實現相關,較難作到數據庫無關。 因爲須要對SQL腳本進行判斷,而後進行路由,所以DAO層優化方案通常都是選用iBatis或Spring Jdbc Template等方案進行封裝,而對於Hibernate等高度封裝的OR映射方案,實現起來就很是困難了。數據庫
、vim
來源 | 血緣 | 類型 | |
---|---|---|---|
Cobar | 阿里 | 中間件 | |
TDDL | 阿里 | 客戶端二方庫 | |
DRDS | 阿里 | Cobar、TDDL | 分佈式數據庫 |
MyCAT | 社區 | Cobar | 中間件 |
Atlas | 360 | MySQL Proxy | 中間件 |
TDSQL | 騰訊 | MySQL Proxy | 分佈式數據庫 |
Heisenberg | 百度 | Cobar | 中間件 |
藍海豚 | 京東 | MySQL Proxy | 中間件 |
Mxscale | Mariadb | 中間件 |
MHA,是日本的一位MySQL專家採用Perl語言編寫的一個腳本管理工具, 目的在於維持MySQL Replication中Master庫的高可用性,其最大特色是可 以修復多個Slave之間的差別日誌,最終使全部Slave保持數據一致,而後從 中選擇一個充當新的Master,並將其它Slave指向它。
\
每ping_interval秒監控master一次 MHA自身提供了兩種監控方式:SELECT和 CONNECT,控制參數ping_type
•調用SSH腳本對全部Node執行檢查,包括 •Master服務器是否能夠SSH連通 •MySQL實例是否能夠鏈接 •檢查SQL Thread的狀態 •檢查哪些Server死掉了,哪些Server是活動 的,以及活動的Slave實例 •檢查Slave實例的配置及複製過濾規則
1.SQL Thread alive? NO: Restart it 2.調用master_ip_failover_script關閉VIP 3.檢查各個Slave,獲取最近的和最舊的 binary log file和position,並檢查各個 Slave成爲Master的優先級 4.若dead master所在服務器依然能夠經過SSH連通, 則提取dead master的binary log。另外,MHA還要 對各個Slave節點SSH連通性進行檢查。 5.調用apply_diff_relay_logs命令恢復Slave的差別日誌, 即各個Slave之間的relay log 6.差別日誌恢復到New Master上,而後獲取New Master的binlog name和 position,最後會開啓New Master的寫權限 7.清理New Master其實就是重置slave info,即取消原來的Slave信息
MHA部署.txt 文檔
maxscale有兩種方式實現讀寫分離。一種是基於connect的,相似haproxy,不解析sql語句。另外一種是statement,基於解析sql語句的。解析sql勢必會增長性能損耗,咱們能夠經過php yii框架或者java mybatis框架實現讀寫分離,基於connect方式,用maxscale作多臺slave的負載均衡,從而取代haproxy。若是開發實現困難,那麼採用statement方式。
注: maxscale支持主從同步延遲檢測功能。
大多數公司架構:一個主庫,多個從庫,主庫寫,從庫負責查詢,主庫的ha經過MHA實現,從庫讀的負載均衡經過lvs或者haproxy實現(JAVA框架和PHP框架實現讀寫分離)
見 文檔