日誌

當前位置 /首頁/語文基礎/日誌/列表

郵件伺服器郵件儲存和日誌的介紹

本文以資料庫的基本原理為基礎,分析了EXCHANGE SERVER的儲存系統,並說明了各部分的作用。

郵件伺服器郵件儲存和日誌的介紹

一、IS服務和ESE的層次關係

IS服務是EXCHANGE伺服器中重要的服務之一,它控制著對郵箱和PF的儲存操作請求,EXCHANGE伺服器的儲存實際上是由ESE的資料庫引擎來管理的。這個ESE引擎是微軟專門為儲存非關係型資料而開發的,目前在微軟的很多產品中都有廣泛的應用,如:AD資料庫、DHCP、WINS、SRS等等。

EXCHANGE的資料庫是由EDB檔案、STM檔案和LOG檔案組成。在這些檔案裡,微軟使用了“B+樹”的內部資料結構。ESE的引擎的任務之一,就是當IS服務請求訪問資料庫的時候,把這些請求轉化為對內部資料結構的讀寫訪問。B+樹的特點是能夠對儲存在硬碟上的資料提供快速訪問能力。微軟利用“B+樹”作為ESE的後臺結構的主要原因,就是儘可能的提高訪問資料時I/O效能。當然,這些結構對於EXCHANGE STORE來說是透明的。

另外,作為一個數據庫系統,ESE有責任提供事務級別的操作的支援,並維護資料庫的完整性和一致性。對資料庫系統而言,我們提到事務時,一般用ACID來描述事務的特點。

A--Atomic(原子的):事務必須是全或全無的操作,要麼全部成功更新,要麼全部不被更新

C--Consistent(一致的):一個成功提交的事務必須使資料庫處於一個一致的狀態。

I--Isolated(孤立的):所有未提交的更改都必須能夠和其他事務孤立。

D--Durable(持久的):當事務一旦提交,所做的更改必須儲存到穩定的介質上,防止系統失敗導致的資料庫不一致。(此點非常重要!!)

二、EXCHANGE 2000/2003儲存系統的新特點

在EX5.5中,ESE的版本為ESE97,而在EX2000/2003裡,ESE版本已經升級ESE98了。ESE引起在以下方面得到了改進:

* I/O效能進一步提高和優化

* 對日誌檔案增加了計算校驗操作

* 提高了ESEUTIL等工具的維護速度

而IS也在以下方面有了更新:

* 在每個SERVER上提供多個SG支援

* 資料庫STM檔案格式的引入,提高了INTERNET郵件的效能

* WSS的引入,使用者可以使用多種協議訪問資料庫

三、EDB和STM的關係

常有人問,EDB檔案是資料庫,那STM檔案是做什麼用的?可以刪除嗎?

在EX5.5裡,只有EDB檔案,因為在EX5.5釋出時,微軟主推的是內部郵件系統,因此其主要協議為MAPI,這是微軟的私有郵件西醫,EDB檔案是專門為此協議優化過的。因此在EX5.5中,為了支援INTERNET郵件,必須在每次處理INTERNET郵件時,做一個格式轉換。這顯然帶來了效能的損失。

在EX2000裡,微軟加大了對INTERNET郵件的支援,這就是STM檔案的來源。MAPI格式是RPC和二進位制標準的,而STM是純文字加上一些MIME編碼格式,這樣的區別使得它們不可能儲存在同一資料庫裡。因此EX2000中,微軟開始使用EDB和STM兩個檔案來分別儲存兩種格式的郵件。並且在兩個檔案之間建立了引用和關聯。對於使用者來說,它的郵箱實際上是跨越了EDB和STM檔案共同組成的。另外,需要注意的是,EDB檔案中還保留著使用者的郵箱結構。所以EDB檔案更加重要。那麼EDB和STM是怎麼協同工作的呢?我們以幾個情景來分析之。

情景一:使用者使用OUTLOOK(MAPI)傳送接收郵件

在該情景下,使用者將郵件通過MAPI協議提交給資料庫,直接被儲存EDB檔案中。當用戶通過MAPI訪問郵箱裡的郵件時,如果被訪問的郵件在EDB裡,直接返回,如果在STM裡(如外來郵件),則執行轉換,將STM轉換為EDB檔案格式,再返回使用者。

情景二:使用者使用標準SMTP/POP3/IMAP4等協議訪問

