目錄
概述
要點binlog日志?
主從復制過程
總結?
概述
MySQL 主從復制是指數據可以從一個MySQL數據庫服務器主節點復制到一個或多個從節點。
MySQL 默認采用異步復制方式。從節點不用一直訪問主服務器來更新自己的數據,數據的更新可以在遠程連接上進行,從節點可以復制主數據庫中的所有數據庫或者特定的數據庫,或者特定的表。
MySQL 主從復制主要用途
- 讀寫分離:在開發工作中,有時候會遇見某個sql 語句需要鎖表,導致暫時不能使用讀的服務,這樣就會影響現有業務,使用主從復制,讓主庫負責寫,從庫負責讀,這樣,即使主庫出現了鎖表的情景,通過讀從庫也可以保證業務的正常運作。
- 數據實時備份,當系統中某個節點發生故障時,可以方便的故障切換
- 架構擴展:隨著系統中業務訪問量的增大,如果是單機部署數據庫,就會導致I/O訪問頻率過高。有了主從復制,增加多個數據存儲節點,將負載分布在多個從節點上,降低單機磁盤I/O訪問的頻率,提高單個機器的I/O性能。
要點binlog日志?
MySQL
數據庫的數據備份、主備、主主、主從都離不開binlog
,需要依靠binlog
來同步數據,保證數據一致性。
?binlog是MySQL數據庫中的二進制日志,用于記錄數據庫中所有修改操作,包括增刪改等操作。binlog以二進制格式保存,可以通過解析binlog文件來查看數據庫的操作歷史記錄。 ?
binlog日志格式
- 1.statement:基于sql語句的日志記錄,記錄的是sql語句,對數據進行修改的sql都會記錄在日志文件中
- 2.row:基于行的日志記錄,記錄的是每一行的數據變更,默認是基于行的日志記錄
- 3.mixed:混合statement和row兩種格式,默認采用statement,在某些特殊情況下會自動切換為row進行記錄。這些情況是NDB引擎,表的增刪改的DML操作會以row格式記錄、SQL語句里包含UUID()函數、SQL語句里使用了用戶定義函數(UDF)、包含了insert delayed語句、使用了臨時表、自增字段被更新
配置開啟binlog
修改配置文件,
需要在/etc/my.cnf
中mysqld節添加開啟binlog的配置
#第一種方式:
#開啟binlog日志
log_bin=ON
#binlog日志的基本文件名
log_bin_basename=/var/lib/mysql/mysql-bin
#binlog文件的索引文件,管理所有binlog文件
log_bin_index=/var/lib/mysql/mysql-bin.index
#配置serverid
server-id=1#第二種方式:
#此一行等同于上面log_bin三行
log-bin=/var/lib/mysql/mysql-bin
#配置serverid
server-id=1
主從復制過程
復制分成三步
- master服務器將數據的改變記錄二進制binlog日志,當master上的數據發生改變時,則將其改變寫入二進制日志中;
- slave服務器會在一定時間間隔內對master二進制日志進行探測其是否發生改變,如果發生改變,則開始一個I/OThread請求master二進制事件
- 同時主節點為每個I/O線程啟動一個dump線程,用于向其發送二進制事件,并保存至從節點本地的中繼日志(relaylog)中,從節點將啟動SQL線程從中繼日志中讀取二進制日志,在本地重放,使得其數據和主節點的保持一致,最后I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。
IO線程去請求主庫 的binlog,并將得到的binlog日志寫到relay log(中繼日志) 文件中
SQL 線程,會讀取relay log文件中的日志,并解析成具體操作,來實現主從的操作一致,而最終數據一致;
?master一定要開啟binlog二進制日志功能;通常為了數據安全考慮,slave也開啟binlog功能
總結?
- Master主庫在事務提交時,會把數據變更記錄在二進制日志文件Binlog中。
- 從庫讀取主庫的二進制日志文件 Binlog,寫入到從庫的中繼日志 Relay Log。
- slave重做中繼日志中的事件,將改變反映它自己的數據