數據庫架構設計中從性能考慮常用的四種方法:分布數據、數據拆分、讀寫分離及數據緩存。
-
合理選擇數據存儲方案
1.1直接外觀存儲
Direct Attached Storage,DAS存儲方式的服務器結構如同PC機的架構(即由運算器、控制器、存儲器、輸入裝置和輸出裝置組成),外部的數據存儲設備都可以直接掛接在服務器內部的總線上,數據存儲設備是整個服務器結構的一部分,同樣服務器也擔負着整個網絡的數據存儲職責。
1.2網絡附加存儲
網絡附加存儲(Network attached storage,NAS)方式則全面改進了以前低效的DAS存儲方式,它采用的是獨立的pc服務器,單獨為網絡數據存儲而開發的一種文件服務器。
1.3存儲域網絡
存儲域網絡(storage area network,SAN),它沒有把所有的存儲設備集中安裝在一個專門的NAS服務器上,而是將這些存儲設備單獨通過光纖交換機鏈接起來,形成了一個光纖通道的網絡,然后再將這個網絡與企業現有的局域網連接。在此方案中,起着核心作用的當然是光纖交換機了,它的支撐技術就是Fibre Channel協議,這是ANSI為網絡和通道I/O接口建立的一個標准集成,支持HIPPI\IPI\SCSI\IP\ATM等多種高級協議。
1.4選擇合理的數據存儲方案
1.選擇DAS方案
Das直連式存儲依賴於服務器主機操作系統進行數據的I/O讀寫和存儲維護管理,數據的備份和恢復會要求占用服務器主機資源,數據流需要回流到主機后再到服務器連接着的磁帶機中,數據備份通常會占用服務器20%-30%。
-
選擇NAS方案
Nas作為一個網絡附加的存儲設備,它內置了優化的獨立存儲操作系統,可以有效且緊密的釋放系統總線資源,全力支持i/o存儲,同時NAS設備會集成本地的備份軟件,所以可以不經過服務器就將NAS設備中的重要數據數據進行本地備份,而且NAS設備提供了硬盤RAID、冗余的電源和風扇,以及冗余的控制器,可以保證NAS的穩定應用。
Nas設備主要是用來實現在不同操作系統平台下文件共享應用的,與傳統的服務器或DAS存儲設備相比,基於局域網而設計的,它按照傳統的TCP/IP協議進行通信,且面向消息傳遞,以文件的I/O方式進行數據傳輸。在LAN環境下,NAS已經完全可以實現異構平台之間的數據級共享了,比如windowsnt、linux、unix等平台的共享。基於這種種原因,對於企業來說NAS存儲方案使用和維護的成本相對較低,完全可以由現有的網管員擔當相關的管理職責。
-
選擇SAN方案
San通常是通過一個單獨的基於光纖通道的SAN網絡把存儲設備及服務器連接起來的,因此當有海量數據的存取需求時,數據完全可以通過SAN網絡在相關服務器和后台的存儲設備之間高速傳輸,對於LAN帶寬的占用幾乎為0,而且服務器可以訪問san上的任何一個存儲設備,提高了數據的可用性。
SAN將企業的存儲和服務器平台分開,可以實現24*7小時不間斷的集中管理,在這個平台上,還可以應用一套統一的災難恢復解決方案,同時可以經濟高效的擴展存儲環境。因此SAN非常適合非線性編輯、服務器集群、遠程災難恢復、因特網數據服務等多個領域。
2.數據庫架構的設計
2.1分布數據
分布數據就是根據某些條件把數據分割成多塊,然后放到不同的物理位置。所謂的物理位置是指地理位置:物理主機和物理磁盤。
分布數據的方法有以下幾種:
按照國家進行划分。
按照城市進行划分。
按照數據中心進行划分。
按照數據集合進行划分。
2.2數據拆分
數據拆分不是一個某個特定數據庫軟件所附屬的功能,而是在具體技術細節上的抽象處理,它是垂直拆分,水平擴展的解決方案,其主要目的是突破單節點數據庫服務器的I/0能力限制,解決數據庫的擴展性問題。
-
垂直拆分
也叫做行拆分,其實就是把組成一行的多個列分開,放到不同的表中,這些表具有不同的結構,拆分后的每個表中所含的列更少,也就是列的重新分布。垂直拆分也就是"業務拆分"。
-
水平拆分
日積月累,數據庫表中的數據越來越多,當表記錄達到千萬甚至億級別時,數據庫表的訪問效率將會明顯下降,導致外層應用的訪問效率非常差,訪問時間急劇上升,用戶體驗下降。如果是表數據太大的原因導致訪問速度變慢,一般情況下當訪問與此表相關的業務時速度會很慢,而訪問與此表無關的業務時速度會很快。
水平拆分其實就是把一個表分成幾個表,其原理是根據現有的表克隆出新表,這些表具有相同的列,只是這些表存放不同的數據而已,而且存放的數據相對會少一些。
水平拆分有以下特點:
拆分出來的每一個表結構和原來數據庫的表結構完全相同。
拆分出來的每一個表存放着不同的數據。
將需要拆分的表拆分到多個庫中,而靜態表則同步到各個拆分庫中。在系統的表結構中,一般會分動態表(數據變化很大,數據量也可能很大的表)和靜態表(數據變化很小的表,一般來說都是基礎表,數據量也不會很大),基礎的靜態表都放在一個公共庫中,而動態表則根據標准拆分到分庫中,拆分完成后,維護基礎數據公共庫,然后將其同步到分庫中,在分庫中維護動態表,在查詢時動態表可以與分庫中靜態表關聯查詢。
拆分范圍的划分,比如將1萬-100萬條數據放在一個表中,然后將101萬-200萬條數據放在另外一個表中。也可以按照時間順序來拆分,比如一年的數據歸到一張表中;還可以按照地域范圍來分,比如按照地市來分,每個或多個地市一個庫等。這是按照具體情況來划分的,一般情況下,對帶有較濃分割標志的數據庫表,可以根據分割標志來分割,對沒有較濃分割標志的數據庫表,則只能按照最笨的方法來拆分,有時候為了增加拆分質量,還可以先根據一個分割標志來拆分,然后根據另一個分割標志來進行分區。
數據庫表水平拆分后,訪問數據庫表的sql必須要帶上分割標志來確定目標數據庫表,如果要對多個拆分數據表進行查詢,則需要通過多次訪問數據庫表來完成,同時要在應用層面將數據合並。
2.3讀寫分離
讀寫分離架構利用了數據庫的復制技術,它將讀和寫分布在不同的處理節點上,從而達到可用性和擴展性的目的。
2.4數據緩存
2.4.1緩存什么數據
將公共的、使用頻繁的數據緩存起來。在初期,可以對應用中的核心功能所使用的公共數據進行緩存,在一個用戶量比較大火活躍用戶比較多的系統中,可以為活躍用戶緩存數據。
2.4.2數據緩存多長時間
在緩存世界中,有一個"5分鍾法則":如果一條記錄被頻繁的訪問,就應該放在內存中,否則,就應該放在硬盤上按需訪問,這個臨界點就是5分鍾。
2.4.3如果緩存在數據庫中已經被修改,如何處理
很多的緩存api是有通知機制的,也可以自己編寫輪詢機制。
2.4.4為了節省內存,如何在多台服務器之間共享緩存數據
分布式緩存技術。
-
數據庫設計
在創建數據庫之前,首先要創建一個數據庫計划。這個計划的目的就是列出系統或客戶對數據庫的要求,減少數據庫實現時的風險。
一般來說,創建數據庫計划的核心步驟如下:
理解系統需求
列出系統中主要的實體對象
表明系統中核心實體之間的關系
列出系統在相關特性上的要求,例如穩定性、安全性、性能等方面。
3.1邏輯數據庫設計
邏輯設計主要是建立系統中核心實體之間的關系。一般使用ER圖來描述實體之間的關系。
實體關系確定之后,我們可以在此基礎上進一步分析系統中的核心業務,並進行領域建模。
3.2物理數據庫設計
1.反范式的考慮
范式是數據庫設計的指導理論,但不是"金科玉律",也不是強制性必須遵循的,一切還是要看實際情況。范式越高,設計出來的表就越多,關系可能就越復雜,雖然增加了關聯性,但是性能卻不一定很好。
最明顯的打破范式的設計方法就是冗余法,以空間換取時間,把數據冗余在多個表中,當查詢時可以減少或避免表之間的關聯。
2.數據存儲考慮
數據等正確存儲至關重要。要確保數據的功能被正確的存儲,也就是說在存儲時要選擇正確的數據類型及數據的大小,避免出現格式錯誤和數據截斷的問題。
-
表設計的考慮
還要考慮是否需要分區。分區就是將數據表划分為不同的幾個區域,然后分別在不同的區域中進行讀寫操作。
例如:
在sqlserver中,每個數據庫都對應着某些文件組,在采用分區之后,每個分區就會在不同的文件組上,其好處如下所示:
增強了可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用。
維護方便:如果表的某個分區出現故障,需要修復數據時,只修復該分區即可。
均衡I/O:可以把不同的分區映射到磁盤以平衡I/O,改善整個系統性能。
改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高了檢索速度。