POSTS
MySQL Master/Slave Server (Replication Database)
MySQL 提供 Master/Slave 機制讓您輕易的完成多個 MySQL Server 之間的資料同步,有了多個資料同步的 MySQL Server 在管理上會較有彈性,例如你可以建置備援主機或是進行負載平衡等等。但是要注意:一台 Master Server 可以擁有很多台 Slave Server;但一台 Slave Server 只可對應到一台 Master Server。
架設步驟:
[事前準備]
- 確保 Master 與 Slave 之間的資料一致
[Master Server 方面]
- 設定 Server-id
- 開啟 Binary Log
- 設定 Replication Slave 權限
[Slave Server 方面]
- 設定 Server-id
- 將 Master_Host 設定為 Master Server
- 啟動與檢查 Slave Server 的狀態
在此範例中我們假設:
[Master Server]
- IP 為 192.168.1.1
- server-id 為 1
- 進行資料同步時所使用的帳號資訊:
帳號: slave_server
密碼: 12345678[Slave Server]
- IP 為 192.168.1.2
- server-id 為 2
Master/Slave Server 架設
一、Master Server 方面
A.設定 Server-id
首先要設定 server-id。基本上沒有什麼特別的限制,只要 Master 和 Slave 的 server-id 不一樣即可,但其值必需為 1 至 2^32-1 之間。但為了方便識別,通常我們會把這個值設定為 IP 的最後一組數字,例如若 IP 為 192.168.1.1,則 server-id 設定為 1;若 IP 為 192.168.1.2,則 server-id 設定為 2。
[mysqld]
server-id=1B.開啟 Binary Log
修改 MySQL Server 的系統設定檔,在 [mysqld] 下方加上 log-bin=mysql-bin,例如:
引用:
[mysqld]
log-bin<p> MySQL 的 Binary Log 會將所有對於資料庫的修改操作全部記錄起來,而 Slave 與 Master 之間進行資料同步的方式很簡單,就是 Slave 會把 Master Server 的 Binary Log 拿過來執行,也就是說 Slave Server 會 “重做” 在 Master Server 上發生的各種修改操作。因此 Master Server 勿必要開啟 Binary Log 功能,否則 Master/Slave 架構無法運作。 </p></blockquote> <p> <font color="#0000ff">C.設定 Replication Slave 權限</font> </p> <blockquote> <p> 我們必須要在 Master Server 上做設定,讓 Slave 具有可以從 Master Server 上 Copy 資料的權限(正式的說法為 Replication Slave Priviledges),所需使用的指令如下: </p> <p style="margin: 5px 20px 20px"> </p> <p class="smallfont" style="margin-bottom: 2px"> 引用: </p> <table class="tb" border="0" cellpadding="6" cellspacing="0" width="100%"> <tr> <td class="alt2" style="border: 1px inset "> <p id="post_message_" class="bword"> GRANT REPLICATION SLAVE ON *.* TO ‘user’@’slaver_ip’ IDENTIFIED BY ‘PASSWORD’; </p> </td> </tr> </table> <p> 意思為: </p> <ol style="list-style-type: decimal"> <li> 允許 slaver_ip 這個 IP 使用 USER 帳號,來進行資料同步(Replication)。 </li> <li> slave_server 這個帳號的密碼為 PASSWORD。 </li> </ol> </blockquote></blockquote> <p> <strong><font size="4">二、Slave Server 方面</font></strong> </p> <blockquote> <p> <font color="Blue">A.設定 Server-id</font> </p> <blockquote> <p> 在 Slave 我們將其設定為 2: </p> <p style="margin: 5px 20px 20px"> </p> <p class="smallfont" style="margin-bottom: 2px"> 引用: </p> <table class="tb" border="0" cellpadding="6" cellspacing="0" width="100%"> <tr> <td class="alt2" style="border: 1px inset "> <p id="post_message_" class="bword"> [mysqld]<br /> server-id=2</td> </tr> </table> </blockquote> <p> <font color="#0000ff">B.將 Master_Host 設定為 Master Server</font> </p> <blockquote> <p> 我們必須要明確的告訴 Slave Server 哪一台 Server 才是 Master Server,修改MY.CNF: </p> <p style="margin: 5px 20px 20px"> </p> <p class="smallfont" style="margin-bottom: 2px"> 引用: </p> <table class="tb" border="0" cellpadding="6" cellspacing="0" width="100%"> <tr> <td class="alt2" style="border: 1px inset "> <p id="post_message_" class="bword"> [mysqld]<br /> server-id=2<br /> master-host=master_ip<br /> master-user=user<br /> master-password=password </p> <p> naster-port=3306<br /> replicate-do-db=mydb#預作同步資料庫<br /> log-slave-updates</td> </tr> </table> <p> 意思為: </p> <ol style="list-style-type: decimal"> <li> Master Server 是 192.168.1.1 </li> <li> 使用 TCP Port 3306 連接 </li> <li> 使用 slave_server 這個帳號登入 </li> <li> 登入時使用的密碼為 12345678 </li> </ol></blockquote> <p> 將 Master / Slave 的 MySQL 停掉<br /> 將要複製的資料庫 (/var/db/mysql/) 打包後,複製一份到 Slave MySQL 那邊 </p> <p> 將 Master / Slave 兩邊的的記錄檔<br /> 例如:<br /> rm /var/db/mysql/*.* </p></blockquote> <p> <strong><font size="6">Master/Slave 的應用</font></strong> </p> <p> vbulletin 原本即內建支援多台 MySQL Server 之間的負載平衡,只要你事先建立好 MySQL Master/Slave Server,並在 Slave Server 開放 Master Server 的權限,接下來只要在 vbb 的設定檔中做一些簡單的修改即可。 </p> <p> 備註: </p> <p> 查詢 Master / Slave 資料同步的狀況 </p> <p> <strong>MySQL Master</strong> </p> <p> mysql> show master status\G<br /> *************************** 1. row ***************************<br /> File: db-bin.001<br /> Position: 82044017<br /> Binlog_do_db: mydb<br /> Binlog_ignore_db:<br /> 1 row in set (0.00 sec) </p> <p> <strong>MySQL Slave</strong> </p> <p> mysql> show slave status\G<br /> *************************** 1. row ***************************<br /> Master_Host: x.x.x.x<br /> Master_User: replication<br /> Master_Port: 3306<br /> Connect_retry: 60<br /> Master_Log_File: db-bin.001<br /> Read_Master_Log_Pos: 82190094<br /> Relay_Log_File: db-relay-bin.001<br /> Relay_Log_Pos: 564644047<br /> Relay_Master_Log_File: db-bin.001<br /> Slave_IO_Running: Yes<br /> Slave_SQL_Running: Yes<br /> Replicate_do_db: mydb<br /> Replicate_ignore_db:<br /> Last_errno: 0<br /> Last_error:<br /> Skip_counter: 0<br /> Exec_master_log_pos: 82190094<br /> Relay_log_space: 564644047<br /> 1 row in set (0.00 sec) </p> <p> Slave 上會有兩個記錄檔 master.info 、 relay-log.info </p> <p> # cat master.info<br /> db8-bin.005<br /> 44110392<br /> x.x.x.x<br /> replication<br /> 1234 (密碼)<br /> 3306<br /> 60 </p> <p> # cat relay-log.info<br /> ./db-relay-bin.002<br /> 631411217<br /> db-bin.001<br /> 44173174 </p> <div class="wp_plus_one_button" style="margin: 0 8px 8px 0; float:left; "> <g:plusone href="https://blog.sd.idv.tw/archives/41" callback="wp_plus_one_handler"></g:plusone> </div>