資料庫讀寫分離的原理
A. 什麼是資料庫的讀寫分離
amoeba 跟 mysql proxy在讀寫分離的使用上面的區別。
在mysql proxy 上面如果想要讀寫分離並且 讀集群、寫集群 機器比較多情況下,用mysql proxy 需要相當大的工作量,目前mysql proxy沒有現成的 lua腳本。mysql proxy根本沒有配置文件,lua腳本就是它的全部,當然lua是相當方便的。那麼同樣這種東西需要編寫大量的腳本才能完成一個復雜的配置。amoeba目標是走產品化這條路。只需要進行相關的配置就可以滿足需求。一、Master/Slave 結構讀寫分離:
Master: server1 (可讀寫)
slaves:server2、server3、server4(3個平等的資料庫。只讀/負載均衡)
amoeba提供讀寫分離pool相關配置。並且提供負載均衡配置。
可配置server2、server3、server4形成一個虛擬的 virtualSlave,該配置提供負載均衡、failOver、故障恢復功能Xml代碼
<dbServer name="virtualSlave" virtual="true">
<poolConfig>
<className>com.meisa.amoeba.server.MultipleServerPool</className>
<!-- 負載均衡參數 1=ROUNDROBIN , 2=WEIGHTBASED -->
<property name="loadbalance">1</property>
<!-- 參與該pool負載均衡的poolName列表以逗號分割 -->
<property name="poolNames">server2,server3,server4</property>
</poolConfig>
</dbServer>
如果不啟用數據切分,那麼只需要配置QueryRouter屬性
wirtePool=server1
readPool=virtualSlave
<queryRouter>
<className>com.meisa.amoeba.mysql.parser.MysqlQueryRouter</className>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">server1</property>
<property name="writePool">server1</property>
<property name="readPool">virtualSlave</property>
<property name="needParse">true</property>
B. 為什麼資料庫讀寫分離可以提高性能
首先聲明一點,讀寫分離只有在讀多寫少的場景下才能提高性能。
一方面讀寫分離都是1寫+N讀的實現,因此READ操作可以分散到多台伺服器上,性能自然提高。
另一方面,在一個資料庫實例下,同表數據經常會遇到鎖等待,WRITE時所有的READ操作被阻塞,將讀寫分離,可以很大程度上減輕這種情況。
C. mysql 如何實現讀寫分離,用mysql-proxy 或者直接用php連接兩個資料庫
Mysql主從配置,實現讀寫分離
原理:主伺服器(Master)負責網站NonQuery操作,從伺服器負責Query操作,用戶可以根據網站功能模特性塊固定訪問Slave伺服器,或者自己寫個池或隊列,自由為請求分配從伺服器連接。主從伺服器利用MySQL的二進制日誌文件,實現數據同步。二進制日誌由主伺服器產生,從伺服器響應獲取同步資料庫。
具體實現:
1、在主從伺服器上都裝上MySQL資料庫,windows系統鄙人安裝的是mysql_5.5.25.msi版本,Ubuntu安裝的是mysql-5.6.22-linux-glibc2.5-i686.tar
windows安裝mysql就不談了,一般地球人都應該會。鄙人稍微說一下Ubuntu的MySQL安裝,我建議不要在線下載安裝,還是離線安裝的好。大家可以參考 http://www.linuxidc.com/Linux/2013-01/78716.htm 這位不知道大哥還是姐妹,寫的挺好按照這個就能裝上。在安裝的時候可能會出現幾種現象,大家可以參考解決一下:
(1)如果您不是使用root用戶登錄,建議 su - root 切換到Root用戶安裝,那就不用老是 sudo 了。
(2)存放解壓的mysql 文件夾,文件夾名字最好改成mysql
(3)在./support-files/mysql.server start 啟動MySQL的時候,可能會出現一個警告,中文意思是啟動服務運行讀文件時,忽略了my.cnf文件,那是因為my.cnf的文件許可權有問題,mysql會認為該文件有危險不會執行。但是mysql還會啟動成功,但如果下面配置從伺服器參數修改my.cnf文件的時候,你會發現文件改過了,但是重啟服務時,修改過後的配置沒有執行,而且您 list一下mysql的文件夾下會發現很多.my.cnf.swp等中間文件。這都是因為MySQL啟動時沒有讀取my.cnf的原因。這時只要將my.cnf的文件許可權改成my_new.cnf的許可權一樣就Ok,命令:chmod 644 my.cnf就Ok
(4)Ubuntu中修改文檔內容沒有Vim,最好把Vim 裝上,apt-get install vim,不然估計會抓狂。
這時候我相信MySQL應該安裝上去了。
2、配置Master主伺服器
(1)在Master MySQL上創建一個用戶『repl』,並允許其他Slave伺服器可以通過遠程訪問Master,通過該用戶讀取二進制日誌,實現數據同步。
D. 資料庫為什麼要讀寫分離
資料庫不一定要讀寫分離,如果程序使用資料庫較多時,而更新少,查詢多的情況下會考慮使用,利用資料庫 主從同步 。可以減少資料庫壓力,提高性能。當然,資料庫也有其它優化方案。memcache 或是 表折分,或是搜索引擎。都是解決方法。
E. 怎麼實現讀寫分離
為了確保資料庫產品的穩定性,很多資料庫擁有雙機熱備功能。也就是,第一台資料庫伺服器,是對外提供增刪改業務的生產伺服器;第二台資料庫伺服器,主要進行讀的操作。·
讀寫分離(Read/Write Splitting)。
1.原理:讓主資料庫(master)處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從資料庫(slave)處理SELECT查詢操作。
2.誕生原因:
2.1 為了確保資料庫產品的穩定性,很多資料庫擁有雙機熱備功能。也就是,第一台資料庫伺服器,是對外提供增刪改查業務的生產伺服器;第二台資料庫伺服器,僅僅接收來自第一台伺服器的備份數據(注意,不同資料庫產品,第一台資料庫伺服器,向第二台資料庫伺服器發送備份數據的方式不同)。當第一台資料庫崩潰後,第二台資料庫伺服器,可以立即上線來代替第一台資料庫伺服器,並且,在第一台資料庫伺服器崩潰後,寶貴的數據,依然會存在於第二台資料庫伺服器里(根據目前業界的備份數據發送方式來看,當第一台資料庫崩潰後,第一台資料庫里的仍然會有少量的新數據,沒能來得及被發送到第二台資料庫伺服器,所以,這部分數據就丟失了)。
2.2 一般來說,為了配置方便,以及穩定性,這兩台資料庫伺服器,都用的是相同的配置(思考一下,如果兩台伺服器的配置不同,會導致什麼結果)。
2.3 從上文的描述中,大家能看到,在實際運行中,第一台資料庫伺服器的壓力,遠遠大於第二台資料庫伺服器。因此,很多人希望合理利用第二台資料庫伺服器的空閑資源。那麼,第二台資料庫伺服器能做些什麼事情呢?
2.4 從資料庫的基本業務來看,資料庫的操作無非就是增刪改查這4個操作。但對於「增刪改」這三個操作,如果是雙機熱備的環境中做,一台機器做了這三個操作的某一個之後,需要立即將這個操作,同步到另一台伺服器上。單向的同步,不復雜。但如果兩台機器都需要向對方進行同步,那邏輯就非常復雜,而且還會大大降低性能。(從保證ACID特性的角度,思考一下為什麼雙向同步會非常復雜且低性能?而單向同步卻不會?)出於這個原因,第二台備用的伺服器,就只做了查詢操作。進一步,為了降低第一台伺服器的壓力,乾脆就把查詢操作全部丟給第二台資料庫伺服器去做,第一台資料庫伺服器就只做增刪改了。
2.4 到這一步,就實現了所謂的讀寫分離。這樣做,缺點也非常明顯了。本來第二台資料庫伺服器,是用來做熱備的,它就應該在一個壓力非常小的環境下,保證運行的穩定性。而讀寫分離,卻增加了它的壓力,也就增加了不穩定性。因此,讀寫分離,實質上是一個在資金比較缺乏,但又需要保證數據安全的需求下,在雙機熱備方案上,做出的一種折中的擴展方案。
簡單實現
通過RAID技術,RAID是英文Rendant Array of Independent Disks的縮寫,翻譯成中文意思是「獨立磁碟冗餘陣列」,有時也簡稱磁碟陣列(Disk Array)。
簡單的說,RAID是一種把多塊獨立的硬碟(物理硬碟)按不同的方式組合起來形成一個硬碟組(邏輯硬碟),從而提供比單個硬碟更高的存儲性能和提供數據備份技術。
F. 為什麼資料庫讀寫分離能提高資料庫的性能
讀寫分離主要目的是提高系統吞吐量。某些網站同一時間有大量的讀操作和較少的寫操作。同時,讀操作對數據的實時性要求並沒有那麼高。在此前提下,可以這么設計解決方案。
所以你問題里「數據仍然需要同步」這個理解是不對的。事實上,正是由於允許用戶讀到幾秒鍾甚至幾分鍾前的數據,才可以使用讀寫分離的。
所以這種方案其實就是以數據的時效性,換取了讀操作的吞吐率。
G. 為什麼資料庫讀寫分離可以提高性能
之所以說讀寫分離能夠提高性能,是因為讀寫分離採用這樣的機制:
假設我們現在有資料庫伺服器1,對外提供一切操作,還有資料庫伺服器2,僅僅保存資料庫伺服器1的數據備份,定時同步,以便伺服器1意外崩潰後能夠盡量的彌補損失。
但是伺服器2原本能夠提供增刪改查服務,這樣以來伺服器2的資源就產生了極大的浪費,因此我們希望伺服器2也做一些事情,而不是僅僅作為一個備份。
顯然增刪改都是不能夠交給伺服器2去完成的,因為如果這樣做就失去了伺服器1的意義,所以伺服器2僅僅提供查詢操作,增刪改都留給伺服器1去完成,這就是所謂的讀寫分離。
讀寫分離機制使得兩個伺服器分擔原本屬於一個伺服器的壓力,因此性能有所提高,同時有數據備份的存在,其穩定性高於單伺服器。
H. mysql讀寫分離原理是什麼
利用mysql proxy來實現的。
MySQL Proxy最強大的一項功能是實現「讀寫分離(Read/Write Splitting)」。基本的原理是讓主資料庫處理事務性查詢,而從資料庫處理SELECT查詢。資料庫復制被用來把事務性查詢導致的變更同步到集群中的從資料庫。當然,主伺服器也可以提供查詢服務。使用讀寫分離最大的作用無非是環境伺服器壓力。
I. 什麼叫讀寫分離讀是RAID幾寫又是RAID幾
讀寫分離(Read/Write Splitting)」,基本的原理是讓主資料庫處理事務性查詢,而從資料庫處理SELECT查詢。資料庫復制被用來把事務性查詢導致的變更同
步到集群中的從資料庫。
對於大訪問量的網站,一般會採用讀寫分離,比如ebay的讀寫比率是260:1,也就是大型的電子商務網站的。
網上看到說採用讀寫分離有如下工具:
1,oracle的logical standby
2, Quest公司的SharePlex
3, DSG公司的RealSync
如果你是網吧類應用:強烈建議你不要用無盤!!!!
必須有一名專業人員維護!三天兩頭的小問題 軟體游戲更新要你的命!
無盤伺服器的讀寫分離,很早就被提出來了。幾乎所有的商業無盤系統都會將讀寫分離作為提高無盤運行速度的有效途徑。可即使做了讀寫分離,系統性能也並
沒有得到顯著的提升。為什麼?因為他們分離錯了!該分離的沒有分離,而不該分離的卻又分離了!
現在市面上的無盤讀寫分離,都是將系統分區同游戲分區分開二個磁碟。殊不知,系統分區的磁碟讀寫負荷不知要大過游戲分區多少倍!為什麼這么說呢
?程序員都知道,程序一運行就會將自身完全載入內存了。雖然現在的游戲幾乎沒有不超過G大小的,但是,游戲主程序加上其需要調用的DLL文件,可能加起來
也就才幾十M而已,甚至更少!(大家可以運行一個大型游戲來看看它的內存使用量)。那另外那些幾乎超過游戲總大小百分之九十九的東西是什麼呢?不用說
大家都知道,是游戲必不可少的資源文件,比如:地圖、圖像、聲音等等。而游戲一般進去都會有等待載入的畫面,這里等待載入的東西,就是那些資源文件。
而這些資源文件載入後放在哪裡了?即使你系統有NG的內存容量,也不要指望游戲會將它放全部放在內存里。(不信你現在又可以看看游戲所佔用內存使用量)
。那是放哪裡了?那麼多寵大的游戲資源文件是放在哪裡了?去問個游戲程序員吧(問我也行啊,俺也是。。)。他會告訴你,放在頁面文件里了!!! 千
萬不要以為,游戲是邊運行邊從硬碟讀取文件的,游戲為了加快運行速度,都是將需要運行的文件預先載入入內存或是虛擬內存中的!而更多的是載入到虛擬內
存即頁面文件中,即使是幾G的內存,也是擺設。
感覺到恐怖吧!你以為你的系統分區磁碟幾乎沒做什麼事,其實它是最累的!游戲的讀取只需要進行一次,就是說載入一次,但是載入以後的東西是放在頁
面文件中的,游戲對頁面文件的讀取是非常頻繁的!可現在的無盤全弄反了,將系統分區磁碟弄成個普通IDE,將游戲分區弄成陣列。好武器沒有用到該用的地
方。
玩游戲會卡?幾乎每一種技術的無盤系統,玩游戲都會覺得有卡的時候。看看你客戶機的頁面文件大小吧,最小都有二三百M吧,幾十台機每台都來個幾百M
的讀寫量,呵呵,你想想,你那個又要做系統又要放頁面文件而且「待遇又不好」的磁碟,它磁頭會忙成什麼樣子!
我已經分析的很清楚了,該分離的應該是頁面文件!而游戲可以分,也可以不分。對於本身帶有緩沖功能的無盤系統,大型游戲應該都放在無盤伺服器上。
而不常用的硬碟游戲,網路游戲就可以放在網路的其它機上面。(共享或是虛擬磁碟方式)。
打開多個IE卡,最小化IE卡,啟動QQ卡,退出遊戲還是卡。這些都是對頁面文件大量讀寫的時候。將頁面文件分離出來吧!專門弄個硬碟提供頁面文件的讀
寫。這樣,系統更穩定、游戲更流暢!
怎麼解決這個惱人的頁面文件?暫時的方法,你可以升級您的系統分區的磁碟硬體,會有點改善,但解決不了根本。因為頁面文件是同系統分區放在一個磁
盤裡面的,而用戶與操作系統的交互是非常頻繁的,就是說,依現在的磁碟讀寫速度,又要滿足頁面文件的讀寫,又要不影響用戶同系統的交互,是做不到的。
另外一個解決方法,就是使用SetPageFile.exe軟體。
RAID是英文Rendant Array of Independent Disks的縮寫,翻譯成中文意思是「獨立磁碟冗餘陣列」,有時也簡稱磁碟陣列(Disk Array)。
簡單的說,RAID是一種把多塊獨立的硬碟(物理硬碟)按不同的方式組合起來形成一個硬碟組(邏輯硬碟),從而提供比單個硬碟更高的存儲性能和提供數
據備份技術。組成磁碟陣列的不同方式成為RAID級別(RAID Levels)。數據備份的功能是在用戶數據一旦發生損壞後,利用備份信息可以使損壞數據得以恢復
,從而保障了用戶數據的安全性。在用戶看起來,組成的磁碟組就像是一個硬碟,用戶可以對它進行分區,格式化等等。總之,對磁碟陣列的操作與單個硬碟一
模一樣。不同的是,磁碟陣列的存儲速度要比單個硬碟高很多,而且可以提供自動數據備份。
RAID技術的兩大特點:一是速度、二是安全,由於這兩項優點,RAID技術早期被應用於高級伺服器中的SCSI介面的硬碟系統中,隨著近年計算機技術的發展
,PC機的CPU的速度已進入GHz 時代。IDE介面的硬碟也不甘落後,相繼推出了ATA66和ATA100硬碟。這就使得RAID技術被應用於中低檔甚至個人PC機上成為
可能。RAID通常是由在硬碟陣列塔中的RAID控制器或電腦中的RAID卡來實現的。
RAID技術經過不斷的發展,現在已擁有了從 RAID 0 到 6 七種基本的RAID 級別。另外,還有一些基本RAID級別的組合形式,如RAID 10(RAID 0與RAID 1
的組合),RAID 50(RAID 0與RAID 5的組合)等。不同RAID 級別代表著不同的存儲性能、數據安全性和存儲成本。但我們最為常用的是下面的幾種RAID形式。
(1) RAID 0
RAID 0又稱為Stripe(條帶化)或Striping,它代表了所有RAID級別中最高的存儲性能。RAID 0提高存儲性能的原理是把連續的數據分散到多個磁碟上存取
,這樣,系統有數據請求就可以被多個磁碟並行的執行,每個磁碟執行屬於它自己的那部分數據請求。這種數據上的並行操作可以充分利用匯流排的帶寬,顯著提
高磁碟整體存取性能。
例如系統向三個磁碟組成的邏輯硬碟(RADI 0 磁碟組)發出的I/O數據請求被轉化為3項操作,其中的每一項操作都對應於一塊物理硬碟。我們可以清楚的看
到通過建立RAID 0,原先順序的數據請求被分散到所有的三塊硬碟中同時執行。從理論上講,三塊硬碟的並行操作使同一時間內磁碟讀寫速度提升了3倍。 但由
於匯流排帶寬等多種因素的影響,實際的提升速率肯定會低於理論值,但是,大量數據並行傳輸與串列傳輸比較,提速效果顯著顯然毋庸置疑。
RAID 0的缺點是不提供數據冗餘,因此一旦用戶數據損壞,損壞的數據將無法得到恢復。
RAID 0具有的特點,使其特別適用於對性能要求較高,而對數據安全不太在乎的領域,如圖形工作站等。對於個人用戶,RAID 0也是提高硬碟存儲性能的絕
佳選擇。
(2) RAID 1
RAID 1又稱為Mirror或Mirroring(鏡像),它的宗旨是最大限度的保證用戶數據的可用性和可修復性。 RAID 1的操作方式是把用戶寫入硬碟的數據百分之
百地自動復制到另外一個硬碟上。
當讀取數據時,系統先從RAID 0的源盤讀取數據,如果讀取數據成功,則系統不去管備份盤上的數據;如果讀取源盤數據失敗,則系統自動轉而讀取備份
盤上的數據,不會造成用戶工作任務的中斷。當然,我們應當及時地更換損壞的硬碟並利用備份數據重新建立Mirror,避免備份盤在發生損壞時,造成不可挽回
的數據損失。
由於對存儲的數據進行百分之百的備份,在所有RAID級別中,RAID 1提供最高的數據安全保障。同樣,由於數據的百分之百備份,備份數據佔了總存儲空間
的一半,因而Mirror(鏡像)的磁碟空間利用率低,存儲成本高。
Mirror雖不能提高存儲性能,但由於其具有的高數據安全性,使其尤其適用於存放重要數據,如伺服器和資料庫存儲等領域.
( 3) RAID 0+1
正如其名字一樣RAID 0+1是RAID 0和RAID 1的組合形式,也稱為RAID 10。
以四個磁碟組成的RAID 0+1為例,其數據存儲方式:RAID 0+1是存儲性能和數據安全兼顧的方案。它在提供與RAID 1一樣的數據安全保障的同時,也提供
了與RAID 0近似的存儲性能。
由於RAID 0+1也通過數據的100%備份功能提供數據安全保障,因此RAID 0+1的磁碟空間利用率與RAID 1相同,存儲成本高。
RAID 0+1的特點使其特別適用於既有大量數據需要存取,同時又對數據安全性要求嚴格的領域,如銀行、金融、商業超市、倉儲庫房、各種檔案管理等。
(4) RAID 3
RAID 3是把數據分成多個「塊」,按照一定的容錯演算法,存放在N+1個硬碟上,實際數據佔用的有效空間為N個硬碟的空間總和,而第N+1個硬碟上存儲的數
據是校驗容錯信息,當這N+1個硬碟中的其中一個硬碟出現故障時,從其它N個硬碟中的數據也可以恢復原始數據,這樣,僅使用這N個硬碟也可以帶傷繼續工作
(如採集和回放素材),當更換一個新硬碟後,系統可以重新恢復完整的校驗容錯信息。由於在一個硬碟陣列中,多於一個硬碟同時出現故障率的幾率很小,所
以一般情況下,使用RAID3,安全性是可以得到保障的。與RAID0相比,RAID3在讀寫速度方面相對較慢。使用的容錯演算法和分塊大小決定RAID使用的應用場合,
在通常情況下,RAID3比較適合大文件類型且安全性要求較高的應用,如視頻編輯、硬碟播出機、大型資料庫等.
(5) RAID 5
RAID 5 是一種存儲性能、數據安全和存儲成本兼顧的存儲解決方案。 以四個硬碟組成的RAID 5為例,其數據存儲方式:,P0為D0,D1和D2的奇偶校驗信
息,其它以此類推。由圖中可以看出,RAID 5不對存儲的數據進行備份,而是把數據和相對應的奇偶校驗信息存儲到組成RAID5的各個磁碟上,並且奇偶校驗信
息和相對應的數據分別存儲於不同的磁碟上。當RAID5的一個磁碟數據發生損壞後,利用剩下的數據和相應的奇偶校驗信息去恢復被損壞的數據。
RAID 5可以理解為是RAID 0和RAID 1的折衷方案。RAID 5可以為系統提供數據安全保障,但保障程度要比Mirror低而磁碟空間利用率要比Mirror高。RAID
5具有和RAID 0相近似的數據讀取速度,只是多了一個奇偶校驗信息,寫入數據的速度比對單個磁碟進行寫入操作稍慢。同時由於多個數據對應一個奇偶校驗信
息,RAID 5的磁碟空間利用率要比RAID 1高,存儲成本相對較低。
RAID級別的選擇有三個主要因素:可用性(數據冗餘)、性能和成本。如果不要求可用性,選擇RAID0以獲得最佳性能。如果可用性和性能是重要的而成
本不是一個主要因素,則根據硬碟數量選擇RAID 1。如果可用性、成本和性能都同樣重要,則根據一般的數據傳輸和硬碟的數量選擇RAID3、RAID5。