使用者使用非MAPI協議提交的郵件,內容儲存在STM檔案裡,但是由於EDB裡有郵箱結構,STM沒有,因此係統會把郵件的重要資訊提取出來,放在EDB裡。當用戶用MAPI提取郵件時,過程同上,當用戶通過標準協議訪問時,同樣需要進行格式轉換,轉換為STM檔案格式返回。 這些轉換是在後臺發生的。對使用者來說是透明的。通過上面的描述,你會看到,這兩個檔案是緊密聯絡的缺一不可。所以,在任何時間我們都不要單獨操作這兩個檔案,它們是一個整體。同時也要注意的是,無論使用者使用何方式訪問郵箱,都需要向EDB檔案請求郵箱結構資訊,這是需要注意的。

四、LOG檔案的重大作用

在論壇裡經常會看到有人說我的硬碟怎麼很快就沒了,一看原來是日誌檔案搞的鬼,於是就有人刪除日誌檔案,甚至使用迴圈日誌來強制減少日誌,甚至有人提出這樣的疑問,日誌到底有什麼用?是不是多餘的?那我們來看看日誌的重大作用。

對於一個SG來說,系統會產生一系列的日誌,這些日誌的副檔名為LOG,字首一般是E00、E01……除了這些連續的日誌檔案外,還有一些特殊的日誌檔案(,,))),它們又有什麼用呢?我們的管理員通常不喜歡備份這一操作,因此對這些日誌是痛恨不已啊。那麼微軟在EXCHANGE資料庫系統中引入日誌的作用難道真的是多此一舉嗎?我們從以下幾個方面來考察一下日誌的作用:

1、作為一個企業級的郵件系統,必須要保證資料安全和完整。必須能夠面對隨時可能發生的意外災難,把資料損失降低到最小。

2、必須提供高效能的郵件處理能力,對資料庫中的郵件的事務操作在完成後必須馬上(或是說立即)被記錄在儲存介質上(見前面的事務永續性說明)

3、災難發生後,使用資料庫備份恢復必須要返回到災難發生前一刻的資料庫狀態(這是至關重要的!!)

現在我們來更進一步的看一下,當用戶要修改郵箱中的內容時,被修改的內容首先被提取出來放到記憶體中,實際的修改是發生在記憶體裡的,這是眾所周知的,當修改完成後,這些內容必須被儘快寫回儲存介質,這樣才表示一個事務成功完成了。

從事務的描述中我們可以看到,事務是具有原子特性的,為了保證資料庫的一致和完整,事務必須全部成功或全部失敗,如果事務失敗,則必須回滾到事務開始的狀態。而當郵件在記憶體中修改完成後,此時事務並沒有完成(為什麼呢?)因為一旦系統崩潰,這些修改就丟失了。所以要確保事務修改完成,必須儘快將修改寫回到資料庫裡去(也就是硬碟上)。這也是事務的永續性要求。注意,我們這裡說的第一時間或是儘快,是一個什麼樣的概念。如果我們直接修改EDB檔案,由於EDB

檔案比較大,那麼在硬碟上修改一個大檔案,就 需要花費大量的時間在等待和尋找資料儲存塊上(見作業系統原理),當系統出現高負載的繁忙狀態時,這將是一個非常大的瓶頸。也就無法做到“儘快”了。那怎麼辦呢?所以資料庫系統使用了日誌,而日誌通常很小(EXCHANGE的日誌只有5MB),向這些檔案寫入修改結果是很快速的,因此當記憶體的修改完成後,這些結果就會立即寫入日誌中,以保證了事務的永續性。當成功寫入日誌後,該事務就成功完成了(現在在硬碟上了,不會因為當機丟失了)接下來,ESE引擎會在後臺慢慢將這些日誌裡的修改記錄寫回真正的資料庫裡去(這對使用者來說已經不是那麼重要了),這就是日誌的第一個作用:確保事務在第一時間(儘可能快的)儲存到非易失儲存器上(提供了事務永續性支援)。

根據上面的藐視,我們看到執行中的EXCHANGE資料庫,是由三個部分組成的:

* 記憶體中已經完成處理還沒有寫會到日誌裡的內容(Dirt page)

* 還沒有寫到資料庫檔案裡的日誌內容

* EDB和STM資料庫檔案

對於第一個部分,一旦掉電就回丟失的,是最不安全的。而對於第二部分的內容,系統通過檢查點檔案(CHK)來標記哪些日誌已經被寫入資料庫了,而哪些還沒有。CHK檔案類似一個指標。我們可以用“ESEUTIL /MK”來檢查CHK檔案裡的內容,在該命令的輸出中的checkpoint:<0x8,26d1,29>這樣的東西就是檢查點位置,它表示E0x00008的日誌的.頁面序號已經被成功寫入資料庫了。大家可以自己看看。。:)

