使用mysql federated引擎構建MySQL分佈式數據庫訪問層(轉)

使用mysql federated 引擎構建 MySQL 分佈式數據庫訪問層mysql

前言:隨着應用複雜度的增長,數據庫不斷細化切分,致使應用程序中數據庫應用就得複雜,凌亂。絕大部分程序人員可能都遇到這種狀況,應用程序中須要鏈接多臺數據庫服務器,進行相應的操做。隨着時間積累,太多的數據庫服務器的鏈接邏輯出如今程序之中,這給程序的維護擴展,數據庫維護工做帶來極大的工做量。sql

因而一些分佈式數據庫代理層應運而生,如常見 MySQL 代理層 : mysql proxy : 主要實現讀寫分離和負載均衡 MySQL Amoeba : 由陳思儒主導開發 功能比較完善,用深刻應用的價值,參考網站 http://docs.hexnova.com/amoeba/ HiveDB : HiveDB是一個用來橫向切分 mysql 數據庫的開源框架,構建一個高性能和可擴展的基於 mysql 的系統,但目前僅支持 Java 客戶端。 http://www.hivedb.org/數據庫

我認爲mysql proxy, MySQL Amoeba 都是極好的實用價值,應該多深刻了解之。服務器

而本文所描述的 federated屬於 MySQL的一種特殊引擎,利用它可將本地數據表映射至遠程 MySQL 數據表,從而就能夠解決應用程序中繁多的跨機器鏈接數據庫問題,拓撲圖以下:網絡

在此輸入圖片描述

如此就能夠構造出一個統一的數據訪問入口,就大大提升了整個數據庫系統的可維護性。 Federated引擎是基於表級別的,只能將本地數據表定義爲 Federated 引擎並映射至遠程實體表,沒法實現基於庫級別的總體映射。負載均衡

在本文中,咱們將啓用Federated 引擎的數據庫訪問入口服務器稱爲本地數據庫,而將本地數據表對應的遠程數據表,稱之爲實體表。框架

本地數據庫須要啓用Federated 引擎支持,而遠程數據表無須 Federated 引擎支持。 Federated 引擎表使用標準的 MySQL 客戶端協議與遠程數據庫創建 TCP 鏈接。分佈式

建立Federated 表的過程:ide

  1.  以root 登陸遠程 MySQL ,上建立合適的訪問帳號 grant all on DB1.* to 'federated'@'%' identified by 'federated'; flush privileges;性能

  2. 在遠程MySQL 找到對應實體表的建立命令(若是是新表,請先創建好數據表,再執行此命令) 假設在遠程mysql 上有庫名 DB1, 表名 tag, 執行如下命令找到遠程表的結構: show create table DB1.tag 輸出: CREATE TABLE tag ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(128) NOT NULL, frequency int(10) unsigned NOT NULL DEFAULT '1', PRIMARY KEY (id) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

  3. 假設咱們要將遠程的DB1.tag 映射至本地 DB.TableA 表上。那麼咱們應該保持本地虛擬表與遠程實體表結構一致(結構能夠有所差別,但會形成使用,管理上的麻煩)。根據遠程實體表的建立命令,建立本地虛擬表 ( 結構部分徹底同樣,建立表選項有所差別 ) :

登陸本地Mysql 服務器,建立相應的數據庫及表: create database DB; use DB; CREATE TABLE TableA ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(128) NOT NULL, frequency int(10) unsigned NOT NULL DEFAULT '1', PRIMARY KEY (id) ) ENGINE=federated connection="mysql://federated:federated@127.0.0.1:3306/DB1/tag";

這時,即創建好了federated 虛擬表,實際上本地 MySQL 只建立了表定義文件 , 而沒有數據文件。咱們對本地虛擬表的數據修改,均會發送到遠程機器上執行。

本地虛擬表名與遠程表名,可不相同。

通過測試,這個引擎的一些額外特色: 1. 本地虛擬表與遠程實體表之間是 TCP 長鏈接,而且是多個客戶端利用的。因此不用擔憂因頻繁創建鏈接帶來的網絡開銷。 2. 本虛擬表表與遠程實體表之間的網絡鏈接斷開後,當對虛擬表發起查詢時,它會嘗試從新鏈接遠程實體表,因此咱們不用擔憂網絡鏈接斷開形成的永久中斷問題。 3. 若是無時間未對本地虛擬表做任何操做,虛擬表與實體表之間的鏈接將在遠程主機的 wait_timeout 秒後自動斷開,當對虛擬表發起查詢時,鏈接又會從新創建。

一些注意事項: 1. 對本地虛擬表的結構修改,並不會修改遠程表的結構 2.  truncate 命令,會清除遠程表數據 3. drop命令只會刪除虛擬表,並不會刪除遠程表 4. 不支持 alter table 命令 目前使用federated 最大的缺點:

  1. select count(*), select * from limit M, N 等語句執行效率很是低,數據量較大時存在很嚴重的問題,可是按主鍵或索引列查詢,則很快,如如下查詢就很是慢(假設 id 爲主索引) select id from db.tablea where id >100 limit 10 ; 而如下查詢就很快: select id from db.tablea where id >100 and id<150

  2. 若是虛擬虛擬表中字段未創建索引,而實體表中爲此字段創建了索引,此種狀況下,性能也至關差。可是當給虛擬表創建索引後,性能恢復正常。

  3. 相似 where name like "str%" limit 1 的查詢,即便在 name 列上建立了索引,也會致使查詢過慢,是由於 federated引擎會將全部知足條件的記錄讀取到本,再進行 limit 處理。

這幾個問題已經嚴重影響了federated 在實際環境中的應用。

相關文章
相關標籤/搜索