[實操筆記]MySQL主從同步功能實現

來源:互聯網
上載者:User

標籤:timeout   寫的不好   中繼   不同的   sqlt   dump   basedir   not   targe   

寫在前邊:

這兩天來了個需求,配置部署兩台伺服器的MySQL資料同步,折騰了兩天查了很多相關資料,一直連不上,後來發現其實是資料庫授權的ip有問題,我們用的伺服器是機房中的虛擬機器加上反向 Proxy出來的,坑的不行。看了好多部落格,寫的怎麼說呢,寫的好的是太好了太詳細了;寫的不好的,配置什麼的都講的不清楚,剛接觸這塊的時候不曉得原理,一味的複製粘貼,後來看到有個博主寫的好文,瞬間醍醐灌頂,也有了自己的思路,我就簡單的記錄下操作步驟和一些細節的注釋,原理就直接搬運了,原理圖也畫了份,就不獻醜了,有寫錯的地方,還望各位大佬不吝賜教,在下感激不盡!

配置MySQL的主從同步有什麼好處?

 1--資料分布 (Data distribution )
    2--Server Load Balancer(load balancing)
    3--資料備份(Backups) ,保證資料安全(最主要的作用)
    4--高可用性和容錯行(High availability and failover)
    5--實現讀寫分離,緩解資料庫壓力

MySQL主從同步實現原理(參考博文點這裡):

master伺服器將資料的改變記錄二進位binlog日誌,當master上的資料發生改變時,則將其改變寫入二進位日誌中;salve伺服器會在一定時間間隔內對master二進位日誌進行探測其是否發生改變,如果發生改變,則開始一個I/OThread請求master二進位事件,同時主節點為每個I/O線程啟動一個dump線程,用於向其發送二進位事件,並儲存至從節點本地的中繼日誌中,從節點將啟動SQL線程從中繼日誌中讀取二進位日誌,在本地重放,使得其資料和主節點的保持一致,最後I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。
注意幾點:
     1--master將動作陳述式記錄到binlog日誌中,然後授予slave遠端連線的許可權(master一定要開啟binlog二進位日誌功能;通常為了資料安全考慮,slave也開啟binlog功能)。
     2--slave開啟兩個線程:IO線程和SQL線程。其中:IO線程負責讀取master的binlog內容到中繼日誌relay log裡;SQL線程負責從relay log日誌裡讀出binlog內容,並更新到slave的資料庫裡,這樣就能保證slave資料和master資料保持一致了。
     3--Mysql複製至少需要兩個Mysql的服務,當然Mysql服務可以分布在不同的伺服器上,也可以在一台伺服器上啟動多個服務。
     4--Mysql複製最好確保master和slave伺服器上的Mysql版本相同(如果不能滿足版本一致,那麼要保證master主節點的版本低於slave從節點的版本)
     5--master和slave兩節點間時間需同步

Mysql複製的流程圖如下:

MySQL是怎樣同步的?

 1--基於語句的複製: 在主伺服器上執行的SQL語句,在從伺服器上執行同樣的語句。MySQL預設採用基於語句的複製,效率比較高。一旦發現沒法精確複製時,會自動選著基於行的複製。 
    2--基於行的複製:把改變的內容複寫過去,而不是把命令在從伺服器上執行一遍. 從mysql5.0開始支援
    3--混合類型的複製: 預設採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。

實現環境:

| System   | mysql      |  ip        |

|:----     |:----        |:----

|win7      | mysql-5.6.24   | 192.168.1.129 |

|centos 6.7  | mysql-5.6.39   | 192.168.1.128 |

註:從伺服器的mysql版本最好和主伺服器相同,或者大於主伺服器版本

MySQL主從同步的實現部分:

首先是Master(主節點)的配置:

#主Master伺服器配置:

