Windows下搭建MySQL Master Slave


一、背景

服務器上放了很多MySQL數據庫,為了安全,現在需要做Master/Slave方案,因為操作系統是Window的,所以沒有辦法使用keepalived這個HA工具,但是我們可以接受人工進行切換,有什么好的方案呢?

 

二、幾種Master/Slave邏輯架構圖

clip_image001

(Figure1:單Master-單Slave)

clip_image002

(Figure2:單Master-多Slave)

clip_image004

(Figure3:單Master-級聯Slave)

clip_image006

(Figure4:Master/Slave部署邏輯圖)

 

三、搭建過程

環境:Windows Server 2008 R2 + mysql-5.5.22-winx64

主服務器(Master):192.168.1.66

從服務器(Slave):192.168.1.67

使用Master/Slave架構,Slave為只讀模式;

 

(一) 配置主服務器(Master)

1. 編輯數據庫配置文件my.ini,在[mysqld]標簽下面加入下面代碼:

log-bin=mysql-bin

server-id=1

innodb_flush_log_at_trx_commit=1

sync_binlog=1

binlog_do_db=barfoo_weibo_hottop

binlog_ignore_db=mysql

說明:

1) log-bin=mysql-bin啟用Binary Log,會在數據文件夾中生成一系列的滾動文件,類似:mysql-bin.000002

2) server-id=1中的1可以任定義,只要是唯一的就行,為了與其它Master和Slave進行區別;

3) innodb_flush_log_at_trx_commit = 0,每秒寫一次trax log,並執行fsync;

innodb_flush_log_at_trx_commit = 1,每次trax 提交的時候寫一次trax log, 並執行fsync;

innodb_flush_log_at_trx_commit = 2,每次trax 提交的時候寫一次trax log, 不會執行fsync;

4) sync_binlog=1表示異步進行日志記錄;

5) binlog_do_db=barfoo_weibo_hottop是表示只對數據barfoo_weibo_hottop做日志記錄,如果想記錄多個數據庫,添加多幾條binlog_do_db就可以了;

6) binlog_ignore_db=mysql表示忽略備份mysql;不加binlog_do_db和binlog_ignore_db,那就表示備份全部數據庫。

2. 重啟MySQL服務

3. 在Master服務器新建一個用戶賦予“REPLICATION SLAVE”的權限,你不需要再賦予其它的權限,這里指定的IP為Slave的IP;

mysql>CREATE USER viajar@'192.168.1.67' IDENTIFIED BY 'BarFoo2013';

mysql>GRANT REPLICATION SLAVE ON *.* TO viajar@'192.168.1.67' IDENTIFIED BY 'abc2013';

4. 在Master服務器執行下面的腳本,讓數據庫只能讀;

mysql>FLUSH TABLES WITH READ LOCK;

5. 拷貝數據庫文件夾和ibdata1文件到本地臨時文件夾中,馬上執行下面的步驟;

6. 查看Master服務器的狀態,記下File及Position的值,后面設置Slave服務器的時候需要用到;

mysql>SHOW MASTER logs;

mysql>SHOW MASTER STATUS;

clip_image008

(Figure1:Master狀態)

7. 對表進行解鎖,恢復數據庫讀寫;

mysql>UNLOCK TABLES;

8. 使用FTP等工具把第5步驟的臨時文件傳到Slave服務器;

 

(二) 配置從服務器(Slave)

1. 編輯數據庫配置文件my.ini,在[mysqld]的下面加入下面代碼,可以自己定義數值,只要保證唯一的就行,與Master的能區分開就行;

server-id=2

read-only=1

2. 重啟MySQL

3. 登錄MySQL服務器,執行下面的腳本命令:

mysql>CHANGE MASTER TO

MASTER_HOST='192.168.1.66',

MASTER_USER='viajar',

MASTER_PASSWORD='abc2013',

MASTER_PORT=3309,

MASTER_LOG_FILE='mysql-bin.000005',

MASTER_LOG_POS=7179684,

MASTER_CONNECT_RETRY=30;

說明:

1) MASTER_HOST:Master服務器的IP;

2) MASTER_USER:配置主服務器時建立的用戶名;

3) ASTER_PASSWORD:用戶名對應的密碼;

4) ASTER_PORT:主服務器mysql端口,如果未曾修改,默認即可;

