共計 3798 個字符,預計需要花費 10 分鐘才能閱讀完成。
本篇文章給大家分享的是有關 MySQL 主從的一些基礎知識,丸趣 TV 小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。
MySQL 復制原理
1. 主庫修改時會把數據變更作為 event 記錄在 binlog 中, 主庫上的 sync_binlog 參數控制 binlog 日志刷新到磁盤.
2. 主庫推送 binlog 中的事件到從庫的中繼日志 relay log,之后從庫根據中繼日志 relay log 重做數據變更操作。通過邏輯復制達到主從同步。
MySQL 通過 3 個現成來完成主從數據庫之間的復制:
1.binlog dump 跑在主庫上,負責讀取數據庫事件并發送給 I / O 線程
2.I/ O 線程 跑在從庫上,當從庫 start slave 時 創建 I / O 線程 鏈接到 master 將主庫的事件寫入到 relaylog
3.SQL 線程跑在從庫上,負責讀取 relay
log 并更新從庫。
4.Master.inf and relay-log.info 用來保存復制的進度。
三種復制方法, MIX,STATEMENT,ROW
1. statement
基于語句的復制, 可能會因為存儲過程或觸發器, 時間函數導致主備不一致,數據量小。
2. row
行級數據復制, 缺點是數據量較大,但是不會因為觸發器等外在條件影響數據
3. Mix
默認采用 statement 模式 如果語句中包含更新時間,用戶相關的函數等
Mysqlbinlog –vv logfilename –base64-output=DECODE-ROWS
–start-pos=number 才能解析 row 模式的內容。
雙主復制架構:
由 master1 作為讀寫庫,master2 作為只讀庫。
同時雙向作為對方的 slave。
當維護時
1. 先停掉 master1 上的 slave。免得當 master2 做維護時影響到 master1.
2. 停掉 master2 上的 slave。
開始維護操作,比如創建索引。
3. 打開 master2 上的 slave 讓 master2 與 master1 同步。
4. 將讀寫操作轉移到 master2,確保 master1 上無寫入操作
5. 將 master1 的 slave 打開,
讓其與 salve2 同步完成。
搭建 mysql 復制:
1. 建立一個用于 replication 的賬號:
Create replac
slave on *.* TO‘repl’@’192.168.7.200’identified by‘1234test’;
2. 修改 my.cnf 開啟 binlog 并且設置 server-id 的值
log-bin = xxxxx.log
server-id=1
3. 鎖住所有的表,lock tables with read lock
4. 檢查當前日志偏移量 show master status
5. 備份或者通過直接 shutdown 數據庫
拷貝數據文件的方式到 slave 庫。
6. Unlock tables;
7. 修改 slave 的 my.cnf server-id=2
8. 使用延遲復制開啟 salve ./bin/mysql_safe –skip-slave-start
9. 對數據庫服務做響應設置
mysql change master to master_host=’’,master_user=’’,master_password=’’,master_logfile=’’,master_log_pos=’’;
10. 從庫上輸入:start slave;
11. show process\G 檢查 slave 進程
12. show variables like‘%sync_binlog%’
0 的表示 mysql 不控制 binlog 的刷新,由文件系統控制。
13. 最后注意的幾點就是 MHA 架構可以通過自動抽取缺失的 log 進行 catchup。也可以通過 mysqlbinlog 工具來抽取之前主庫為宕機時未抽取的 log 傳送到備庫上去。
半同步復制:
在 mysql 5.5 之前,由于主備庫之間都處于異步復制的狀態,如果主庫在 commit 了之后而崩壞,此時 binlog 尚未傳到 slave 的庫上。則會丟失數
而 5.5 之后 mysql 推出了半同步復制狀態。在默認狀態下 mysql 需要保證有任意一臺備庫的 relaylog 接收到的更改之后才會確認 commit 已經成功。如果中途斷網的話
則會再自動切換回半同步復制模式。
安裝:
1. 首先需要確認 mysql 是否可以使用該功能,select @@have_dynamic_loading = YES
2 到 $MYSQL_HOME/lib/plugin/ 下找到主庫 / 從庫插件 semisync_master/slave.so
3. 主備庫上安裝該插件 install
plugin rpl_semi_sync_master/salve soname‘semisync_master/slave.so’
4.select * from mysql.plugin
5. 在主備庫上設置全局參數打開半同步 set
global rpl_semi_sync_master_enabled=1;
Set
global rpl_semi_sync_master_timeout=3000;
從庫上
set global rpl_semi_sync_slave=1;
6 如果已經啟動了異步復制 需要停止一下 io_thread. Stop
slave io_thread; start slave io_thread;
Show status like‘%semi_sync%’
需要注意的幾個結果有:
rpl_semi_syc_master_status ON 代表打開;
rpl_semi_syc_master_yes/no_tx 表示 同步或非同步的 transaction 次數
rpl_semi_syc_master_timeout 標示等待多久會判斷 slave 超時。
如果從庫斷開后重新連接上了,會自動轉回半同步狀態。
Mysql replication 一些有用的參數:
1. Log-slave-updates 從庫是否需要記 binlog 這個對于從庫傳從庫是比較有幫助的
2. Master-connect-retry 在從庫和主庫失去連接時的重試間隔
默認 60 秒
3. ./bin/Mysqld_safe –read-only 讓以避免超級用戶以外的人修改從庫的數據
日常維護命令:
1. 查看從庫狀態 show slave status. 比較關心的 2 狀態一個是 SLAVE_IO_Running 和 Slave_SQL_Running.
2. 有時候主備庫差距越來越大,可以在空閑的時候使用 flush tables with read lock.
show master status 查看 binlog 的 position。接下來使用 select master_pos_wait(‘logiflename’,’log_pos’); 這個語句會阻塞直到從庫同步到該點。然后再解鎖表。
3. 從庫出錯:
a) 如果需要跳過某些導致 replication 失敗的語句可以使用 set global SQL_SLAVE_SKIP_COUNTER=N. N=1|2. 當主庫沒有自增長時使用 1 自增長用 2.
b) Log event entry exceeded
max_allowed_packet 一般是因為有長字符串或 blob 無法傳輸。
此時需要增加主庫上該參數的大小。
c) 多主復制時自增長變量沖突的話
在雙主上需要設置 auto_increment_increment=2,auto_increment_offset=1;(1,3,5,7….)
auto_increment_increment=2,auto_increment_offset=0;(2,4,6,8….)
一些簡單的提高從庫性能的架構
1. 通過 master1 傳給 master2 master2 使用 blackhole 引擎開始 slave-log-update。
另外的 slave 通過 replace-do-db 的方式只復制部分數據庫。這種方法的缺點是一旦 master1 宕機之后會比較麻煩需要提前商量好異常處理方案。
2.mysql 5.6 之后有多線程復制,允許從庫并行更新。Slave_parallel_works=2.
Percona 分支的 mysql 還可以用淘寶丁奇的 mysql transfer 來實現從主庫多線程應用中繼日志來解決。
Http://dinglin.iteye.com/blog/188640.
切換主從:
1. 先確保所有從庫都執行了 relay log 中的全部更新。
在每個從庫上執行 stop slave io_thread。
然后用 show process \G 直到看到 state: has read all relay log 之后標志更新全都執行完畢。
2. S1 上 Stop slave. 打開 log-bin 模式。同時關閉 log-slave-updates.
3. Reset master.
4. S2 上執行 stop slave 然后 change master to master_host=S1. Start slave.
5. 刪除 S1 上的 master.info 和 relay-log.info 否則下次還是按照從庫啟動
6. 主庫修復后
可以按照 s2 的配置方法
重置到 S1。
以上就是 MySQL 主從的一些基礎知識,丸趣 TV 小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注丸趣 TV 行業資訊頻道。