DevOps實(shí)踐系列文章,請參見連接。
概述:
在所有的軟件系統(tǒng)中都有數(shù)據(jù)持久化的需求。而平常我們在軟件系統(tǒng)中使用最多的方式就是數(shù)據(jù)庫。所以,就需要對數(shù)據(jù)庫的可靠性做一些必要的設(shè)計。以保證之后在項(xiàng)目上線運(yùn)營過程中發(fā)生不可修復(fù)的問題,以此來整體提高軟件系統(tǒng)的整體可靠性。
隨著軟件行業(yè)的不斷發(fā)展,行業(yè)中也對軟件各個層面上的解決方案都提供了高性能、靠可靠的解決方案?,F(xiàn)在在數(shù)據(jù)存儲層面也形成了很多解決方案。如:RDBMS的分庫分片技術(shù)、NoSql的CAP解決方案、NewSQL技術(shù)、BigTable技術(shù)等。雖然數(shù)據(jù)存儲層也有著層出不窮的存儲技術(shù),就像作者之前說的一樣。每項(xiàng)技術(shù)都有它所擅長的方向,都有它的問題解決域。所以,不是每一項(xiàng)技術(shù)都可以應(yīng)用到所有的場景下。
針對業(yè)務(wù)系統(tǒng)中的結(jié)構(gòu)化數(shù)據(jù)存儲領(lǐng)域,仍然是RDBMS占有著很大的優(yōu)勢。就算是RDBMS型的數(shù)據(jù)庫也可以再劃分為很多種類型。鑒于本文關(guān)系的是數(shù)據(jù)庫的存儲(物理)結(jié)構(gòu),從數(shù)據(jù)庫的存儲結(jié)構(gòu)上將數(shù)據(jù)庫分為:內(nèi)存式、文件系統(tǒng)、物理機(jī)?;旧弦粋€比較成熟的數(shù)據(jù)庫都是支持這些模式。
| 內(nèi)存式 | 文件系統(tǒng) | 物理機(jī) | |
|---|---|---|---|
| Oracle | TimesTen | 本身支持 | 本身支持 |
| Postgresql | 不支持,支持表空間 | 本身支持 | 不支持 |
| Mysql | MEMORY存儲引擎 | 本身支持 | InnoDB存儲引擎 |
| Sqlite3 | 本身支持 | 本身支持 | 不支持 |
數(shù)據(jù)庫使用過程中需要發(fā)揮RDBMS的特點(diǎn)。在滿足業(yè)務(wù)上的需求的同時,還需要滿足技術(shù)上的、運(yùn)維上的很多需求。所以接下來就從數(shù)據(jù)庫設(shè)計開始一步一步的深入數(shù)據(jù)庫可靠性設(shè)計的方方面面。
數(shù)據(jù)庫驅(qū)動開發(fā):
現(xiàn)在業(yè)界有一種不成文的規(guī)定:在項(xiàng)目沒有發(fā)展到一定階段時,開發(fā)模型都會直接使用數(shù)據(jù)庫驅(qū)動開發(fā)。然后在到達(dá)一定階段之后,再進(jìn)行重構(gòu)。
這里對數(shù)據(jù)庫驅(qū)動開發(fā)的軟件過程或思維模式的指導(dǎo)下,簡單的對項(xiàng)目的實(shí)施過程進(jìn)行一下闡述:
- 根據(jù)業(yè)務(wù)分析出數(shù)據(jù)庫邏輯結(jié)構(gòu);
-
;
- 規(guī)劃數(shù)據(jù)庫容量,并發(fā)量
- 設(shè)計數(shù)據(jù)庫物理存儲結(jié)構(gòu)
- 設(shè)計容災(zāi)與備份方案
- 等
- 開發(fā)、測試、部署之后即可交付。
數(shù)據(jù)庫驅(qū)動開發(fā)模式是對軟件無知狀態(tài)下的一種探索。它忽略了前期、中期、后期的很多分析與度量的內(nèi)容。并且省略了上面的第二條。而且根據(jù)作者在之后會介紹倉庫系統(tǒng)及知識庫架構(gòu)模式中的指導(dǎo):可以將數(shù)據(jù)庫作為以一個知識庫。也不會進(jìn)行提前的風(fēng)險評估。知識庫是用來在不同的業(yè)務(wù)或者服務(wù)間共享知識與數(shù)據(jù)。所以,這里并不是推薦這種開發(fā)模式,并請盡量不要使用數(shù)據(jù)庫驅(qū)動開發(fā)模式。
數(shù)據(jù)庫設(shè)計:
數(shù)據(jù)庫設(shè)計一般可以分為:概念結(jié)構(gòu)設(shè)計、邏輯結(jié)構(gòu)設(shè)計、物理結(jié)構(gòu)設(shè)計。概念結(jié)構(gòu)設(shè)計是將業(yè)務(wù)轉(zhuǎn)化為數(shù)據(jù)庫中結(jié)構(gòu)的一個過程。邏輯結(jié)構(gòu)設(shè)計是根據(jù)概念結(jié)構(gòu)設(shè)計中的E-R圖,具體的將實(shí)體關(guān)系,數(shù)據(jù)格式定義出來。物理結(jié)構(gòu)設(shè)計是確定邏輯層的數(shù)據(jù)存儲在什么樣的硬件上,怎樣存儲在硬件上。
我們這里更關(guān)心物理結(jié)構(gòu)設(shè)計。第一步是需要知道業(yè)務(wù)中的非功能需求。非功能需求可以評估出數(shù)據(jù)庫的容量,并發(fā)量,數(shù)據(jù)類型等等信息。然后根據(jù)這些信息在進(jìn)行下一步的設(shè)計工作。設(shè)計工作中要考慮的內(nèi)容有:
- 數(shù)據(jù)庫的存儲容量是否能夠容納,是否需要進(jìn)行分庫,分表操作。
- 是讀頻繁型,還是寫頻繁型,還是都頻繁型?
- 數(shù)據(jù)庫對數(shù)據(jù)寫入到查詢出的時延要求?
- 是否允許進(jìn)行讀寫分離設(shè)計?
- 數(shù)據(jù)庫是否允許冷備,還是只可以進(jìn)行熱備或者變形方案?
- 數(shù)據(jù)庫可以接受的備份方式:全量備份,增量備份(日志備份,差異備份),不備份?
- 數(shù)據(jù)庫恢復(fù)時允許丟失的數(shù)據(jù)的要求?
- 數(shù)據(jù)庫運(yùn)維監(jiān)控、容量監(jiān)控、負(fù)載監(jiān)控、熱數(shù)據(jù)加速、死鎖檢測。
- 數(shù)據(jù)庫恢復(fù)設(shè)計?;謴?fù)時間要求?恢復(fù)到的環(huán)境的要求?
在設(shè)計過程中還需要考慮數(shù)據(jù)庫中存儲的數(shù)據(jù)的價值以及對于維護(hù)數(shù)據(jù)庫可用、可靠的投入之間的投入產(chǎn)出比。因?yàn)橐粋€完備的數(shù)據(jù)庫設(shè)計可能成本會非常高。而對于一個小型的網(wǎng)頁應(yīng)用來看,不必要做的很完善。
并且因?yàn)閿?shù)據(jù)庫的備份工作一般情況下還是需要人員參與的,所以也需要制定一套完善的數(shù)據(jù)庫操作規(guī)范。以防止在人為參與的情況下造成數(shù)據(jù)的丟失與不一致。并且需要設(shè)計一套完整的自動化數(shù)據(jù)庫運(yùn)維過程。
備份設(shè)計:
數(shù)據(jù)庫的備份需要從下圖中的幾個方面進(jìn)行考慮。但在每個產(chǎn)品/項(xiàng)目中數(shù)據(jù)庫的使用設(shè)計都是不盡興同的,所以,對數(shù)據(jù)庫的備份方面的設(shè)計還是要與使用設(shè)計相結(jié)合。這里只介紹備份設(shè)計中需要考慮的內(nèi)容。