5) MASTER_LOG_FILE:log文件名,參考Figure1;

6) MASTER_LOG_POS:只上次備份時的log文件的偏移量,參考Figure1;

7) MASTER_CONNECT_RETRY:重新連接Master的時間間隔,單位為秒;

4. 啟動Slave進程,執行下面的腳本命令;

mysql>START SLAVE;

5. 檢查主從同步狀態,執行下面的腳本命令,其中Slave_IO_Running 與 Slave_SQL_Running 的值都必須為YES,才表明狀態正常。

mysql>SHOW SLAVE STATUS;

clip_image010

(Figure2:Slave狀態1)

clip_image011

(Figure3:Slave狀態2)

6. 查看Slave服務器的MySQL日志;

clip_image012

(Figure4:Slave日志文件)

 

四、補充說明

1. 查看幫助

mysql>help

2. 查看slave幫助

mysql>help slave

3. 查找當前有哪些二進制日志文件

mysql> show binary logs;

4. 刪除mysql-bin.000018之前的所有二進制日志文件

mysql> purge binary logs to 'mysql-bin.000018';

5. 從 MySQL 5.1.12 開始,能夠用以下三種形式來告終:基於SQL語句的復制(statement-based replication, SBR),基於行的復制(row-based replication, RBR),混雜形式復制(mixed-based replication, MBR)。相應地,binlog的款式也有三種:STATEMENT,ROW,MIXED。MBR 形式中,SBR 形式是默認的。

#binlog_format="STATEMENT"
#binlog_format="ROW"
#binlog_format="MIXED"

當然了,也能夠在運行時動態修正binlog的款式。例如

mysql> SET SESSION binlog_format = 'STATEMENT';
mysql> SET SESSION binlog_format = 'ROW';
mysql> SET SESSION binlog_format = 'MIXED';

mysql> SET GLOBAL binlog_format = 'STATEMENT';
mysql> SET GLOBAL binlog_format = 'ROW';
mysql> SET GLOBAL binlog_format = 'MIXED';

6. MySQL同步故障:Slave_SQL_Running:No

mysql> slave stop;

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

mysql> slave start;

 

五、疑問

(一) 復制級別有以下幾種,默認級別是那種?如何顯式設置這個值?

1. Row Level:5.1.5開始支持。mater記錄每行數據的更改日志,slave根據日志逐行應用。優點:數據一致性更有保障。缺點:可能造成日志文件比較大;

2. Statement Level:master記錄每個執行的query語句以及一些上下文信息,slave節點根據這些信息重新在slave上執行。優點:binary log比較小。缺點:某些情況下數據一致性難以保障;

3. Mixed Level:MySQL根據情況選擇哪種復制方式。5.1.8開始支持。

(二) 常用架構有以下幾種,我想要的效果是:當MasterA宕機之后,MasterB還能讀寫,在MasterA在恢復之后重新讓MasterA成為主Master。

1. Master-Slaves:通常都采用這種方式;

2. Dual Master(Master-Master):2個master節點互相同步更新。因為MySQL的異步復制方式,為了防止數據沖突造成的不一致性,一般僅將其中一台用於寫操作,另一台不用或僅用於讀操作。目的是其中一台master停機維護或者故障中斷時可以使用另一台master;

3. 級聯復制(Master-Slaves-Slaves):在Master Slaves中,如果slaves過多replication將增加master的負載,這時可以讓master只向其中幾台slave分發更新日志,這幾台slave作為一級節點再向下級節點分發更新日志。

(三) 如果slave報錯或者宕機一段時間,那么應該如何重新同步宕機時間master的數據到slave呢?

(四) 在Master設置binlog_do_db=test的時候,如何可以設置記錄多個數據庫?

解答:直接在配置文件my.ini加入多條binlog_do_db就可以了;

(五) 每天的日志文件就有10GB,如何清理?如何維護?有沒什么設置或者方法可以減少日志量呢?

 

六、參考文獻

windows下Mysql master-slave配置

搭建MySql的Master/Slave架構

Linux MySQL主從復制(Replication)配置

13.4.2.1. CHANGE MASTER TO Syntax

innodb_flush_log_at_trx_commit option

innodb_flush_log_at_trx_commit

理解MySQL——復制(Replication)(圖形並茂)


免責聲明!

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



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