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