【轉】配置MySQL主從複製(Replication)服務

轉自http://7056824.blog.51cto.com/69854/400642

 

我們一般使用 MySQL 的時候,如果數據量不大,只使用一臺 MySQL 服務器,備份的時候使用 mysqldump 工具就可以了,但是隨着業務不斷髮展,問題出現了:數據量直線上升,單獨一臺數據庫服務器開始出現性能的瓶頸,數據訪問越來越慢。備份也變得困難了,因爲 mysqldump 是導出一份文本文件,而數據量特別大的時候,這樣的備份往往需要很長時間。
        如果你遇到了類似上面的問題,你就可以使用建立 MySQL 主從服務器的複製方式來解決,MySQL 的複製有以下幾個優勢:主服務器/從服務器設置增加了健壯性,主服務器出現問題時,你可以切換到從服務器繼續提供服務。通過在從服務器上執行查詢操作來降 低客戶查詢的負荷,可以得到更好的客戶響應時間,但是不要同時在主從服務器上進行更新,這樣可能引起衝突。使用複製的另一個好處是可以使用一個從服務器執 行備份,而不會干擾主服務器。在備份過程中主服務器可以繼續處理更新。

MySQL 複製的原理:
        MySQL使用3個線程來執行復制功能,其中1個在主服務器上,另兩個在從服務器上。當發出START SLAVE時,從服務器創建一個I/O線程,以連接主服務器並讓主服務器發送二進制日誌。主服務器創建一個線程將二進制日誌中的內容發送到從服務器。從服 務器I/O線程讀取主服務器Binlog Dump線程發送的內容並將該數據拷貝到從服務器數據目錄中的本地文件中,即中繼日誌。第3個線程是SQL線程,從服務器使用此線程讀取中繼日誌並執行日 志中包含的更新。SHOW PROCESSLIST語句可以查詢在主服務器上和從服務器上發生的關於複製的信息。
        默認中繼日誌使用host_name-relay-bin.nnnnnn形式的文件名,其中host_name是從服務器主機名,nnnnnn是序列號。 用連續序列號來創建連續中繼日誌文件,從000001開始。從服務器跟蹤中繼日誌索引文件來識別目前正使用的中繼日誌。默認中繼日誌索引文件名爲 host_name-relay-bin.index。在默認情況,這些文件在從服務器的數據目錄中被創建。中繼日誌與二進制日誌的格式相同,並且可以用 mysqlbinlog讀取。當SQL線程執行完中繼日誌中的所有事件後,中繼日誌將會被自動刪除。

設置 MySQL 主從複製:
注意:MySQL 主從服務器最好使用相同的軟件版本,以避免不不可預期的故障。
軟件環境:系統 rhel4u8,MySQL-5.1.44,
主服務器ip:192.168.0.1  hostname:node1
從服務器ip:192.168.0.2  hostname:node2

設置主服務器

1、編輯 /etc/hosts   (此步非必須)
增加以下內容:

 

192.168.0.2    node2 

2、在主服務器上建立一個爲從服務器進行復制使用的用戶。該賬戶必須授予 REPLICATION SLAVE 權限,由於僅僅是進行復制使用所以不需要再授予任何其它權限。

 

mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%'192.168.0.2' IDENTIFIED BY 'slavepasswd';
mysql> FLUSH PRIVILEGES; 

3、編輯主服務器的配置文件:/etc/my.cnf的[ mysqld ] 部分:
server-id = 本機數據庫 ID 標示,該部分還應有一個server-id=Master_id選項,其中master_id必須爲1到232之間的一個正整數值
log-bin = 二進制日誌的位置和名稱
binlog-do-db = 需要備份的數據庫名,如果備份多個數據庫,重複設置這個選項即可
binlog-ignore-db = 不需要備份的數據庫苦命,如果備份多個數據庫,重複設置這個選項即可

我的主服務器設置爲:

 

server-id = 1
log-bin=/usr/local/mysql/data/mysql-bin.000001
binlog-do-db = wapnews
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema 

4、主服務器執行FLUSH TABLES WITH READ LOCK語句清空所有表和塊寫入語句:

 

mysql> FLUSH TABLES WITH READ LOCK; 

5、保持mysql客戶端程序不要退出。開啓另一個終端對主服務器數據目錄做備份。

 

