【3.1】【mysql基本實驗】mysql復制(主從復制/異步復制/半同步復制,一主一從)


關鍵詞:mysql復制(異步復制),mysql異步復制

核心原理:

  mysql 復制流程原理

    

  一個事務在 mysql異步復制中的流程與生命周期

  

  一個事務,在傳統半同步的復制流程

   

 

 

#mysql主從基本實驗

步驟目錄:

  前提

  異步復制(asynchronous )

  #【0】主從均開啟binlog,設置server-id

  #【1】准備復制賬戶

  #【2】在主庫上,設置讀鎖定有效。以便獲取一個一致性的快照(flush table with read lock)

  #【3】show master status;獲取主庫當前的二進制日志名和偏移量pos位置。

  #【4】備份主庫還原到從庫(直接copy,或者mysqldump)

     解鎖主庫(unlock tables;)

  #【5】跳過從線程啟動Mysql (mysqld_safe --skip-slave-start &)

  #【6】在mysql下配置從庫復制線程(change master to )

  #【7】在mysql下啟動從線程並驗證

  #【8】開始驗證

  #【9】故障診斷

  #【10】主從掛了怎么快速切換恢復

  #【11】一主一從結構遷移從庫架構圖

  #【12】半同步復制

  #【13】復制的日常管理與維護

 

詳情:

前提:

  (0)測試環境:2台centos6.5,都裝有單實例 mysql5.7.26

  (1)網絡可以互相ping通:ping 192.168.135.158

  (2)雙方端口是否偵聽開啟:netstat -an|grep 3306

  (3)防火牆策略:service iptables stop;(這里只是測試,我就直接關閉了哈)

  (4)selinux策略:getenforce(查看狀態) setenforce 0 (關閉)

  (5)徹底關閉開機自啟:

  防火牆 ~~ chkconfig iptables off  

    

  selinux~~ vim /etc/selinux/config ,然后把selinux=disabled,如下圖

    

 

 

 


#【0】主從均開啟binlog,設置server-id(在配置文件my.cnf下的 [mysqld] 下加入下列參數)

## replication
log-bin=mysql-bin
server-id=1 #從設置為server-id=2
binlog_format= ROW
#gtid_mode = on
#enforce_gtid_consistency = 1
log_slave_updates = 1   #是否復制日志寫入從庫的Binlog中
binlog_rows_query_log_events=on #在row 模式的binlog中包含SQL EVENTS(即SQL語句也會保留)
master-info-repository=TABLE
relay-log-info-repository=TABLE
master-connect-retry=60

#【1】在主庫上 准備復制賬戶

  mysql下操作:(這里的host ip是從庫IP)
  主:grant replication slave on *.* to 'repl'@'192.168.135.159' identified by '123456'; 

  -- 可以順道測試一下使用該賬戶是否能在從庫上連接上主庫。

#【2】在主庫上,設置讀鎖定有效。以便獲取一個一致性的快照

  mysql下操作:(鎖表,獲取一致性)
  flush tables with read lock;

#【3】在主庫上 show master status;獲取主庫當前的二進制名和偏移量pos位置。

  show master status;
  -- 查看到的日志名:mysql-bin.000002  , postion: 881

#【4】備份主庫還原到從庫
  邏輯方式:mysqldump。然后scp拷貝過去。然后登錄上從庫的mysql,直接把dump的文件加載進去即可。

  物理方式:直接拷貝,備份刪除從庫原有data目錄,然后把主庫的data目錄復制過去,復制到從庫后記得刪除拷貝過來data/下的auto.cnf,否則uuid會一樣,導致無法復制出現故障【9】。

  不管是物理還是邏輯方式,CP或者mysqldump完后,就都可以解鎖主庫了 

  在主庫的mysql登錄下,使用命令,unlock tables;

#【5】在從庫上 跳過從線程啟動Mysql

  #注意,要這樣使用,需要配置好環境變量,否則請切換到mysql文件 bin 目錄下后,再執行該命令
  mysqld_safe --skip-slave-start &  

