您好,登錄后才能下訂單哦!
下文主要給大家?guī)泶罱ɑ赽inlog方式的主從架構(gòu)詳細步驟,希望這些內(nèi)容能夠帶給大家實際用處,這也是我編輯搭建基于binlog方式的主從架構(gòu)詳細步驟這篇文章的主要目的。好了,廢話不多說,大家直接看下文吧。
基于binlog方式的主從架構(gòu),也可稱為傳統(tǒng)的異步復制方式。
環(huán)境:
主機 | IP | 操作系統(tǒng) | 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 |
主從復制原理圖:
主從復制原理:
通過三個線程來實現(xiàn)。
Master,通過dump thread,將數(shù)據(jù)更改操作記錄到binary log(這些記錄叫做binary log events)
Slave,IO thread,將Master的binary log復制到自己的relay log中
Slave,SQL thread,從Slave的realy log中讀取并重放這些記錄
主從復制的應用場景:
1、Slave作為Master的數(shù)據(jù)備份
當Master出現(xiàn)問題時,人工或自動切換到Slave主機,保證服務不間斷
2、Master和Slave做讀寫分離,Slave實現(xiàn)負載均衡,將讀寫流量分離
我這里引入網(wǎng)站找到的一張圖片
3、在讀寫分離架構(gòu)下,將多個Slave根據(jù)業(yè)務進行拆分
在這里引入從網(wǎng)上找到的一張圖片
主從搭建配置:
1、修改my.cnf配置
Master主機配置:
cat /home/data/mysql3306/my.cnf
server_id = 2
log_bin = /home/data/mysql3306/mysql-bin
上面兩個是必須配置的,其他參數(shù)根據(jù)自己的MySQL安裝目錄和業(yè)務情況自行配置
Slave主機配置:
cat /home/data/mysql3306/my.cnf
server_id = 1
Slave主機的binlog不是必須開啟的,其他參數(shù)根據(jù)自己的MySQL安裝目錄和業(yè)務情況自行配置,如果有級聯(lián)復制的需求,才進行開啟,一般主從架構(gòu)不開啟,以節(jié)省磁盤I/O
2、授權復制連接用戶
mysql> grant replication slave on *.*to repliter@'192.168.32.2' identified by PASSWORD ' *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';
推薦先將密碼進行加密(password()函數(shù))后,再進行授權的方式,這樣明文密碼就不會記錄到binglog中,減少風險
3、配置主從復制過濾規(guī)則
如果我們的業(yè)務數(shù)據(jù)拆分到了各個Slave上,比如:Slave1主機只需要復制論壇(bbs)的數(shù)據(jù),Slave2只需要復制在線課堂(edusoho_e)的數(shù)據(jù)等等,這種情況下,我們就需要配置主從復制的過濾規(guī)則,只選擇Slave主機需要復制的數(shù)據(jù)。有兩種過濾規(guī)則可以進行配置。當然了,也可以不進行配置,直接同步所有的數(shù)據(jù)至Slave
Master主機上配置主從復制過濾規(guī)則:
cat /home/data/mysql3306/my.cnf
binlog-do-db=bailidb(更多過濾規(guī)則請閱讀MySQL官網(wǎng))
注意:需要重啟MySQL
更新數(shù)據(jù)前,先看看position位置
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000006
Position: 120
Binlog_Do_DB: bailidb
插入一條非過濾規(guī)則數(shù)據(jù)庫的數(shù)據(jù):
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位置沒有變動
更新一條符合過濾規(guī)則數(shù)據(jù)庫的數(shù)據(jù):
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位置變動,說明配置已經(jīng)生效了
說明:
雖然Master支持這么做主從過濾規(guī)則,但是配置之后,就只能是配置的庫寫入或配置的庫不能寫入binlog中了,隨著業(yè)務變動,一些原來不需要復制同步的庫,現(xiàn)在也需要進行復制同步,那么就需要重啟Master數(shù)據(jù)庫,如果之后業(yè)務再變動,還需要重啟Master數(shù)據(jù)庫,顯然,這么做不夠靈活,而且重啟Master的代價肯定也比重啟Slave大的多的;另一方面,除非十分確定,Master的所有數(shù)據(jù)變更操作都應該記錄到binlog中,出了問題還能夠據(jù)此進行恢復,而不應該對Master做過濾,所以,一般情況下,選擇配置Slave的主從復制過濾規(guī)則。
Slave主機上配置主從復制過濾規(guī)則:
現(xiàn)在業(yè)務需求是,現(xiàn)在的Slave主機上只需要論壇(bbs)、和在線課堂的數(shù)據(jù)(edusoho_e)的數(shù)據(jù)
cat /home/data/mysql3306/my.cnf
replicate_do_db=bbs
replicate_do_db=edusoho_e(更多過濾規(guī)則請閱讀MySQL官網(wǎng))
注意:需要重啟MySQL
4、準備復制數(shù)據(jù)
在Master主機上將bbs、edusoho_e數(shù)據(jù)備份后,傳輸?shù)絊lave主機,進行數(shù)據(jù)導入,使之和Master數(shù)據(jù)庫一致
筆者使用的是MySQL自帶的mysqldump工具,此工具,屬于溫備方式,即:備份過程中會鎖庫表,對業(yè)務會造成一定的影響,數(shù)據(jù)量越大,影響越大。筆者比較同意網(wǎng)上同行的經(jīng)驗,50G以下還是可以用mysqldump工具,50G以上就應該考慮使用如:Xtrabackup等物理備份工具了
mysqldump -uroot -p --single-transaction --master-data=2 --databases bbs edusoho_e > `date +%F`.sql
--single-transaction 保證數(shù)據(jù)的讀一致性
--master-data=2 將CHANGE MASTER TO信息注釋
參數(shù)的具體含義,請mysqldump --help自行查閱
上傳到Slave主機:
可以采用scp、ftp、sz等方式,這里不多說了
創(chuàng)建同名數(shù)據(jù)庫:
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)
5、開啟數(shù)據(jù)復制
先進行數(shù)據(jù)導入
mysql -uroot -p < 2019-04-28.sql
再判斷從Master主機的哪里開始進行復制,還記得之前mysqldump的--master-data=2選項嗎,它記錄了我們需要從Master的哪里開始進行復制
more 2019-04-28.sql(注意:千萬別使用vim,如果sql文件大的話,足夠把你內(nèi)存吃完,使用more分頁查看就已經(jīng)足夠)
-- 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主機的用戶名和密碼,以此來實現(xiàn)主從數(shù)據(jù)同步,那么問題來了,如果CHANGE MASTER TO的時候直接寫user和password,那么同樣會寫進master.info文件中去,這樣大大增加了賬戶泄露的風險,因為此類的賬戶密碼只能是DBA知道,所以,為了賬戶安全,在start slave的時候才指定用戶密碼,這樣user和password信息就不會保存到master.info文件之中了
查看Slave的復制狀態(tài):
mysql> show slave status\G;(對于參數(shù)項的具體含義,一定要看MySQL官網(wǎng),因為網(wǎng)上很多資料都是人家按照自己理解翻譯的,難以有理解出入)這里只看I/O、SQL thread運行狀態(tài)
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
6、數(shù)據(jù)同步測試:
Master主機變更兩條數(shù)據(jù):
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';
然后去看數(shù)據(jù)同步過來沒有。
題外:
雖然是在做測試,但是筆者認為測試的目的可不僅僅為了測試,測試的目的應該是為了應用到線上做的探路者、前鋒軍,所以,做測試的時候,應該盡可能的考慮,這么做,能否應用到線上?
而不應該圖省事,將過程簡化,如:授權復制連接用戶的時候,筆者見過 root@'%'的復制連接用戶,請問線上也是這么做的么?還有:mysqldump的時候,真的可以在命令行輸入明文密碼么?vim 一個幾十G的文件,真的沒有問題么?應盡可能使用最小權限,使用合適的命令,使云服務器先運行穩(wěn)定,才是前提。
對于以上關于搭建基于binlog方式的主從架構(gòu)詳細步驟,大家是不是覺得非常有幫助。如果需要了解更多內(nèi)容,請繼續(xù)關注我們的行業(yè)資訊,相信你會喜歡上這些內(nèi)容的。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。