1.進入mysql的安裝目錄,建立一個log檔案夾(這個是儲存binary log的路徑)2.主伺服器開啟log_bin,需修改my.ini,配置如下:
#*********************master my.ini設定檔開始*****************************************#路徑均為當前伺服器的實際路徑basedir = D:\\apps\\mysql-5.6.24-win32datadir = D:\\apps\\mysql-5.6.24-win32\\dataport = 3306#產生記錄檔案位置,同步必須,請勿手動刪除,格式位置為 :log-bin=mysql安裝路徑/log/mysql-bin.loglog-bin=D:\\apps\\mysql-5.6.24-win32\\log\\mysql-bin.log#服務ID,用於區分服務,範圍1~2^32-1,需要與從伺服器不同server_id= 1#MySQL 磁碟寫入策略以及資料安全性#每次事務提交時MySQL都會把log buffer的資料寫入log file,並且flush(刷到磁碟)中去innodb_flush_log_at_trx_commit=1#當sync_binlog =N (N>0) ,MySQL 在每寫 N次 二進位日誌binary log時,會使用fdatasync()函數將它的寫二進位日誌binary log同步到磁碟中去。
sync_binlog 的預設值是0,像作業系統刷其他檔案的機制一樣,MySQL不會同步到磁碟中去而是依賴作業系統來重新整理binary log。sync_binlog= 1#同步資料庫,如果多庫,就以此格式另寫幾行即可binlog-do-db=test#無需同步的資料庫,以下幾行基本一樣,無需改動binlog-ignore-db = clusterbinlog-ignore-db = mysqlbinlog-ignore-db = performance_schemabinlog-ignore-db = information_schema#mysql複製模式,三種:SBR(基於sql語句複製),RBR(基於行的複製),MBR(混合模式複製)#混合模式複製binlog_format=MIXED#binlog到期清理時間expire_logs_days=7#binlog每個記錄檔大小max_binlog_size=20M#*********************master my.ini設定檔結束*****************************************

3.重啟mysql服務,mysql命令列執行:

show master status;#記錄檔案名稱以及緊跟的當前行數數字

4.建立並授權使用者,後兩個slave分別是使用者名稱和密碼

grant replication slave ,replication client on *.* to [email protected]‘192.168.1.128‘ identified by "slave";flush privileges; #許可權修改立即生效flush tables with read lock; #鎖定資料庫為唯讀,確保備份資料一致性

5.退出mysql命令列,執行備份命令

#備份當前所有資料庫,可以參考備份單庫mysqldump -u root -p --all-databases --master-data > dbdump.sql

6.將sql指令碼在從伺服器執行
7.從伺服器啟動slave(前提是配置好從伺服器)
8.從伺服器啟動完畢後關閉表鎖

unlock tables;

 

#從伺服器的配置

1.停掉slave服務

service mysqld stop

2.修改設定檔:

vim /etc/my.cnf
#從資料庫(Slave)配置:#***********************************slave my.cnf配置開始******************************#從庫日誌記錄檔案位置或名稱首碼log_bin = /var/lib/mysql/mylogbin.log#同步處理記錄記錄的頻率,1為每條都記錄,安全但效率低sync_binlog = 1#server的id,不能與相同id的mysql主從串連server-id=2#從庫日誌忽略的資料庫名稱,不記錄
#這裡記錄從庫的binlog是為了安全,如果覺得沒必要,可以去掉從庫binlog的配置binlog-ignore-db = clusterbinlog-ignore-db = mysqlbinlog-ignore-db = performance_schemabinlog-ignore-db = information_schema#此處添加需要同步的資料庫名稱,那麼它會只接收這個資料庫的資訊,多個資料庫需同步按照此格式另寫幾行即可
#這裡同步資料有兩種思路,一種是主伺服器只發從庫需要的,在主庫指定;一種是主伺服器把所有資料同步過來,從庫按需過濾接收
#為了讓配置更詳細些,此處配置了從庫過濾接收的配置replicate-do-db=test#忽略接收的庫名replicate-ignore-db = clusterreplicate-ignore-db = mysqlreplicate-ignore-db = performance_schemareplicate-ignore-db = information_schema#跳過所有錯誤繼續slave-skip-errors=all#設定延時時間slave-net-timeout=60#mysql複製模式,三種:SBR(基於sql語句複製),RBR(基於行的複製),MBR(混合模式複製)binlog_format=MIXED #混合模式複製expire_logs_days=7 #binlog到期清理時間max_binlog_size=20M #binlog每個記錄檔大小#***********************************slave my.cnf配置結束******************************