#【6】在mysql下 配置從庫復制線程

-- mysql環境下
change master to
master_host='192.168.135.158',
master_port=3306,
master_user='repl',
master_password='123456',
master_log_file='mysql-bin.000002',
master_log_pos=881;

#【7】在從庫上 在mysql下啟動從線程並驗證
  start slave;

#【8】在從庫上 開始驗證

  show processlist; -- 一般有2個如下線程,基本就是沒有問題了,但是要確認的話,還是得用下面的命令;

    

 

  show slave status\G -- 這種帶error字樣的字段沒有信息或者是0,那才是正確的!

    

   去主庫上做操作,然后從庫上驗證數據是否同步過來(比如給一個表插入一條數據,注意如果沒開自動提交記得commit)



#【9】故障診斷
【9.1】The slave I/O thread stops because master and slave have equal MySQL server UUIDs
原因就是直接用主庫的文件覆蓋到從庫的,導致auto.cnf中的uuid相同;

 

 

 

 
 

#【10】主從掛了怎么快速切換恢復

1.備份主庫上的data目錄 mv data data.org

2.從庫上scp data目錄到主庫上 scp -r data 主庫:/databases/data/3306/

3.檢查my.cnf配置文件,主要保證innodb_log_file_size和innodb_log_files_in_group要和從庫設置一致。

4.注意修改data目錄里的auto.cnf文件,里面記錄的是服務器的uuid,請修改回主庫data.org目錄下的auto.cnf文件。

5.啟動mysql,看錯誤日志,應該可以正常啟動了

6.恢復后的主庫上,清除復制關系 mysql> reset slave all;

7.原從庫啟動數據庫,並重做主從 mysql> reset slave all;

8.mysql> change master to ... 

#【11】一主一從結構遷移從庫架構圖

具體做法是這樣:

  • 研發將 102 的讀業務切到主庫;
  • 確認 102 MySQL 狀態(主要看 PROCESS LIST),觀察機器流量,確認無誤后,停止 102 從節點的服務;
  • 103 新建 MySQL 實例,建成以后,停止 MySQL 服務,並且將整個數據目錄 mv 到其他地方做備份;
  • 將 102 的整個 mysql 數據目錄使用 rsync 拷貝到 103;
  • 拷貝的同時,在 101 授權,使 103 有拉取 binlog 的權限(REPLICATION SLAVE, REPLICATION CLIENT);
  • 待拷貝完成,修改 103 配置文件中的 server_id,注意不要和 102 上的一致;
  • 在 103 啟動 MySQL 實例,注意配置文件中的數據文件路徑以及數據目錄的權限;
  • 進入 103 MySQL 實例,使用 SHOW SLAVE STATUS 檢查從庫狀態,可以看到 Seconds_Behind_Master 在遞減;
  • Seconds_Behind_Master 變為 0 后,表示同步完成,此時可以用 pt-table-checksum 檢查 101 和 103 的數據一致,但比較耗時,而且對主節點有影響,可以和開發一起進行數據一致性的驗證;
  • 和研發溝通,除了做數據一致性驗證外,還需要驗證賬號權限,以防業務遷回后訪問出錯;
  • 做完上述步驟,可以和研發協調,把 101 的部分讀業務切到 103,觀察業務狀態;
  • 如果業務沒有問題,證明遷移成功。

 

#【12】半同步復制(Semisynchronous )

  在異步復制的參數及操作之后,開啟如下步驟

1.2】半同步復制配置(5.7)

  兩種辦法

  【1.2.1】手動安裝半同步復制插件(在mysql環境下,主從都安裝)

    【step 1】安裝半同步插件     