前面提到過,EXCHANGE系統在出現災難時,應能恢復到災難發生前的時刻的狀態。這是非常重要的。但即使是最勤快的管理員,也只能在指定的預定時間內做系統備份,而不可能時時刻刻的都在備份。那麼在備份完成後到災難發生之前的這段資料該如何保護呢?是不是就任由它丟失呢?顯然是不可能的。那答案是什麼呢?就是日誌檔案。前面我們知道,任何對資料庫的更改都先寫入日誌裡,再由日誌寫入資料庫,這樣我們只要找到日誌檔案,就可以重新進行模擬的操作來完成備份後的資料庫檔案的更改了,我們舉個例子來看看:

假設我們在凌晨3點完成了一次FULLBACKUP,備份完成後,系統正常執行,到下午4點的時候,系統突然崩潰。管理員用凌晨3點的資料恢復了資料庫,那麼從凌晨3點到下午4點這段時間的資料變更,就只能依賴於日誌了。當完成資料庫恢復後,系統會自動的跟蹤到關聯的日誌檔案,如果發現有比當前資料庫還新的日誌存在,系統就會自動的按照日誌的順序將更改寫回到資料庫中去。因此這樣一來,從凌晨3點到下午4點的資料變更就被完整的恢復了。這就是日誌的第二個作用:保證系統備份和恢復的完整性。當然前提是沒有使用迴圈日誌!!(看到了吧,使用迴圈日誌的危害是相當大的,比起你的資料來說,多做幾次備份不是沒有意義的吧?

說到這裡,有人可能要問,如果資料庫和日誌同時損壞,如何辦?答案是:儘量避免這樣的情況發生。首先資料庫損壞的機率要大於日誌,另外,微軟建議將資料庫和日誌分別儲存在不同的磁碟上,要是這樣還會同時壞,那就沒有辦法了,呵呵。。對於管理員對日誌檔案的抱怨,合理的解決方法是定期做備份。啟用迴圈日誌是不正確的做法,當啟用迴圈日誌後,一旦系統發生災難恢復,將有可能不能將系統恢復到災難發生時的狀態,磁碟和資料誰更重要,管理員自己要考慮考慮了。

五、ESE與IS服務的啟動和關閉

ESE引擎在載入資料庫檔案時,會去檢查資料庫檔案的標誌。這個標誌保留了上次關閉資料庫的狀態,當狀態為正常關閉說,系統將直接載入該資料庫,當資料庫標誌為非正常關閉時,系統將先進行一個軟恢復過程(你可以在事件裡看到它),然後再載入。

那麼,正常關閉和非正常關閉有什麼區別呢?一個正常關閉的資料庫,表示所有的日誌資訊都已經正確的寫入資料庫了。反之一個非正常關閉的資料庫,則表示至少有一部分資料未能正確的從日誌寫入資料庫。要注意的是,非正常關閉的資料庫並不等於已經被破壞的資料庫。只表示有資料沒有提交到資料庫檔案。

使用ESEUTIL/MH命令可以看到資料庫的該狀態,其中的STATE欄位標記的就是這個狀態,“CLEANSHUTDOWN”表示資料庫正常關閉。當系統載入處於非正常關閉的資料庫時,就會根據檢查點檔案確定日誌檔案的位置,並做重放操作。當檢查點檔案丟失或損壞時,系統將從最早的日誌檔案開始處理。有的時候,系統不能自動的修復資料庫,這時我們也可以用“ESEUTIL /R”命令手工的恢復處於非正常關閉狀態的資料庫。強烈推薦在系統異常關閉後執行此命令。在執行前最好前確定資料庫檔案的狀態確實為非正常關閉,不要對正常關閉的資料庫執行該恢復命令!

由此可見,EXCHANGE系統對資料庫有自我修復能力,能確保系統在發生意外後恢復正確的狀態。但這並不是說我們可以隨意的關閉系統,仍要UPS等必要的保護措施。

六、關於M盤

在EX2000裡,有一個M盤的對映。這個對映只是提供開發人員通過API訪問郵箱和郵件用的。因此對M盤的手工操作都可能帶來資料庫的破壞,請注意,另外,有一種觀點認為備份了M盤就備份了郵件,這是絕對錯誤的。M盤雖然是資料庫的對映,但已經去掉了很多的關聯和內在聯絡。因此備份M盤是不能恢復資料庫的。所有的EXCHANGE管理員必須按規定認真的備份系統狀態和SG。切不可偷懶哦。