一、主從復制介紹
MySQL 主從復制是指數據可以從一個MySQL數據庫服務器主節點復制到一個或多個從節點。MySQL 默認采用異步復制方式,這樣從節點不用一直訪問主服務器來更新自己的數據,數據的更新可以在遠程連接上進行,從節點可以復制主數據庫中的所有數據庫或者特定的數據庫,或者特定的表。
二、主從復制原理
(一)Mysql復制原理
(1)服務器將數據的改變記錄二進制binlog日志,當master上的數據發生改變時,則將其改變寫入二進制日志中;
(2)slave服務器會在一定時間間隔內對master二進制日志進行探測其是否發生改變,如果發生改變,則開始一個I/OThread請求master二進制事件
(3)同時主節點為每個I/O線程啟動一個dump線程,用于向其發送二進制事件,并保存至從節點本地的中繼日志中,從節點將啟動SQL線程從中繼日志中讀取二進制日志,在本地重放,使得其數據和主節點的保持一致,最后I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。
(4)主從復制很靈活
一主一從
主主復制
一主多從---擴展系統讀取的性能,因為讀是在從庫讀取的
多主一從
(二)為什么需要主從復制
1、在業務復雜的系統中,有這么一個情景,有一句sql語句需要鎖表,導致暫時不能使用讀的服務,那么就很影響運行中的業務,使用主從復制,讓主庫負責寫,從庫負責讀,這樣,即使主庫出現了鎖表的情景,通過讀從庫也可以保證業務的正常運作。
2、做數據的熱備
3、架構的擴展。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個機器的I/O性能。
三、主從復制搭建
(一)主從復制準備條件
1. 版本一致或接近
2. 初始化表,并在后臺啟動mysql
3. 修改root的密碼
(二)修改主服務器master
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[必須]啟用二進制日志
server-id=10 //[必須]服務器唯一ID,默認是1,一般取IP最后一段
binlog-do-db=kaidu //需要的數據庫
binlog-do-db=kaidu_pd
#binlog_ignore-db=databasename1,databasename2 //不需要的數據庫
(三)修改從服務器slave
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[不是必須]啟用二進制日志
server-id=226 //[必須]服務器唯一ID,默認是1,一般取IP最后一段
replicate-do-db=kaidu
replicate-do-db=kaidu_pd
#replicate-ignore-db=databasename1,databasename2
(四)重啟兩臺服務器的mysql
service mysqld restart
(五)主服務器master建立帳號并授權Slave
grant replication slave on *.* to 'mysync'@'%' identified by '*******';
flush privileges;//寫入內存
show master status;
注:執行完此步驟后不要再操作主服務器MYSQL,防止主服務器狀態值變化
(六)配置從服務器Slave
進入數據庫,停掉從:stop slave;
執行change:
Change,master,to,master_host='39.107.77.131',master_user='mysync',master_password='**********',master_port=7853,master_log_file='mysql-bin.000012',master_log_pos=23619758;
啟動從:start slave;
顯示從的狀態:
注:Slave_IO及Slave_SQL進程必須正常運行,即YES狀態,否則都是錯誤的狀態(如:其中一個NO均屬錯誤)。
(七)效果展示
- 在主服務器(131)master中新增一條數據
- 從服務器(111)slave查詢數據是否存在
注意:一定不要在slave上寫了數據,那么主從復制也就被破壞了。
重啟master務必要關閉slave,即在slave上執行stop salve命令,重啟后要執行slave start開啟主從復制.
(八)解決復制延遲問題
- 緣由:
一般主從復制,有三個線程參與,都是單線程:Binlog Dump(主) ----->IO Thread (從) -----> SQL Thread(從)。復制出現延遲一般出在兩個地方
1)SQL線程忙不過來(可能需要應用數據量較大,可能和從庫本身的一些操作有鎖和資源的沖突;主庫可以并發寫,SQL線程不可以;主要原因)
2)網絡抖動導致IO線程復制延遲(次要原因)。
2. 解決方式:
. Mysql5.6版加入“多線程復制”功能,這樣對于單線程復制有了很大提高,但每個線程只能處理一個數據庫,對多庫并發就不能發揮作用
Mysql5.7版加入基于組提交的并行復制,核心思想即支持一個schema下,可并發執行relay log中主庫提交的事務
3. 配置方法:
mysql> stop slave;
mysql> show variables like 'slave_parallel_type';
設置并發同步類型為邏輯時鐘方式
mysql> set global slave_parallel_type='logical_clock';
設置復制線程的數量
mysql> set global slave_parallel_workers=15;
flush privileges;
啟動從
start slave;
驗證結果:
mysql> show processlist;