【Mysql】主從同步配置


Mysql主從同步簡介

  指一台服務器充當主數據庫服務器,另一台或多台服務器充當從數據庫服務器,主服務器中的數據自動復制到從服務器之中。對於多級復制,數據庫服務器即可充當主機,也可充當從機。MySQL主從復制的基礎是主服務器對數據庫修改記錄二進制日志,從服務器通過主服務器的二進制日志自動執行更新。

  一句話表示就是,主數據庫做什么,從數據庫就跟着做什么。

mysql復制的類型

  • 1.基於語句的復制 :主庫把sql語句寫入到bin log中,完成復制
  • 2.基於行數據的復制:主庫把每一行數據變化的信息作為事件,寫入到bin log,完成復制
  • 3.混合復制:上面兩個結合體,默認用語句復制,出問題時候自動切換成行數據復制

  tip:和上面相對應的日志格式也有三種:STATEMENT,ROW,MIXED。

  1. STATEMENT模式(SBR)
    每一條會修改數據的sql語句會記錄到binlog中。優點是並不需要記錄每一條sql語句和每一行的數據變化,減少了binlog日志量,節約IO,提高性能。缺點是在某些情況下會導致master-slave中的數據不一致(如sleep()函數, last_insert_id(),以及user-defined functions(udf)等會出現問題)
  1. ROW模式(RBR)
    不記錄每條sql語句的上下文信息,僅需記錄哪條數據被修改了,修改成什么樣了。而且不會出現某些特定情況下的存儲過程、或function、或trigger的調用和觸發無法被正確復制的問題。缺點是會產生大量的日志,尤其是alter table的時候會讓日志暴漲。

  2. MIXED模式(MBR)
    以上兩種模式的混合使用,一般的復制使用STATEMENT模式保存binlog,對於STATEMENT模式無法復制的操作使用ROW模式保存binlog,MySQL會根據執行的SQL語句選擇日志保存方式。

mysql主從復制原理

  1.Master 數據庫只要發生變化,立馬記錄到Binary log 日志文件中

  2.Slave數據庫啟動一個I/O thread連接Master數據庫,請求Master變化的二進制日志

  3.Slave I/O獲取到的二進制日志,保存到自己的Relay log 日志文件中。

  4.Slave 有一個 SQL thread定時檢查Realy log是否變化,變化那么就更新數據

  
 

 為什么要用mysql 的主從

1.實現服務器負載均衡

       即可以通過在主服務器和從服務器之間切分處理客戶查詢的負荷,從而得到更好的客戶相應時間。通常情況下,數據庫管理員會有兩種思路。

       一是在主服務器上只實現數據的更新操作。包括數據記錄的更新、刪除、新建等等作業。而不關心數據的查詢作業。數據庫管理員將數據的查詢請求全部 轉發到從服務器中。這在某些應用中會比較有用。如某些應用,像基金凈值預測的網站。其數據的更新都是有管理員更新的,即更新的用戶比較少。而查詢的用戶數 量會非常的多。此時就可以設置一台主服務器,專門用來數據的更新。同時設置多台從服務器,用來負責用戶信息的查詢

       二是在主服務器上與從服務器切分查詢的作業。在這種思路下,主服務器不單單要完成數據的更新、刪除、插入等作業,同時也需要負擔一部分查詢作業。而從服務器的話,只負責數據的查詢。當主服務器比較忙時,部分查詢請求會自動發送到從服務器重,以降低主服務器的工作負荷。

2.通過復制實現數據的異地備份

       可以定期的將數據從主服務器上復制到從服務器上,這無疑是先了數據的異地備份。在傳統的備份體制下,是將數據備份在本地。此時備份 作業與數據庫服務器運行在同一台設備上,當備份作業運行時就會影響到服務器的正常運行。有時候會明顯的降低服務器的性能。同時,將備份數據存放在本地,也 不是很安全。如硬盤因為電壓等原因被損壞或者服務器被失竊,此時由於備份文件仍然存放在硬盤上,數據庫管理員無法使用備份文件來恢復數據。這顯然會給企業 帶來比較大的損失。