下面逐層介紹需要注意的內(nèi)容:
- 邏輯結(jié)構(gòu)層:
- 邏輯結(jié)構(gòu)中是否可以進(jìn)行讀寫分離時的部分表的備份,即是否有外鍵關(guān)系,表中的數(shù)據(jù)是否可以進(jìn)行單獨(dú)的導(dǎo)入導(dǎo)出操作。
- 數(shù)據(jù)索引是否與具體的存儲結(jié)構(gòu)和索引方式有關(guān)。如果有關(guān)需要將這些元數(shù)據(jù)一并保存。
- 數(shù)據(jù)庫中的存儲過程,觸發(fā)器是否與表空間、邏輯數(shù)據(jù)庫有關(guān)。
- 數(shù)據(jù)備份時使用鎖表,還是停機(jī)的方式進(jìn)行備份?
- 中間件
- 中間件中的分片策略是否與具體的數(shù)據(jù)庫有關(guān),是否可以在中間上替換數(shù)據(jù)庫實(shí)例?
- 向中間件中新添加數(shù)據(jù)庫實(shí)例時,分片策略是否需要變更?
- 內(nèi)存
- 表數(shù)據(jù)怎樣被加載到內(nèi)存中?
- 是否有內(nèi)存表的創(chuàng)建?內(nèi)存表是否需要進(jìn)行備份?
- 計算
- 計算是在磁盤上的數(shù)據(jù)中進(jìn)行的還是在內(nèi)存上的數(shù)據(jù)中進(jìn)行的?
- 是否有預(yù)處理、預(yù)計算結(jié)果保存表,每次備份重新計算還是直接保存預(yù)計算結(jié)果?
- 裸設(shè)備
- 裸設(shè)備上的數(shù)據(jù)是否有工具可以備份成文件形式?并有工具可以恢復(fù)回去
- 裸設(shè)備導(dǎo)出與導(dǎo)入的速度?
- 自動化
- 盡量的減少人工操作的內(nèi)容,減少因?yàn)槿斯氲腻e誤。
- 規(guī)范流程
- 數(shù)據(jù)遷移工具的使用規(guī)范
- 數(shù)據(jù)備份過程規(guī)范
- 數(shù)據(jù)備份存儲規(guī)范
- 數(shù)據(jù)備份恢復(fù)規(guī)范
參照:
關(guān)于開發(fā)方法可以參照:TDD,ATDD,BDD,DDD,MDSD。