【實操筆記】MySQL主從同步功能實現


寫在前邊:

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

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

 1--數據分布 (Data distribution )
    2--負載平衡(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-win32 datadir = D:\\apps\\mysql-5.6.24-win32\\data port = 3306

#生成記錄文件位置,同步必須,請勿手動刪除,格式位置為 :log-bin=mysql安裝路徑/log/mysql-bin.log
log-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 = cluster binlog-ignore-db = mysql binlog-ignore-db = performance_schema binlog-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 slave@'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 = cluster binlog-ignore-db = mysql binlog-ignore-db = performance_schema binlog-ignore-db = information_schema #此處添加需要同步的數據庫名稱,那么它會只接收這個數據庫的信息,多個數據庫需同步按照此格式另寫幾行即可
#這里同步數據有兩種思路,一種是主服務器只發從庫需要的,在主庫指定;一種是主服務器把所有數據同步過來,從庫按需過濾接收
#為了讓配置更詳細些,此處配置了從庫過濾接收的配置 replicate-do-db=test #忽略接收的庫名 replicate-ignore-db = cluster replicate-ignore-db = mysql replicate-ignore-db = performance_schema replicate-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 TO
MASTER_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: 0
Master_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開啟及查看,mysqlbinlog

mysql主從復制-CHANGE MASTER TO 語法詳解

[trouble] error connecting to master 'repl@192.168.1.107:3306' - retry-time: 60 retries: 86400

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM