Ubuntu10下MySQL搭建Master Slave


一、背景知識

(一) Replication

MySQL的replication是異步的,適用於對數據實時性要求不是特別關鍵的場景。slave端的IO線程負責從master讀取日志,SQL線程專門負責在slave端應用從master讀過來的日志。 使用replication必須啟用binary log,MySQL用binary log向slave分發更新。

(二) 復制級別

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

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

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

(三) 常用架構

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作為一級節點再向下級節點分發更新日志。

4.     總結

3個線程:2個IO線程,1個sql線程;

2種日志:binlog,realylog;

1種實現:全程異步;

 

二、測試環境與內容

環境:Ubuntu 10.04.2 LTS + MySQL5.1.41-3ubuntu12.10-log

主服務器(Master):192.168.1.126

從服務器(Slave):192.168.1.145

由於MySQL不同版本之間的(二進制日志)binlog格式可能會不一樣,因此最好的搭配組合是Master的 MySQL版本和Slave的版本相同或者更低,Master的版本肯定不能高於Slave版本。

搭建主從服務器需要完成下面兩個步驟:

1)     MySQL啟用Binary Log

2)     配置主服務器(Master)

3)     配置從服務器(Slave)

4)     測試插入數據

 

三、搭建過程

(一) MySQL啟用Binary Log

Binary Log的運作原理很簡單,它只是單純的將所有會修改到數據庫內容的操作記錄在 Log 文件中,然后通過這個Binary Log 你就可以重新執行所有會修改到數據庫內容的操作。

在vim /etc/mysql/my.cnf的 [mysqld] 區塊中加上 log-bin=mysql-bin 選項,然后重新啟動 MySQL Server:service mysql restart

查看日志:show master logs;

(圖:設置Binary Log之前)

(圖:設置Binary Log之后)

啟用后你應該可以在 MySQL 的 Data Dir 里面發現如下的文件:mysql-bin.00000X

(圖:日志文件目錄:/var/lib/mysql 日志文件:mysql-bin.000001)

 

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

1.     編輯數據庫配置文件my.cnf

一般在/etc/mysql/my.cnf,執行#vim /etc/mysql/my.cnf

在[mysqld]的下面加入下面代碼:

log-bin=mysql-bin

server-id=1

innodb_flush_log_at_trx_commit=1

sync_binlog=1

binlog_do_db=weibo

binlog_ignore_db=mysql

說明:

1)     log-bin=mysql-bin啟用Binary Log;

2)     server-id=1中的1可以任定義,只要是唯一的就行;

3)     innodb_flush_log_at_trx_commit=1

4)     sync_binlog=1

5)     binlog_do_db=weibo是表示只備份weibo;(binlog-do-db)

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

2.     重啟MySQL

#service mysql restart

3.     登錄MySQL服務器

#mysql –u root -p

在主服務器新建一個用戶賦予“REPLICATION SLAVE”的權限。你不需要再賦予其它的權限。

mysql>CREATE USER viajar@ '192.168.1.145' IDENTIFIED BY '123456';

mysql>GRANT REPLICATION SLAVE ON *.* TO viajar@ '192.168.1.145' IDENTIFIED BY '123456';

 

省略了幾個步驟(可以補上)

 

4.     再次連接數據庫進入mysql命令行查看master狀態

mysql>SHOW MASTER logs;

mysql>SHOW MASTER STATUS;

記下File及Position的值,后面做從服務器操作的時候需要用.

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000004 |      583 | weibo        | mysql            |

+------------------+----------+--------------+------------------+

 

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

1.     編輯數據庫配置文件my.cnf

在[mysqld]的下面加入下面代碼:

server-id=2

可以自己定義,只要保證唯一的就行。

2.     重啟MySQL

#service mysql restart

 

3.     登錄MySQL服務器

#mysql –u root -p

執行以下命令:

mysql>CHANGE MASTER TO

MASTER_HOST='192.168.1.126',

MASTER_USER='viajar',

MASTER_PASSWORD='123456',

MASTER_PORT=3306,

MASTER_LOG_FILE='mysql-bin.000004',

MASTER_LOG_POS=583,

MASTER_CONNECT_RETRY=10;

說明:

MASTER_HOST:主服務器的IP;

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

ASTER_PASSWORD:用戶密碼;

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

