基於binlog方式搭建MySQL主從

基於binlog方式的主從架構,也可稱爲傳統的異步複製方式。html


環境:mysql

主機 IP
操做系統 MySQL版本
Master 192.168.32.3 CentOS release 6.5 (Final) 5.6.16-log
Slave 192.168.32.2 CentOS release 6.5 (Final) 5.6.16-log


主從複製原理圖:sql

1.jpg


主從複製原理:數據庫

經過三個線程來實現。vim

Master,經過dump thread,將數據更改操做記錄到binary log(這些記錄叫作binary log events)安全

Slave,IO thread,將Master的binary log複製到本身的relay log中服務器

Slave,SQL thread,從Slave的realy log中讀取並重放這些記錄架構


主從複製的應用場景:負載均衡

一、Slave做爲Master的數據備份異步

當Master出現問題時,人工或自動切換到Slave主機,保證服務不間斷

二、Master和Slave作讀寫分離,Slave實現負載均衡,將讀寫流量分離

我這裏引入網站找到的一張圖片

11.png

三、在讀寫分離架構下,將多個Slave根據業務進行拆分

在這裏引入從網上找到的一張圖片

11.png


主從搭建配置:

一、修改my.cnf配置

Master主機配置:

cat /home/data/mysql3306/my.cnf

server_id = 2

log_bin = /home/data/mysql3306/mysql-bin

上面兩個是必須配置的,其餘參數根據本身的MySQL安裝目錄和業務狀況自行配置


Slave主機配置:

cat /home/data/mysql3306/my.cnf

server_id = 1

Slave主機的binlog不是必須開啓的,其餘參數根據本身的MySQL安裝目錄和業務狀況自行配置,若是有級聯複製的需求,才進行開啓,通常主從架構不開啓,以節省磁盤I/O


二、受權複製鏈接用戶

mysql> grant replication slave on *.*to repliter@'192.168.32.2' identified by PASSWORD ' *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';

推薦先將密碼進行加密(password()函數)後,再進行受權的方式,這樣明文密碼就不會記錄到binglog中,減小風險


三、配置主從複製過濾規則

若是咱們的業務數據拆分到了各個Slave上,好比:Slave1主機只須要複製論壇(bbs)的數據,Slave2只須要複製在線課堂(edusoho_e)的數據等等,這種狀況下,咱們就須要配置主從複製的過濾規則,只選擇Slave主機須要複製的數據。有兩種過濾規則能夠進行配置。固然了,也能夠不進行配置,直接同步全部的數據至Slave


Master主機上配置主從複製過濾規則:

cat /home/data/mysql3306/my.cnf