3.提高數據庫系統的可用性

       數據庫復制功能實現了主服務器與從服務器之間數據的同步,增加了數據庫系統的可用性。當主服務器出現問題時,數據庫管理員可以馬上讓從服務器作為主服務器,用來數據的更新與查詢服務。然后回過頭來再仔細的檢查主服務器的問題。此時一般數據庫管理員也會采用兩種手段。

       一是主服務器故障之后,雖然從服務器取代了主服務器的位置,但是對於主服務器可以采取的操作仍然做了一些限制。如仍然只能夠進行數據的查詢,而 不能夠進行數據的更新、刪除等操作。這主要是從數據的安全性考慮。如現在一些銀行系統的升級,在升級的過程中,只能夠查詢余額而不能夠取錢。這是同樣的道 理。

       二是從服務器真正變成了主服務器。當從服務器切換為主服務器之后,其地位完全與原先的主服務器相同。此時可以實現對數據的查詢、更新、刪除等操 作。為此就需要做好數據的安全性工作。即數據的安全策略,要與原先的主服務器完全相同。否則的話,就可能會留下一定的安全隱患

Mysql主從同步配置

  環境准備

  服務器系統:CentOS 7.4

  Mysql版本:5.8

  mysql1(master): 192.168.0.1:3306

  mysql2(slave): 192.168.0.2:3306

  1、在2個服務器上分別安裝Mysql服務,參考:【Linux】CentOS 7.4 安裝 MySQL 8.0.12 解壓版

  2、master數據庫,創建復制用戶並授權

    登錄mysql服務

    1)新增用戶

      命令:create user 'replace'@'%' identified by '123456';

    2)給用戶授權

      命令:grant all privileges on *.* to 'replace'@'%' with grant option;

    3)刷新權限

      命令:flush privileges;

  2、配置mysql master服務

    編輯master節點上的mysql的配置文件

    命令:vim /etc/my.conf

 1 # -----主從配置 主節點-----
 2 
 3 #主服務器唯一ID
 4 server-id=1
 5 #啟用二進制日志
 6 log-bin=mysql-bin
 7 # 設置不要復制的數據庫(可設置多個) 
 8 binlog-ignore-db=mysql 
 9 binlog-ignore-db=information_schema 
10 #設置需要復制的數據庫 
11 binlog-do-db=test_slave
12 #設置logbin格式 
13 binlog_format=STATEMENT

  3、重啟master mysql服務

  4、查詢master狀態

    命令:show master status;

    

  5、master binlog日志查看

    位置:./data/mysql-bin.000002 

    查看命令:./data/mysql-bin.000002 

    

  6、配置mysql slave服務

    編輯slave節點上的mysql的配置文件

    命令:vim /etc/my.conf

1 # -----主從配置 從節點----- 
2 
3 #從服務器唯一ID
4 server-id=2
5 #啟用中繼日志 
6 relay-log=mysql-relay

  7、重啟slave mysql服務

  8、在slave上配置復制主機

    1)登錄slave mysql服務

    2)執行一下命令

1 CHANGE MASTER TO 
2 MASTER_HOST = '192.168.0.1',  
3 MASTER_USER = 'replace', 
4 MASTER_PASSWORD = '123456',
5 MASTER_PORT = 3306,
6 MASTER_LOG_FILE='mysql-bin.000002',
7 MASTER_LOG_POS=2676; 

      注意:

      # MASTER_LOG_FILE='mysql-bin.000002',#與主庫File 保持一致
      # MASTER_LOG_POS=2676 , #與主庫Position 保持一致

      

    3)啟動從服務器復制功能

      啟動從服務命令:start slave;

      停止從服務命令:stop slave;

      重置主節點命令:reset master;

      如果要重新配置主從,需要新停止從服務->重只主節點->設置主節點信息->啟動從服務

    4)查看從服務信息

      命令:show slave status\G;

      

      #下面兩個參數都是Yes,則說明主從配置成功!

      # Slave_IO_Running: Yes

      # Slave_SQL_Running: Yes

驗證Mysql主從同步

  1、登錄master,創建數據庫 test_slave

1 CREATE DATABASE test_slave;

  2、創建表

1 CREATE TABLE `test_tbl` (
2   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3   `title` varchar(100) NOT NULL,
4   `update_date` date DEFAULT NULL,
5   PRIMARY KEY (`id`)
6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  3、插入數據

1 INSERT INTO `test_slave`.`test_tbl`(`id`, `title`, `update_date`) VALUES (1, '白色', '2020-07-10');

  4、更新數據

1 UPDATE `test_slave`.`test_tbl` SET `title` = '黑色', `update_date` = '2020-07-10' WHERE `id` = 1;

  查看master 和 slave 節點數據是否相同


免責聲明!

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



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