3.儲存退出:wq

4.啟動mysqld服務

service mysqld start

5.刪除多餘資料庫,匯入資料,刪除部分不予示範,sql的位置請自行指定

mysqldump -u root -p < ~/dbdump.sql #這裡示範就是上傳到了root的根目錄,具體請使用“find / -name sql指令碼名” 命令查詢

6.從伺服器指定master

CHANGE MASTER TOMASTER_HOST=‘192.168.1.129‘,MASTER_USER=‘slave‘,MASTER_PASSWORD=‘slave‘,MASTER_LOG_FILE=‘mysql-bin.000001‘,MASTER_LOG_POS=593;

註:最後兩行是之前在主伺服器show master status 所記錄的資料

  如果之前已經啟動了一個slave進程,那麼以上的命令會失效,並提示stop slave first,所以先stop slave; 然後重試

7.啟動slave

start slave;show slave status\G #注意,沒有分號

 輸出如下,顯示兩個都為yes即成功,可以測試一下

mysql> show slave status;*************************** 1. row ***************************               Slave_IO_State: Waiting for master to send event                  Master_Host: 192.168.1.129                  Master_User: replication                  Master_Port: 3306                Connect_Retry: 60              Master_Log_File: mysql-bin.000001          Read_Master_Log_Pos: 593               Relay_Log_File: mysql-relay-log.000004                Relay_Log_Pos: 441        Relay_Master_Log_File: mysql-bin.000001             Slave_IO_Running: Yes            Slave_SQL_Running: Yes              Replicate_Do_DB:           Replicate_Ignore_DB:            Replicate_Do_Table:        Replicate_Ignore_Table:       Replicate_Wild_Do_Table:   Replicate_Wild_Ignore_Table:                    Last_Errno: 0                   Last_Error:                  Skip_Counter: 0          Exec_Master_Log_Pos: 52360              Relay_Log_Space: 597              Until_Condition: None               Until_Log_File:                 Until_Log_Pos: 0           Master_SSL_Allowed: No           Master_SSL_CA_File:            Master_SSL_CA_Path:               Master_SSL_Cert:             Master_SSL_Cipher:                Master_SSL_Key:         Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No                Last_IO_Errno: 0                Last_IO_Error:                Last_SQL_Errno: 0               Last_SQL_Error:   Replicate_Ignore_Server_Ids:              Master_Server_Id: 1"""

8.去主伺服器開啟表唯讀鎖

unlock tables;

--------------------------------實現部分到此結束--------------------------------------

徹底解除主從複製關係
1)stop slave;
2)reset slave; #或直接刪除master.info和relay-log.info這兩個檔案;
3)修改my.cnf刪除主從相關配置參數。

4)Delete FROM user Where User=‘slave‘ and Host=‘192.168.1.128‘;#刪除主伺服器配置的串連slave使用者

 

本文參考博文列表:

Mysql主從同步(1)-主從/主主環境部署梳理MySQL5.7 添加使用者、刪除使用者與授權mysql設定指定ip訪問,使用者權限相關操作win7下mysql5.6與centos下mysql5.6主從複製mysql5.6 主從複製同步詳細配置(圖文)MySQL5.6 資料庫主從(Master/Slave)同步安裝與配置詳解centos 7下mysql5.7 主從資料庫同步配置MySql 5.7.18 資料庫主從(Master/Slave)同步安裝與配置詳解mysql從庫Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file‘報錯處理

【MySQL】Last_IO_Errno: 1593 server-uuid重複導致slave報錯 

【MySQL】MySQL5.6資料庫基於binlog主從(Master/Slave)同步安裝與配置詳解Window 下mysql binlog開啟及查看,mysqlbinlogmysql主從複製-CHANGE MASTER TO 文法詳解[trouble] error connecting to master ‘[email protected]:3306‘ - retry-time: 60 retries: 86400

 

 

 

[實操筆記]MySQL主從同步功能實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.