install plugin rpl_semi_sync_master soname 'semisync_master.so';     install plugin rpl_semi_sync_slave soname 'semisync_slave.so';     show plugins; -- 查看插件安裝情況 or select * from mysql.plugin;      

     【step 2】設置開啟半同步參數

      建議都開啟,以免主備切換時需要重新加;如果分開,如下圖;

      在主庫上:set global rpl_semi_sync_master_enabled=1;

      在從庫上:set global rpl_semi_sync_slave_enabled=1;

      如果異步復制正在運行,需要在從庫運行一下命令 才會使用半同步;

        stop slave io_thread;start slave io_thread;

     【step 3】檢查狀態

      在主庫查看半同步狀態:show status like '%rpl_semi%';

        

        圈出第1行表示,連接主庫的客戶端個數。

        圈出第2行表示,該實例做為半同步的主庫狀態,是on,是開啟的。

        最后1行,Rpl_semi_sync_slave_status,表示該實例,作為半同步的從庫狀態,是off,不是從庫。

        (但是從庫上進行查看時,圖中的 master_status 與 slave_status 應該正好相反,作為主庫是關閉的,作為從庫是開啟的)

        其他重要參數,

          Repl_semi_sync_master_yes_tx:表示已經同步的事務數,0表示還沒有任何一個事務以半同步的方式復制到從庫

          Repl_semi_sync_master_no_tx:假如為3,表示當前有3事務不是半同步模式下從庫及時響應的(比如可能有網絡延遲,導致半同步超時切換成異步)



  【1.2.2】寫入配置文件(推薦使用,my.cnf)

    show variables like 'plugin%'; -- 查看插件路徑

#修改my.cnf 復制代碼
#如果已經有異步復制了,也不需要改其他的,只需要把下面參數加入到my.cnf,重啟mysql服務即可。
#如果業務不允許宕機重啟實例,那么可以參考方法1,並且把該段代碼加上,就可以直接用了。 plugin_dir
=/mysql/app/mysql/lib/plugin/ plugin_load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so

#如果是5.7,參數前面加上loose_,如下列,如果是5.6 則直接使用 rpl_semi_sync_master_enabled=1 之類的就好了。
#我這里是5.7就直接做增強半同步了(loseless Semisynchronous ) loose_rpl_semi_sync_master_enabled
=1 #MySQL開啟主的半同步復制(rpl_semi_sync_master_enabled) loose_rpl_semi_sync_slave_enabled=1 #MySQL5.6開啟從的半同步復制 loose_rpl_semi_sync_master_timeout=5000 #超時5秒,切回異步 rpl_semi_sync_master_wait_for_slave_count=1 #至少收到1個slave發會的ack rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL 5.7的方法,AFTER_SYNC(default,增強半同步) & AFTER_COMMIT(傳統半同步)

 

#【13】復制的日常管理與維護

  (1)show slave status\G :在從庫查看從庫線程狀態

  (2)flush tables with read lock;  :主從不一致后鎖表。

    然后 show master status\G

    然后 show slave status\G 來查看從庫同步狀態 或者重新 change master to....

    然后 select master_pos_wait('mysql-bin.00002','389'); (即剛剛show master status找到的文件及位置),如果為1 標識超時退出 ,如果為1 則標識主從同步。

    最后再主庫 unlock tables; 解鎖

  (3)跳過錯誤

跳過錯誤有兩種方式:
1.跳過指定數量的事務:(建議如果已經出現了錯誤,使用這種辦法)
mysql>slave stop;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1        #跳過一個事務
mysql>slave start

2.修改mysql的配置文件,通過slave_skip_errors參數來跳所有錯誤或指定類型的錯誤(建議配置時使用這種辦法)
vi /etc/my.cnf
[mysqld]
#slave-skip-errors=1062,1053,1146 #跳過指定error no類型的錯誤,DDL錯誤類型包含 1007,1008,1050,1051,1054,1060,1061,1068,1091,11465.6可以用這個)
#slave-skip-errors=ddl_exist_errors #跳過DDL錯誤,all:跳過所有錯誤(mysql5.7才有ddl_exist_errors)

   (4)大對象blog ,text 傳輸

    

 

參考:深入淺出mysql開發、優化與管理維護書目

 


免責聲明!

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



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