主從形式:一主一從,主主複製,聯級複製,一主多從--擴展系統讀取性能,多主一從--5.7開始支持mysql
用途:實時災備的故障切換,讀寫分離,備份sql
主從原理:
主:log dump線程傳binlog;
從:i/o線程接受讀取binlog,並寫入relay log文件,sql線程從relay log 文件中讀取binlog並持久化數據庫
問題及解決:
主庫宕機後,數據丟失---->半同步複製
主庫寫壓力大,因從庫只有一個sql 線程來持久化,複製可能延遲---->並行複製安全
半同步複製原理:
事務在主庫寫完binlog後須要從庫返回一個已接受,才放回給客戶端;
5.5集成到mysql,以插件的形式存在,須要單獨安裝
確保事務提交後binlog至少傳輸到一個從庫
不保證從庫應用完成這個事務的binlog
性能有必定的下降
網絡異常或從庫宕機,卡主庫,直到超時或從庫恢復服務器
並行複製原理:
從庫多線程apply binlog
在社區5.6中新增
庫級別並行應用binlog,同一個庫數據更改仍是串行的
5.7版本並行複製基於事務組網絡
部分數據複製
聯級複製(經常使用)
A->B->C
B中添加參數log_slave_updates
B將把A的binlog記錄到本身的binlog日誌中多線程
複製的監控
show slave statusapp
複製出錯處理
常見:1062(主鍵衝突),1032(記錄不存在),1007(已建立數據庫)
解決:手動處理,跳過複製錯誤:set global sql_slave_skip_counter=1
或者能夠選擇忽略這些錯誤 slave-skip-errors=1062,1032,1007負載均衡
mysql主從複製是mysql高可用性,高性能(負載均衡)的基礎
簡單,靈活,部署方式多樣,能夠根據不一樣業務場景部署不一樣複製結構
複製過程當中應該時刻監控複製狀態,複製出錯或延時可能給系統形成影響
mysql主從複製目前也存在一些問題,能夠根據須要部署複製加強功能ide
主從實踐:
主從複製要求mysql版本一致
一、修改主服務器master
vi /etc/my.cnf [mysqld] log-bin=mysql-bin //[必須]啓用二進制日誌 server-id=222 //[必須]服務器惟一ID,默認是1,通常取IP最後一段
二、修改從服務器slave
vi /etc/my.cnf [mysqld] log-bin=mysql-bin //[不是必須]啓用二進制日誌 server-id=226 //[必須]服務器惟一ID,默認是1,通常取IP最後一段
而後重啓兩臺服務器的mysql
三、配置主服務器
mysql>GRANT REPLICATION SLAVE ON *.* to 'fangxslave'@'100.168.50.211' identified by 'fangxslave'; # 通常不用root賬號,主從用戶用具體IP代替,增強安全。
mysql>show master status; #查詢日誌節點 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000004 | 308 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) 注:執行完此步驟後不要再操做主服務器MYSQL,防止主服務器狀態值變化
四、配置從服務器
mysql>change master to master_host='100.168.50.203',master_user='fangxslave',master_password='fangxslave',master_log_file=' mysql-bin.000004',master_log_pos=308; #注意不要斷開,308數字先後無單引號。
Mysql>start slave; 啓動從服務器複製功能
若是有報錯爲ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
使用reset slave可解決
五、檢查複製狀態
從服務器操做show slave status\G
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.2.222 //主服務器地址 Master_User: fangxslave //受權賬戶名,儘可能避免使用root Master_Port: 3306 //數據庫端口,部分版本沒有此行 Connect_Retry: 60 Master_Log_File: mysql-bin.000004 Read_Master_Log_Pos: 600 //#同步讀取二進制日誌的位置,大於等於Exec_Master_Log_Pos Relay_Log_File: ddte-relay-bin.000003 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: Yes //此狀態必須YES Slave_SQL_Running: Yes //此狀態必須YES ......
注:Slave_IO及Slave_SQL進程必須正常運行,即YES狀態,不然都是錯誤的狀態(如:其中一個NO均屬錯誤)。以上操做過程,主從服務器配置完成。