binlog-do-db=bailidb(更多過濾規則請閱讀MySQL官網


注意:須要重啓MySQL


更新數據前,先看看position位置

mysql> show master status\G;

*************************** 1. row ***************************

             File: mysql-bin.000006

         Position: 120

     Binlog_Do_DB: bailidb


插入一條非過濾規則數據庫的數據:

INSERT INTO `backup`.`vip_1` (`sname`) VALUES ('Python');

mysql> show master status\G;

*************************** 1. row ***************************

             File: mysql-bin.000006

         Position: 120

     Binlog_Do_DB: bailidb

position位置沒有變更


更新一條符合過濾規則數據庫的數據:

UPDATE `bailidb`.`bl_admin` SET `username` = 'heihei' WHERE `userid` = '40';

mysql> show master status\G;

*************************** 1. row ***************************

             File: mysql-bin.000006

         Position: 562

     Binlog_Do_DB: bailidb

position位置變更,說明配置已經生效了


說明:

雖然Master支持這麼作主從過濾規則,可是配置以後,就只能是配置的庫寫入或配置的庫不能寫入binlog中了,隨着業務變更,一些原來不須要複製同步的庫,如今也須要進行復制同步,那麼就須要重啓Master數據庫,若是以後業務再變更,還須要重啓Master數據庫,顯然,這麼作不夠靈活,並且重啓Master的代價確定也比重啓Slave大的多的;另外一方面,除非十分肯定,Master的全部數據變動操做都應該記錄到binlog中,出了問題還可以據此進行恢復,而不該該對Master作過濾,因此,通常狀況下,選擇配置Slave的主從複製過濾規則。


Slave主機上配置主從複製過濾規則:

如今業務需求是,如今的Slave主機上只須要論壇(bbs)、和在線課堂的數據(edusoho_e)的數據

cat /home/data/mysql3306/my.cnf

replicate_do_db=bbs

replicate_do_db=edusoho_e(更多過濾規則請閱讀MySQL官網


注意:須要重啓MySQL


四、準備複製數據

在Master主機上將bbs、edusoho_e數據備份後,傳輸到Slave主機,進行數據導入,使之和Master數據庫一致

筆者使用的是MySQL自帶的mysqldump工具,此工具,屬於溫備方式,即:備份過程當中會鎖庫表,對業務會形成必定的影響,數據量越大,影響越大。筆者比較贊成網上同行的經驗,50G如下仍是能夠用mysqldump工具,50G以上就應該考慮使用如:Xtrabackup等物理備份工具了



mysqldump -uroot -p --single-transaction --master-data=2 --databases bbs edusoho_e > `date +%F`.sql

--single-transaction 保證數據的讀一致性

--master-data=2 將CHANGE MASTER TO信息註釋

參數的具體含義,請mysqldump --help自行查閱


上傳到Slave主機:

能夠採用scp、ftp、sz等方式,這裏很少說了

 

建立同名數據庫:

mysql> create database bbs;

Query OK, 1 row affected (0.03 sec)

 

mysql> create database edusoho_e;

Query OK, 1 row affected (0.00 sec)


五、開啓數據複製

先進行數據導入

mysql -uroot -p < 2019-04-28.sql


再判斷從Master主機的哪裏開始進行復制,還記得以前mysqldump的--master-data=2選項嗎,它記錄了咱們須要從Master的哪裏開始進行復制

more 2019-04-28.sql(注意:千萬別使用vim,若是sql文件大的話,足夠把你內存吃完,使用more分頁查看就已經足夠)

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=120(這是一個註釋信息的樣本)



查看CHANGE MASTER TO語法選項

mysql> help change master to;(不建議背命令,由於沒有必要)

mysql> CHANGE MASTER TO MASTER_HOST='192.168.32.3',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000007',MASTER_LOG_POS=120;

Query OK, 0 rows affected (0.08 sec)

 

mysql> start slave user='repliter' password='123456';

 

這裏可能會有人會有疑問,你爲何不在CHANGE MASTER TO的時候加入user和password直接鏈接呢?分開寫,不是畫蛇添足嗎?

緣由就是:爲了安全。

在CHANGE MASTER TO的時候,I/O thread負責維護master.info文件的更新,I/O thread會將Master主機的binlog file和position,還有其餘信息,這其中就包括,Slave鏈接Master主機的用戶名和密碼,以此來實現主從數據同步,那麼問題來了,若是CHANGE MASTER TO的時候直接寫user和password,那麼一樣會寫進master.info文件中去,這樣大大增長了帳戶泄露的風險,由於此類的帳戶密碼只能是DBA知道,因此,爲了帳戶安全,在start slave的時候才指定用戶密碼,這樣user和password信息就不會保存到master.info文件之中了


查看Slave的複製狀態:

mysql> show slave status\G;(對於參數項的具體含義,必定要看MySQL官網,由於網上不少資料都是人家按照本身理解翻譯的,難以有理解出入)這裏只看I/O、SQL thread運行狀態

Slave_IO_State: Waiting for master to send event

                  xxx

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

                 xxx

      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it

                 xxx


六、數據同步測試:

Master主機變動兩條數據:

INSERT INTO `bbs`.`myhash_0` (`c1`, `c2`, `c5`) VALUES ('1', '2', '3');

UPDATE `edusoho_e`.`biz_targetlog` SET `target_type` = 'trade.sucessfull' WHERE `id` = '5';

而後去看數據同步過來沒有。


題外:

雖然是在作測試,可是筆者認爲測試的目的可不只僅爲了測試,測試的目的應該是爲了應用到線上作的探路者、前鋒軍,因此,作測試的時候,應該儘量的考慮,這麼作,可否應用到線上?

而不該該圖省事,將過程簡化,如:受權複製鏈接用戶的時候,筆者見過 root@'%'的複製鏈接用戶,請問線上也是這麼作的麼?還有:mysqldump的時候,真的能夠在命令行輸入明文密碼麼?vim 一個幾十G的文件,真的沒有問題麼?應儘量使用最小權限,使用合適的命令,使服務器先運行穩定,纔是前提。

至此,本文到此寫完了,謹以此文記錄本身的點滴成長和學習記錄,對於其中筆者的錯誤之處,望請下方留言指正,不勝感激!

相關文章
相關標籤/搜索