或者是執行:

mysql> change master to master_host='192.168.1.126', master_user='viajar', master_password='123456', master_log_file='mysql-bin.000004', master_log_pos=106;

4.     啟動Slave進程

mysql>START SLAVE;

5.     查看MySQL的日志

mysql的日志,一般在/var/log/目錄下的mysql.log,如果啟動成功,你應該會看到類似下面的日志:

6.     主從同步檢查

mysql>show slave status\G;

其中Slave_IO_Running 與 Slave_SQL_Running 的值都必須為YES,才表明狀態正常。\G的好處就是以下圖的格式進行顯示,\g是沒有這個效果的。

 

(四) 測試插入數據

使用SQLyog鏈接到192.168.1.126(以下用126表示)與192.168.1.145(以下用145表示),在126上執行插入操作:

INSERT INTO `blog` (`TaskID`, `Content`, `Quote`, `Author`, `Time`, `Url`, `ImageUrl`, `Transmits`, `Comments`, `Hash`, `AddOn`)

VALUES('5','fefef','fefef','efef','2012-02-03 11:30:40',

'http://www.cnblogs.com/zgx/archive/2011/09/13/2174823.html',NULL,'0',

'0','33333333','2012-02-04 11:30:54');

(圖:126)

(圖:145)

當在145上執行:TRUNCATE TABLE blog;(SQLyog按F8執行)之后,在126上執行插入的時候,只有新的數據會傳遞到145上;

(圖:126)

(圖:145)

 

四、補充

查看幫助:mysql>help

查看slave幫助:mysql>help slave

       查看slave狀態:show slave status\G;

查找當前有哪些二進制日志文件:mysql> show binary logs;

刪除mysql-bin.000018之前的所有二進制日志文件:mysql> purge binary logs to 'mysql-bin.000018';

從 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';

MySQL同步故障:Slave_SQL_Running:No

mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;

 

五、疑問

1.      如果導入導出數據庫數據?

2.      Master/Slave的深入知識是什么?需要注意什么設置選項(包括Linux和MySQL的選項)?性能如何評估?延時多少?Binary Log應該設置多大為合適?

3.      [mysqld] log-bin = /var/lib/mysql/mysql-bin.* 這樣設置有什么不一樣?

4.      binlog-do-db=weibo與binlog_do_db=weibo會有不同嘛?

5.      查看MySQL的日志好像里面的內容為空?

6.      嘗試Master-Slave-Slave模式,性能有相差很大?

7.      另外你可能需要設置主服務器的數據庫二進制日志的過期時間,可以在配置文件/etc/mysql/my.cnf中使用參數expire_logs_days來設定。mysql-bin.00000X(mysql的日志文件、二進制日志文件)的增長規律是什么?每天一個文件?重啟一次生成一個新文件?

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

9.      如何設置、查看復制的級別?Row Level、Statement Level、Mixed Level?跟Binary Log的關系,本身Innodb的log是不同的,Binary Log的大小要如何設置?

10.   設置了bin-log的起始位置,那么如果設置日志文件最大值,那分了日志后會如何呢?返回信息中除了日志所包含的信息之外,還包括本次返回的信息已經到Master端的bin-log文件的名稱以及bin-log的位置;

 

六、參考文獻

Linux MySQL主從復制(Replication)配置(大體上正確,目錄有問題)

mysql 主從復制讀寫分離實現(正確的change master)

mysql master/slave 使用感受

mysql 動態生成測試數據

[MySQL管理] mysql主從復制,讀寫分離 (MySQL Proxy)

MySQL 使用 binary log 回復某段時間區間的資料啟用Binary Log)

MySQL數據庫災難恢復啟用Binary Log)

Binary Logging of Stored Programs

搭建MySQL的Master/Slave架構(Windows)

MySQL復制級別

MySQL 復制原理與實際操作過程

復制參數binlogformat(日志級別)

mysql log-bin 日志文件(查看日志+刪除日志)

檢查MySQL的Slave是否正常(腳本)

Slave_SQL_Running: No mysql同步故障解決方法(數據同步)

MySQL-Proxy負載平衡測試遇到的問題及其分析 && MySQL-Proxy工作機制

mysql主從服務器搭建配置(配置例子)


免責聲明!

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



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