對於MySQL資料庫一般用途的主從複製,可以實現資料的備份(如果希望在主節點失效後,能夠使從節點自動接管,就需要更加複雜的配置,這裡暫時先不考慮),如果主節點出現硬體故障,資料庫伺服器可以直接手動切換成備份節點(從節點),繼續提供服務。基本的主從複製配置起來非常容易,這裡我們做個簡單的記錄總結。
我們選擇兩臺伺服器來進行MySQL的主從複製實踐,一臺m1作為主節點,另一臺nn作為從節點。
兩臺機器上都需要安裝MySQL資料庫,如果想要卸掉預設安裝的,可以執行如下命令:
1 |
sudo rpm -e --nodeps mysql
|
現在可以在CentOS 6.4上直接執行如下命令進行安裝:
1 |
sudo yum install -y mysql-server mysql mysql-deve
|
為root使用者設定密碼:
1 |
mysqladmin -u root password `shiyanjun`
|
然後可以直接通過MySQL客戶端登入:
主節點配置
首先,考慮到資料庫的安全,以及便於管理,我們需要在主節點m1上增加一個專用的複製使用者,使得任意想要從主節點進行復制從節點都必須使用這個賬號:
1 |
CREATE USER repli_user;
|
2 |
GRANT REPLICATION SLAVE ON *.* TO `repli_user` @ `%` IDENTIFIED BY `shiyanjun` ;
|
這裡還進行了操作授權,使用這個換用賬號來執行叢集複製。如果想要限制IP端段,也可以在這裡進行配置授權。
然後,在主節點m1上,修改MySQL配置檔案/etc/my.cnf,使其支援Master複製功能,修改後的內容如下所示:
02 |
datadir=/var/lib/mysql |
03 |
socket=/var/lib/mysql/mysql.sock |
05 |
# Disabling symbolic-links is recommended to prevent assorted security risks |
09 |
log-bin-index=m-bin.index |
12 |
log-error=/var/log/mysqld.log |
13 |
pid-file=/var/run/mysqld/mysqld.pid |
server-id指明主節點的身份,從節點通過這個server-id來識別該節點是Master節點(複製架構中的源資料庫伺服器節點)。
如果MySQL當前已經啟動,修改完叢集複製配置後需要重啟伺服器:
1 |
sudo service mysqld restart
|
從節點配置
接著,類似地進行從節點nn的配置,同樣修改MySQL配置檔案/etc/my.cnf,使其支援Slave端複製功能,修改後的內容如下所示:
02 |
datadir=/var/lib/mysql |
03 |
socket=/var/lib/mysql/mysql.sock |
05 |
# Disabling symbolic-links is recommended to prevent assorted security risks |
08 |
relay-log=slave-relay-bin |
09 |
relay-log-index=slave-relay-bin.index |
12 |
log-error=/var/log/mysqld.log |
13 |
pid-file=/var/run/mysqld/mysqld.pid |
同樣,如果MySQL當前已經啟動,修改完叢集複製配置後需要重啟伺服器:
1 |
sudo service mysqld restart
|
然後,需要使從節點nn指向主節點,並啟動Slave複製,執行如下命令:
1 |
CHANGE MASTER TO MASTER_HOST= `m1` , MASTER_PORT=3306, MASTER_USER= `repli_user` , MASTER_PASSWORD= `shiyanjun` ;
|
驗證叢集複製
這時,可以在主節點m1上執行相關操作,驗證從節點nn同步複製了主節點的資料庫中的內容變更。
如果此時,我們已經配置好了主從複製,那麼對於主節點m1上MysQL資料庫的任何變更都會複製到從節點nn上,包括建庫建表、插入更新等操作,下面我們從建庫開始:
在主節點m1上建庫建表:
01 |
CREATE DATABASE workflow;
|
02 |
CREATE TABLE `workflow`.`project` (
|
03 |
`id` int (11) NOT NULL AUTO_INCREMENT,
|
04 |
` name ` varchar (100) NOT NULL ,
|
05 |
`type` tinyint(4) NOT NULL DEFAULT `0` ,
|
06 |
`description` varchar (500) DEFAULT NULL ,
|
07 |
`create_at` date DEFAULT NULL ,
|
08 |
`update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
|
09 |
`status` tinyint(4) NOT NULL DEFAULT `0` ,
|
11 |
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
在m1上檢視binlog內容,執行命令:
binlog內容內容如下所示:
01 |
*************************** 1. row *************************** |
02 |
Log_name: m-bin.000001
|
04 |
Event_type: Format_desc |
07 |
Info: Server ver: 5.1.73-log, Binlog ver: 4
|
08 |
*************************** 2. row *************************** |
09 |
Log_name: m-bin.000001
|
14 |
Info: CREATE DATABASE workflow
|
15 |
*************************** 3. row *************************** |
16 |
Log_name: m-bin.000001
|
21 |
Info: CREATE TABLE `workflow`.`project` (
|
22 |
`id` int(11) NOT NULL AUTO_INCREMENT,
|
23 |
`name` varchar(100) NOT NULL,
|
24 |
`type` tinyint(4) NOT NULL DEFAULT `0`,
|
25 |
`description` varchar(500) DEFAULT NULL,
|
26 |
`create_at` date DEFAULT NULL,
|
27 |
`update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
28 |
`status` tinyint(4) NOT NULL DEFAULT `0`,
|
30 |
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
31 |
3 rows in set (0.00 sec) |
通過上述binlog內容,我們大概可以看到MySQL的binlog都記錄那些資訊,一個事件對應一行記錄。這些記錄資訊的組織結構如下所示:
- Log_name:日誌名稱,指定的記錄操作的binlog日誌名稱,這裡是m-bin.000001,與我們前面在/etc/my.cnf中配置的相對應
- Pos:記錄事件的起始位置
- Event_type:事件型別
- End_log_pos:記錄事件的結束位置
- Server_id:伺服器標識
- Info:事件描述資訊
然後,我們可以檢視在從節點nn上覆制的情況。通過如下命令檢視從節點nn上資料庫和表的資訊:
我們再看一下執行插入語句的情況。在主節點m1上執行如下SQL語句:
1 |
INSERT INTO `workflow`.`project` VALUES (1, `Avatar-II` , 1, `Avatar-II project` , `2014-02-16` , `2014-02-16 11:09:54` , 0);
|
可以在從節點上執行查詢,看到從節點nn上覆制了主節點m1上執行的INSERT語句的記錄:
1 |
SELECT * FROM workflow.project;
|
驗證複製成功。
複製常用命令
下面,我們總結了幾個在MySQL主從複製場景中常用到的幾個相關命令:
結果示例:
1 |
*************************** 1. row *************************** |
6 |
1 row in set (0.00 sec) |
結果示例:
01 |
*************************** 1. row *************************** |
02 |
Slave_IO_State: Waiting for master to send event
|
04 |
Master_User: repli_user
|
07 |
Master_Log_File: m-bin.000001
|
08 |
Read_Master_Log_Pos: 956
|
09 |
Relay_Log_File: slave-relay-bin.000002
|
11 |
Relay_Master_Log_File: m-bin.000001
|
13 |
Slave_SQL_Running: Yes
|
17 |
Replicate_Ignore_Table:
|
18 |
Replicate_Wild_Do_Table:
|
19 |
Replicate_Wild_Ignore_Table:
|
23 |
Exec_Master_Log_Pos: 956
|
28 |
Master_SSL_Allowed: No
|
34 |
Seconds_Behind_Master: 0
|
35 |
Master_SSL_Verify_Server_Cert: No |
40 |
1 row in set (0.00 sec) |