CentOS系統MySQL主從復制基本配置

ymc4 9年前發布 | 12K 次閱讀 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
 本文由用戶 ymc4 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!