mysql的主從複製原理

來源:互聯網
上載者:User

標籤:

一個簡單完整的 Mysql 主從複製,讀寫分離的。

 


1. 首先搭建 Mysql 主從架構,實現 將 mater 資料自動複製到 slave

 

MySQL 複製的工作方式很簡單,一台伺服器作為主機,一台或多台伺服器作為從機。主機會把資料庫的變化記錄到日誌。一旦這些變化被記錄到日誌,就會立刻(或者以設定的時間間隔)被送到從機。

 


使用MySQL 複製提供擴充大型網站的能力,這些大型網站的資料庫主要是讀操作(SELECTs)。從機用於複製主機的銷秏是很少的(通常每個從機1%的開銷),在大型網站中每個主機部署30 個從機也是常見的。

 

非同步複製與同步複製

 

非同步複製:MySQL本身支援單向的、非同步複製。非同步複製意味著在把資料從一台機器拷貝到另一台機器時有一個延時 – 最重要的是這意味著當應用系統的事務提交已經確認時資料並不能在同一時刻拷貝/應用到從機。通常這個延時是由網路頻寬、資源可用性和系統負載決定的。然而,使用正確的組件並且調優,複製能做到接近瞬時完成。

 

同步複製:同步複製可以定義為資料在同一時刻被提交到一台或多台機器,通常這是通過眾所周知的“兩階段交易認可”做到的。雖然這確實給你在多系統中保持一致性,但也由於增加了額外的訊息交換而造成效能下降。

 

使用MyISAM或者InnoDB儲存引擎的MySQL本身並不支援同步複製,然而有些技術,例如分布式複製塊裝置(簡稱DRBD),可以在下層的檔案系統提供同步複製,允許第二個MySQL伺服器在主伺服器丟失的情況下接管(使用第二伺服器的複本)。要瞭解更多資訊,請參見:http://www.drbd.org/

 



 

 非同步複製方案:

 

1. Mysql 資料庫安裝

 

安裝過程省略: 詳細參見:http://pengranxiang.iteye.com/admin/blogs/1138059

 

伺服器 Master :192.168.14.131

Mysql 安裝目錄: /home/mysql/mysql   (使用源碼安裝,獨立目錄)

 

伺服器 Slave    :192.168.14.132

Mysql 安裝目錄 :/home/mysql/mysql

 

2. 修改配置

 

為了不影響原來的設定檔: /etc/my.cnf

 

建立新的設定檔,

 

cp /etc/my.cnf  /home/mysql/mysql/conf/master.cnf

 

cp /etc/my.cnf  /home/mysql/mysql/conf/slave.cnf

 

修改 master.cnf,  增加下面的設定 ,

(官方說明:為了使用事務的InnoDB在複製中最大的持久性和一致性,你應該指定innodb_flush_log_at_trx_commit=1,sync_binlog=1選項。)

 

Cnf代碼  
  1. log-bin=mysql-bin #slave會基於此log-bin來做replication  
  2. server-id=1           #master的標示  
  3.   
  4. innodb_flush_log_at_trx_commit=1  
  5.   
  6. sync_binlog=1  

 

 

修改 slave.cnf

 

Cnf代碼  
  1. [mysqld]  
  2.   
  3. server-id=2 #slave的標示  

 

3. 啟動服務

 

Cnf代碼  
  1. # Master  
  2.   
  3. # 如果 Mysql 已啟動,先關掉。  
  4.   
  5. /home/mysql/mysql/bin/mysqladmin -u root -p shutdown   
  6.   
  7. # 使用修改過的 master.cnf 啟動 mysql  
  8.   
  9. /home/mysql/mysql/bin/mysqld_safe --defaults-file=/home/mysql/mysql/conf/master.cnf &   

 

 

Java代碼  
  1. # Slave  
  2.   
  3. # 如果 Mysql 已啟動,先關掉。  
  4.   
  5. /home/mysql/mysql/bin/mysqladmin -u root -p shutdown   
  6.   
  7. # 使用修改過的 slave.cnf 啟動 mysql  
  8.   
  9. /home/mysql/mysql/bin/mysqld_safe --defaults-file=/home/mysql/mysql/conf/slave.cnf &   

 

4. 在 Master 上建立一個專門用於複製的帳號 repl_user


5. 啟動主從複製功能

 

需要查看 Master 中的  Master status

 

mysql> show master status;

 

然後再 Slave 中,啟動複製

 


 

 

上面視窗是串連 Master , 下面視窗串連 Slave

 

6. 測試複製

 

在 Master 中插入一條資料, 然後在 Slave 中查詢。 可以驗證。


2 簡單的讀寫分離實現

 

讀寫分離可以直接在 用戶端 實現, 也可以通過 Proxy 伺服器 實現。

 

Proxy 伺服器一般可以選擇:

 

官方的:mysql proxy  地址:http://dev.mysql.com/downloads/mysql-proxy/#downloads

 

國產開源項目:amoeba

Amoeba開發人員部落格: http://amoeba.meidusa.com

Amoeba開源項目地址: http://www.sourceforge.net/projects/amoeba
amoeba 中文文檔:http://amoeba.meidusa.com/amoeba.pdf

 

這裡只示範最簡單的方案: JDBC 直接實現 讀寫分離。

 

Java代碼  
  1. package prx.dao;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.ResultSet;  
  5. import java.util.Properties;  
  6.   
  7. import com.mysql.jdbc.ReplicationDriver;  
  8.   
  9. public class Test {  
  10.   
  11.     public static void main(String[] args) throws Exception {  
  12.         ReplicationDriver driver = new ReplicationDriver();  
  13.   
  14.         Properties props = new Properties();  
  15.   
  16.         // We want this for failover on the slaves  
  17.         props.put("autoReconnect", "true");  
  18.   
  19.         // We want to load balance between the slaves  
  20.         props.put("roundRobinLoadBalance", "true");  
  21.   
  22.         props.put("user", "foo");  
  23.         props.put("password", "bar");  
  24.   
  25.         //    
  26.         // Looks like a normal MySQL JDBC url, with a  
  27.         // comma-separated list of hosts, the first  
  28.         // being the ‘master‘, the rest being any number  
  29.         // of slaves that the driver will load balance against  
  30.         //    
  31.   
  32.         Connection conn = driver.connect(  
  33.                 "jdbc:mysql://master,slave1,slave2,slave3/test", props);  
  34.   
  35.         //    
  36.         // Perform read/write work on the master  
  37.         // by setting the read-only flag to "false"  
  38.         //  
  39.         // 通過 conn 的 readOnly 是否為 true 來判斷,要取 connection 串連的資料庫是 主要資料庫,還是從資料庫  
  40.         // false 為 主要資料庫的串連  
  41.         // true 為 從資料庫的串連  
  42.           
  43.         conn.setReadOnly(false);  
  44.   
  45.         conn.setAutoCommit(false);  
  46.         conn.createStatement().executeUpdate("UPDATE some_table ....");  
  47.         conn.commit();  
  48.   
  49.         //    
  50.         // Now, do a query from a slave, the driver automatically picks one  
  51.         // from the list  
  52.         //    
  53.   
  54.         conn.setReadOnly(true);  
  55.   
  56.         ResultSet rs = conn.createStatement().executeQuery(  
  57.                 "SELECT a,b FROM alt_table");  
  58.   
  59.     }  

mysql的主從複製原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.