CentOS系統MySQL主從復制基本配置
對于MySQL數據庫一般用途的主從復制,可以實現數據的備份(如果希望在主節點失效后,能夠使從節點自動接管,就需要更加復雜的配置,這里暫時先不考慮),如果主節點出現硬件故障,數據庫服務器可以直接手動切換成備份節點(從節點),繼續提供服務。基本的主從復制配置起來非常容易,這里我們做個簡單的記錄總結。
我們選擇兩臺服務器來進行MySQL的主從復制實踐,一臺master作為主節點,另一臺slave作為從節點。
兩臺機器上都需要安裝MySQL數據庫,如果想要卸掉默認安裝的,可以執行如下命令:
sudo rpm -e --nodeps mysql yum list | grep mysql
現在可以在CentOS 6.4上直接執行如下命令進行安裝:
sudo yum install -y mysql-server mysql mysql-deve
為root用戶設置密碼:
mysqladmin -u root password 'hunng'
然后可以直接通過MySQL客戶端登錄:
mysql -u root -p
主節點配置
首先,考慮到數據庫的安全,以及便于管理,我們需要在主節點master上增加一個專用的復制用戶,使得任意想要從主節點進行復制從節點都必須使用這個賬號:
CREATE USER repli_user; GRANT REPLICATION SLAVE ON *.* TO 'repli_user'@'%' IDENTIFIED BY 'hunng';
這里還進行了操作授權,使用這個換用賬號來執行集群復制。如果想要限制IP端段,也可以在這里進行配置授權。
然后,在主節點master上,修改MySQL配置文件/etc/my.cnf,使其支持Master復制功能,修改后的內容如下所示:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 server-id=1 log-bin=m-bin log-bin-index=m-bin.index [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
server-id指明主節點的身份,從節點通過這個server-id來識別該節點是Master節點(復制架構中的源數據庫服務器節點)。如果MySQL當前已經啟動,修改完集群復制配置后需要重啟服務器:
sudo service mysqld restart
從節點配置
接著,類似地進行從節點slave的配置,同樣修改MySQL配置文件/etc/my.cnf,使其支持Slave端復制功能,修改后的內容如下所示:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 server-id=2 relay-log=slave-relay-bin relay-log-index=slave-relay-bin.index [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
同樣,如果MySQL當前已經啟動,修改完集群復制配置后需要重啟服務器:
sudo service mysqld restart
然后,需要使從節點slave指向主節點,并啟動Slave復制,執行如下命令:
CHANGE MASTER TO MASTER_HOST='master', MASTER_PORT=3306, MASTER_USER='repli_user', MASTER_PASSWORD='hunng'; START SLAVE;
驗證集群復制
這時,可以在主節點master上執行相關操作,驗證從節點slave同步復制了主節點的數據庫中的內容變更。
如果此時,我們已經配置好了主從復制,那么對于主節點master上MysQL數據庫的任何變更都會復制到從節點slave上,包括建庫建表、插入更新等操作,下面我們從建庫開始:
在主節點master上建庫建表:
CREATE DATABASE workflow; CREATE TABLE `workflow`.`project` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL, `type` tinyint(4) NOT NULL DEFAULT '0', `description` varchar(500) DEFAULT NULL, `create_at` date DEFAULT NULL, `update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `status` tinyint(4) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在master上查看binlog內容,執行命令:
SHOW BINLOG EVENTS\G
binlog內容內容如下所示:
*************************** 1. row ***************************
Log_name: m-bin.000001
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 106
Info: Server ver: 5.1.73-log, Binlog ver: 4
*************************** 2. row ***************************
Log_name: m-bin.000001
Pos: 106
Event_type: Query
Server_id: 1
End_log_pos: 197
Info: CREATE DATABASE workflow
*************************** 3. row ***************************
Log_name: m-bin.000001
Pos: 197
Event_type: Query
Server_id: 1
End_log_pos: 671
Info: CREATE TABLE `workflow`.`project` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`type` tinyint(4) NOT NULL DEFAULT '0',
`description` varchar(500) DEFAULT NULL,
`create_at` date DEFAULT NULL,
`update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`status` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
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:事件描述信息
然后,我們可以查看在從節點slave上復制的情況。通過如下命令查看從節點slave上數據庫和表的信息:
SHOW DATABASES; USE workflow; SHOW TABLES; DESC project;
我們再看一下執行插入語句的情況。在主節點master上執行如下SQL語句:
INSERT INTO `workflow`.`project` VALUES(1, 'Avatar-II', 1, 'Avatar-II project', '2014-02-16', '2014-02-16 11:09:54', 0);
可以在從節點上執行查詢,看到從節點slave上復制了主節點master上執行的INSERT語句的記錄:
SELECT * FROM workflow.project;
驗證復制成功。
復制常用命令
下面,我們總結了幾個在MySQL主從復制場景中常用到的幾個相關命令:
終止主節點復制
STOP MASTER;
清除主節點復制文件
RESET MASTER;
終止從節點復制
STOP SLAVE;
清除從節點復制文件
RESET SLAVE;
查看主節點復制狀態
SHOW MASTER STATUS\G;
結果示例:
*************************** 1. row ***************************
File: m-bin.000001
Position: 956
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)查看從節點復制狀態
SHOW SLAVE STATUS\G;
結果示例:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master
Master_User: repli_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: m-bin.000001
Read_Master_Log_Pos: 956
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 1097
Relay_Master_Log_File: m-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 956
Relay_Log_Space: 1252
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)查看BINLOG列表
SHOW BINARY LOGS\G