使用MySQL內建複製功能來最佳化可用性

來源:互聯網
上載者:User

在Soundbreak我們天天24小時不間斷之播放實況音頻和視頻,所以對於MySQL之新增之複製特性,我們不能做出很令人信服之測試。通過測試我們發現,可以使用這個特性來與備份資料庫伺服器保持資料同步,這樣當主伺服器因為某種原因處理失效時,能夠使用備份機處理所有之查詢。對於這樣之要求,配置兩台伺服器並不困難。我將具體討論整個處理過程,同時討論一下當主伺服器失效時,如何使用PHP來重新導向查詢。

  MySQL內部複製功能是建立在兩個或兩個以上伺服器之間,通過設定它們之間之主-從關係來實現之。其中一個作為主伺服器,其它之作為從伺服器。我將具體討論如何配置兩台伺服器,將一個設為主伺服器,另一個設為從伺服器。並且描述一下在它們之間進行切換之處理過程。我是在MySQL之3.23.23版本上進行之配置設定過程,並且也是在這個版本上進行之測試。MySQL開發人員建議最好使用最新版本,並且主-從伺服器均使用相同之版本。同時MySQL 3.23版本仍然是beta測試版,而且這個版本可能不能向下相容。所以因為這個原因,在實際之網站中,我現在還沒有使用這個版本。擁有容錯能力具有一個好處是,在不需中斷任何查詢之情況下,對伺服器進行升級。

第一步:配置主伺服器
  在這篇文章之剩下篇幅中,我將指定兩台伺服器。A(IP為10.1.1.1)作為主伺服器(簡稱為主機)。B(IP為10.1.1.2)作為後備伺服器(簡稱為備機)。

  MySQL之複製功能之實現過程為:備機(B)與主機(A)串連,然後讀出主機之二進位更新日誌,再將發生之變化合并到自已之資料庫中。備機需要一個使用者帳號來與主機串連,所以在主機上建立一個帳號,並只給它FILE許可權,如下操作:

GRANT FILE ON *.* TO replicate@10.1.1.2 IDENTIFIED BY password;

  為了備機能夠與主機串連,要在主機上運行FLUSH PRIVILEGES,不過不要擔心,因為我們將在下面之步驟中停掉伺服器。

  現在我們需要主機資料庫之一個快照,並且對主機進行配置,答應產生二進位之更新日誌。首先編輯my.cnf檔案,以便答應二進位更新日誌,所以在[mysqld]部分之下面某個之方增加一行:log-bin。在下一次伺服器啟動時,主機將產生二進位更新日誌(名為:<主機名稱>-bin.<增量序號#>)。為了讓二進位更新日誌有效,關閉MySQL服務程式,然後將主機上之所有資料庫目錄到另一個目錄中,接著重新啟動mysqld。
請確定得到了所有資料庫,否則在進行複製時,假如一個表在主機上存在但在備機上不存在,將因為出錯而退出。現在你已經得到了資料之快照,和一個從建立快照以來之二進位日誌,上面記錄著任何對資料庫之修改。請注重MySQL資料檔案(*.MYD,*.MYI和*.frm)是依靠於檔案系統之,所以你不能僅僅進行檔案傳輸,如從Solaris到Linux。假如你處於一個異種之伺服器環境,你將不得不使用mysqldump公用程式或其它之定製指令碼來得到資料快照。

第二步:配置備機
  讓我們繼續。停掉備機上之MySQL服務程式,並且把從主機上拷貝來之資料庫目錄移到備機上之data目錄下。請確認將目錄之擁有者和屬組改變為MySQL使用者相應值,並且修改檔案模式為660(只對擁有者和屬組可讀、可寫),目錄本身為770(只對擁有者和屬組可讀、可寫和可執行)。

  繼續。在備機上啟動MySQL服務程式,確認MySQL工作正常。運行幾個select查詢(不要update或insert查詢),看一看在第一步中得到之資料快照是否成功。接著,在測試成功後關掉MySQL服務程式。

  在備機上配置需要訪問之主機,以便接收主機之更改。所以需要編輯務機上之my.cnf檔案,在[mysqld]部分中增加下面幾行:

master-host=10.1.1.1
master-user=replicate
master-password=password

  在啟動備機服務程式後,備機服務程式將查看在my.cnf檔案中所指定之主機,查看是否有改變,並且將這些改變合并到自已之資料庫中。備機保持了主機之更新記錄,這些記錄是從主機之master.info檔案中接收下來之。備機線程之狀態可以通過sql命令SHOW SLAVE-STATUS看到。在備機上處理二進位日誌中假如
發生錯誤,都將導致備機線程之退出,並且在*.err之記錄檔中產生一條資訊。然後錯誤可以被改正,接著可以使用sql語句SLAVE START來重新啟動備機線程。線程將從主機二進位Tlog中斷之之方繼續處理。

  至此,在主機上所發生之資料改變應該已經複製到備機上了,要測試它,你可以在主機上插入或更新一條記錄,而在備機上選擇這條記錄。

  現在我們擁有了從A機到B機之這種主-從關係,這樣當A機可能當機之時候,答應我們將所有之查詢重新導向到B機上去,但是當A機恢複時,我們沒有辦法將發生之改變恢複到A機中去。為瞭解決這個問題,我們建立從B機到A機之主-從關係。

第三步:建立相互之主從關係
  首先在B機上之my.cnf檔案中,在[mysqld]部分中加入log-bin,接著重新啟動mysqld,然後建立可在它之上面執行複製功能之使用者帳號,使用:

GRANT FILE ON *.* TO replicate@10.1.1.1 IDENTIFIED BY password;

  在B機上運行FLUSH PRIVILEGES命令,以便裝入在加入複製使用者後之新之授權表,接著回到A機上,在它之my.cnf中加入下面幾行:

master-host=10.1.1.2
master-user=replicate
master-password=password

  在重啟A機之服務程式之後,現在我們一擁有了在A機與B機之間之相互主-從關係。不管在哪個伺服器上更新一條記錄或插入一條記錄,都將被複製到另一台伺服器上。要注重之是:我不敢確定一個備機合并二進位日誌變化之速度有多快,所以用這種方法來進行插入或更新語句之Server Load Balancer可能不是一個好辦法。

第四步:修改你之資料庫連接程式
  既然你已經在A機和B機之間建立了一個相互之關係,你需要修改資料庫連接程式,以便從這種方式中得到好處。下面之函數首先試圖與A機串連,假如不能建立串連則與B機串連。


/********************************************************
function db_connect()



returns a link identifier on success, or false on error
********************************************************/
function db_connect(){
$username = "replUser";
$password = "password";

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.