[root@node1 ~]# cd /usr/local/mysql/data
[root@node1 ~]# tar -zcvf /tmp/mysql-wapnews.tar.gz ./wapnews 

把備份完畢的數據庫備份複製到從服務器上。

6、當FLUSH TABLES WITH READ LOCK所置讀鎖定有效時(即mysql客戶端程序不退出),讀取主服務器上當前的二進制日誌名和偏移量值:

 

mysql > SHOW MASTER STATUS;

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

| File                                 | Position     | Binlog_Do_DB       | Binlog_Ignore_DB                         |

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

| mysql-bin.000001        | 73                | wapnews                | test,mysql,information_schema |

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

File列顯示日誌名,而Position顯示偏移量。在該例子中,二進制日誌值爲mysql-bin.000001,偏移量爲73。記錄該值。以後設置從服務器時需要使用這些值。它們表示複製座標,從服務器應從該點開始從主服務器上進行新的更新。

取得快照並記錄日誌名和偏移量後,回到前一中端重新啓用寫活動:

 

mysql> UNLOCK TABLES; 

設置從服務器:

1、編輯/etc/hosts    (此步非必要)
增加以下內容:

 

192.168.0.1 node1 

2、停止從服務器上的mysqld服務並編輯從服務器的配置文件:/etc/my.cnf 的[ mysqld ] 部分:
server-id = 本機數據庫 ID 標示,該部分還應有一個server-id=Master_id選項,其中master_id必須爲1到232之間的一個正整數值

 

 [root@node2 ~]# service mysqld stop

我的從服務器配置

 

 server-id=2

3、將主服務器數據庫備份恢復到從服務器的數據目錄中。確保對這些文件和目錄的權限正確。服務器 MySQL運行的用戶必須能夠讀寫文件,如同在主服務器上一樣。

 

[root@node2 ~]# cd /usr/local/mysql/data
[root@node2 ~]# tar -zxvf mysql-wapnews.tar.gz
[root@node2 ~]# chown -R mysql:mysql /usr/local/mysql/data/wapnews 

4、啓動從服務器。在從服務器上執行下面的語句,用你的系統的實際值替換選項值:
mysql> CHANGE MASTER TO
          -> MASTER_HOST='master_host_name',
          -> MASTER_USER='replication_user_name',
          -> MASTER_PASSWORD='replication_password',
          -> MASTER_LOG_FILE='recorded_log_file_name',
          -> MASTER_LOG_POS=recorded_log_position;

我的從服務器設置:

 

mysql> change master to
    -> master_host='192.168.0.1',
    -> master_user='replication',
    -> master_password='slavepass',
    -> master_port=3306
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=73,
    -> master_connect_retry=30; 

5、啓動從服務器線程:

 

mysql> START SLAVE; 

執行這些程序後,從服務器應連接主服務器,並補充自從快照以來發生的任何更新。

檢查主從複製是否正常運行
在從服務器上運行 show processlist 命令,檢查是否啓動兩個複製進程。

 

mysql> show processlist /G;
*************************** 1. row ***************************
     Id: 44
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 490
  State: Waiting for master to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 45
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 390
  State: Has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL
3 rows in set (0.00 sec) 

在從服務器上運行 show slave status 命令,檢查複製進程是否正確。

 

mysql> show slave status /G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.1
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 73
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 251
        Relay_Master_Log_File: mysql-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: 106
              Relay_Log_Space: 410
              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) 

        上面出現: Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes 表示複製正常,如果有一個顯示是NO,請檢查以上的主從設置步驟是否正確。如果出現複製錯誤,從服務器的錯誤日誌(HOSTNAME.err)中也會出現 錯誤消息。

        注意:從服務器複製時,會在其數據目錄中發現文件master.info和HOSTNAME-relay-log.info。狀態文件保存在硬盤上,從服 務器關閉時不會丟失。下次從服務器啓動時,讀取這些文件以確定它已經從主服務器讀取了多少二進制日誌,以及處理自己的中繼日誌的程度。不要移除或編輯這些 文件,除非你確切知你正在做什麼並完全理解其意義。即使這樣,最好是使用CHANGE MASTER TO語句。

本文出自 “小苗 ” 博客,請務必保留此出處http://7056824.blog.51cto.com/69854/400642

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章