MySQL Replication (Master-Slave) for CentOS Installation Guide

這個是承上一篇, 裝完MySQL-Proxy後, 後續怎麼從零建置起, 第一步要先把後端的MySQL Replication建立起來.

準備好兩台機器(目前稱為Master/Slave), 首先安裝好CentOS 5之後, 一樣先把Repositories都裝好, 也都update/upgrade好, 以下是兩台共通的部份.

  1. 安裝一套CentOS5, 我實驗的VM是使用CentOS 5.6, 只裝了基本的Base跟Develop Tools
  2. 先做一次yum -y update, 更新一些套件到最新
  3. 安裝RPMForge & EPEL Repositories
  4. 再做一次yum -y update, 更新一些套件到最新
  5. 安裝MySQL Server, 設定好services

    # yum -y install mysql-server
    # /sbin/chkconfig mysqld on
    # /sbin/service mysqld start
  6. 設定iptables, Master/Slave互相開放對方的TCP 3306 port, 其中eth0改成自己的網卡代號.

    # /sbin/iptables -A INPUT -i eth0 -p tcp -m tcp –dport 3306 -j ACCEPT

接著是兩台不同的部份, 請注意前面的Hostname代表是在哪一台上

  1. 到Master上先設定my.cnf, 這個是可以選擇不同設定檔, 在/usr/share/mysql 下有很多個, 這裡挑選medium的, 細部設定請參考mysql網站上的文件, 這裡直接用medium的標準設定.

    [Master] # /sbin/services mysqld stop
    [Master] # cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
  2. 設定 /etc/my.cnf, 務必打開log-bin

    server-id = 1
    log-bin = mysql-bin

    其中server-id必須各自不同, 用於Replication關係中識別各Server.
  3. 設定Replication使用的連線帳號

    [Master] # /sbin/service mysqld start
    [Master] # mysql -u root
    mysql> GRANT REPLICATION SLAVE ON *.* TO repl@SLAVE-IP IDENTIFIED BY ‘repl_password’;
    mysql> FLUSH PRIVILEGES;

    其中 repl 是Slave用來連接Master使用的帳號, SLAVE-IP是Slave的ip address, 增加一個slave時必須重加, repl_password則是Slave連接Master時的密碼, 請更換成自己的.
  4. 接著把Master的資料都Lock, 避免任何新資料寫入, 並且取得Master status

    mysql> FLUSH TABLES WITH READ LOCK;
    mysql> SHOW MASTER STATUS;
    +——————+———-+————–+——————+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +——————+———-+————–+——————+
    | mysql-bin.000001 | 759 | | |
    +——————+———-+————–+——————+

    上頭的File跟Position就是等等Slave設定時使用的參數
  5. 到Slave上, 一樣先複製一份my.cnf

    [Slave] # /sbin/service mysqld stop
    [Slave] # cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
  6. 設定my.cnf, 唯一的不同是server-id一定要跟Master不同, 而且不能跟其他Slave重複

    server-id = 2
    log-bin = mysql-bin

    server-id務必與Master不同, 也不能與其他Slave(假如有的話)相同
  7. 啟動Slave並設定Master相關資訊

    [Slave] # /sbin/services mysqld start
    [Slave] # mysql -u root
    mysql> CHANGE MASTER TO
    -> MASTER_HOST=Master-IP,
    -> MASTER_USER=’repl’,
    -> MASTER_PASSWORD=’repl_password’,
    -> MASTER_LOG_FILE=’mysql-bin.000001′,
    -> MASTER_LOG_POS=’759′;

    其中Master-IP則為Master的IP, repl是剛剛設定在Master上的帳號, MASTER_LOG_FILE則是剛剛在Master上SHOW Master Status出現的Binary Log檔名, MASTER_LOG_POS則是現在在Binary Log檔案中的位置, 請依照前面看到的填入.
  8. 在Slave上啟動Slave 機制

    mysql> Start Slave;
    Query OK, 0 rows affected, 0 warning (0.00 sec)

    這樣就表示成功了, 也可以在Slave上SHOW SLAVE STATUS來看狀態

    mysql> SHOW SLAVE STATUS\G
    *************************** 1. row ***************************
    Slave_IO_State: Waiting for master to send event
    Master_Host: xxx.xxx.xxx.xxx
    Master_User: repl
    Master_Port: 3306
    Connect_Retry: 60
    Master_Log_File: mysql-bin.000001
    Read_Master_Log_Pos: 759
    Relay_Log_File: mysqld-relay-bin.000042
    Relay_Log_Pos: 235
    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: 759
    Relay_Log_Space: 235
    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
    1 row in set (0.00 sec)

    主要要看到Slave_SQL_Running是Yes就大致ok了.
  9. 最後回到Master上, 把剛剛Lock住的解開

    [Master] # mysql -u root
    mysql> UNLOCK TABLES;

    接下來就可以實驗新增Db/Tables/Rows看看有沒有被Replication到Slave去.

大致這樣就乾淨的把兩台機器之間的MySQL Replication設定好了, 但是還有一些注意事項

  1. 絕對不要在Slave上寫入或更新任何資料, 必要時甚至只開啟Select的權限
  2. 必須定期檢查Slave上的Replication狀態, 是否有錯誤
  3. 由於開啟Binary Log後, 忙碌的MySQL Server會不停的佔用空間, 也請在確認好Replication狀態運行中的時候, 定期PURGE binary log, 相關文件請參考 這裡
  4. 若Replication狀態損壞時, 需要重建關係, 在Master Lock之後, 把mysql data file複製一份至Slave後, 程序相同

這裡只有簡單的run down, 中間碰到任何問題請Google解決吧.

  • Post a comment

    Threaded commenting powered by interconnect/it code.