為什么mysql要做主從復制?


為什么MySQL要做主從復制(讀寫分離)?

通俗來講,如果對數據庫的讀和寫都在同一個數據庫服務器中操作,業務系統性能會降低。 
為了提升業務系統性能,優化用戶體驗,可以通過做主從復制(讀寫分離)來減輕主數據庫的負載。 
而且如果主數據庫宕機,可快速將業務系統切換到從數據庫上,可避免數據丟失。

MySQL主從復制(讀寫分離)和集群的區別:

我對MySQL也是剛開始研究,不是很專業。我的理解是:

主從復制(讀寫分離):

一般需要兩台及以上數據庫服務器即可(一台用於寫入數據,一台用於同步主的數據並用於數據查詢操作)。 
局限性:

配置好主從復制之后,同一張表,只能對一個服務器寫操作。如果在從上執行了寫操作,而之后主也操作了這張表,或導致主從不同步;據說可以配置成主主方式,但我還沒有研究到。

主數據庫服務器宕機,需要手動將業務系統切換到從數據庫服務器。無法做到高可用性(除非再通過部署keepalive做成高可用方案)。

集群是由N台數據庫服務器組成,數據的寫入和查詢是隨機到任意一台數據庫服務器的,其他數據庫服務器會自動同步數據庫的操作。

任何一台數據庫宕機,不會對整個集群造成大的影響。

局限性

我經過測試才知道目前mysql集群版本(MySQL Cluster)只能對NDB存儲引擎的數據進行集群同步,如果是INNODB或其他的MySQL存儲引擎是不行的。這個也導致了我放棄了在業務系統中應用這種方案。

回歸正題

MySQL5.6開始主從復制有兩種方式:基於日志(binlog);基於GTID(全局事務標示符)。 
需要注意的是:GTID方式不支持臨時表!所以如果你的業務系統要用到臨時表的話就不要考慮這種方式了,至少目前最新版本MySQL5.6.12的GTID復制還是不支持臨時表的。 
所以此篇教程主要是告訴大家如何通過日志(binlog)方式做主從復制! 
Master :192.168.15.141 
Slave:192.168.15.142 
如何安裝mysql我就不細說了,請看linux下安裝mysql

配置文件

master

  1.  
    vi /etc/ my.cnf
  2.  
    [mysqld]
  3.  
    server-id = 1
  4.  
    log-bin innodb_flush_log_at_trx_commit=1
  5.  
    sync_binlog= 1
  6.  
    datadir=/var/lib/mysql
  7.  
    character-set-server=utf8
  8.  
    init_connect= 'SET NAMES utf8'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

什么是sync_binlog? 
當每個sync_binlog’th寫入該二進制日志后,MySQL服務器將它的二進制日志同步到硬盤上(fdatasync())。請注意如果在autocommit模式,每執行一個語句向二進制日志寫入一次,否則每個事務寫入一次。 默認值是0,不與硬盤同步。值為1是最安全的選擇,因為崩潰時,你最多丟掉二進制日志中的一個語句/事務;但是,這是最慢的選擇(除非硬盤有電池備份緩存,從而使同步工作較快)。 
slave:

  1.  
    server-id=2
  2.  
    datadir =/var/lib/mysql
  3.  
    character -set-server=utf8
  4.  
    init_connect ='SET NAMES utf8'
  • 1
  • 2
  • 3
  • 4

在master數據庫設置用來同步的slave用戶權限

啟動數據庫

[root@localhost ~]# service mysqld start
  • 1

進入mysql

  1.  
    [root@localhost ~] # mysql -uroot -p123456
  2.  
    mysql> GRANT REPLICATION SLAVE ON *.* TO '<root>'@'<192.168.15.142>' IDENTIFIED BY '<123456>';
  3.  
    Query OK, 0 rows affected (0.10 sec)
  • 1
  • 2
  • 3
  • 4

主數據庫鎖表(禁止再插入數據以獲取主數據庫的的二進制日志坐標)

>FLUSH TABLES WITH READ LOCK;
  • 1

在主數據庫上使用mysqldump命令創建一個數據快照

[root@localhost ~]# mysqldump -u root -pnew-password --databases drp > /root/test.sql
  • 1

這里寫圖片描述

解鎖第(2)步主數據的鎖表操作

SSH登錄到從數據庫

通過FTP、SFTP或其他方式,將上一步備份的主數據庫快照all.sql上傳到從數據庫某個路徑,例如我放在了/root/目錄下;

從導入主的快照

  1.  
    [ root@localhost ~]# mysql -uroot -p -h127.0.0.1 -P3306< test.sql
  2.  
    Enter password:
  3.  
    You have mail in /var/spool/mail/root
  • 1
  • 2
  • 3
  • 4

給從數據庫設置復制的主數據庫信息(注意修改MASTER_LOG_FILE和MASTER_LOG_POS的值)

MASTER_LOG_FILE和MASTER_LOG_POS在主數據中查看這里寫圖片描述

  1.  
    mysql > CHANGE MASTER TO MASTER_HOST='192.168.15.141',MASTER_USER='root',MASTER_PASSWORD='new-password',MASTER_LOG_FILE='mysqlmaster-bin.000001',MASTER_LOG_POS=3931
  2.  
    mysql > START slave;
  3.  
    Query OK, 0 rows affected (0.74 sec)
  • 1
  • 2
  • 3
  • 4

查看重數據庫的狀態

mysql> SHOW slave STATUS \G
  • 1

如果下面兩個參數都是Yes,則說明主從配置成功! 
這里寫圖片描述 
slave_sql_running:負責自己的slave mysql進程 
Slave_IO_Running:負責與主機的io通信 
查看報錯: 
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the –replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it). 
意思就是從上的server_id和主的一樣的,經查看發現從上的/etc/my.cnf中的server_id=1這行我沒有注釋掉(在下面復制部分我設置了server_id),於是馬上把這行注釋掉了,然后重啟mysql,發現還是報同樣的錯誤。 
解決方案: 
查看主從數據庫中my.conf的server_id是否重復,如果重復,改一下再重啟。 
這樣當主數據庫插入數據,新建表或者創建數據庫時,就可以自動同步到從數據庫了~


免責聲明!

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



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