郵件服務器郵件存儲和日志的介紹
本文以數據庫的基本原理為基礎,分析了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……除了這些連續的日志文件外,還有一些特殊的日志文件(res1.log,res2.log,e0x.chk))),它們又有什么用呢?我們的管理員通常不喜歡備份這一操作,因此對這些日志是痛恨不已啊。那么微軟在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。切不可偷懶哦。
【郵件服務器郵件存儲和日志的介紹】相關文章:
電子郵件08-05
生命的郵件散文06-30
發電子郵件09-03
昔日郵件經典散文12-09
寄往天堂虔誠的郵件散文12-04
郵件落款祝福語大全05-27
2018春節郵件祝福語03-25
中秋節郵件祝福語03-18
圣誕節郵件祝福語03-31