- 相關(guān)推薦
詳析郵件服務(wù)器郵件存儲(chǔ)和日志
本文以數(shù)據(jù)庫(kù)的基本原理為基礎(chǔ),分析了EXCHANGE SERVER的存儲(chǔ)系統(tǒng),并說(shuō)明了各部分的作用。一、IS服務(wù)和ESE的層次關(guān)系
IS服務(wù)是EXCHANGE服務(wù)器中重要的服務(wù)之一,它控制著對(duì)郵箱和PF的存儲(chǔ)操作請(qǐng)求,EXCHANGE服務(wù)器的存儲(chǔ)實(shí)際上是由ESE的數(shù)據(jù)庫(kù)引擎來(lái)管理的。這個(gè)ESE引擎是微軟專(zhuān)門(mén)為保存非關(guān)系型數(shù)據(jù)而開(kāi)發(fā)的,目前在微軟的很多產(chǎn)品中都有廣泛的應(yīng)用,如:AD數(shù)據(jù)庫(kù)、DHCP、WINS、SRS等等。
EXCHANGE的數(shù)據(jù)庫(kù)是由EDB文件、STM文件和LOG文件組成。在這些文件里,微軟使用了“B+樹(shù)”的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。ESE的引擎的任務(wù)之一,就是當(dāng)IS服務(wù)請(qǐng)求訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,把這些請(qǐng)求轉(zhuǎn)化為對(duì)內(nèi)部數(shù)據(jù)結(jié)構(gòu)的讀寫(xiě)訪問(wèn)。B+樹(shù)的特點(diǎn)是能夠?qū)Υ鎯?chǔ)在硬盤(pán)上的數(shù)據(jù)提供快速訪問(wèn)能力。微軟利用“B+樹(shù)”作為ESE的后臺(tái)結(jié)構(gòu)的主要原因,就是盡可能的提高訪問(wèn)數(shù)據(jù)時(shí)I/O性能。當(dāng)然,這些結(jié)構(gòu)對(duì)于EXCHANGE STORE來(lái)說(shuō)是透明的。
另外,作為一個(gè)數(shù)據(jù)庫(kù)系統(tǒng),ESE有責(zé)任提供事務(wù)級(jí)別的操作的支持,并維護(hù)數(shù)據(jù)庫(kù)的完整性和一致性。對(duì)數(shù)據(jù)庫(kù)系統(tǒng)而言,我們提到事務(wù)時(shí),一般用ACID來(lái)描述事務(wù)的特點(diǎn)。
A--Atomic(原子的):事務(wù)必須是全或全無(wú)的操作,要么全部成功更新,要么全部不被更新
C--Consistent(一致的):一個(gè)成功提交的事務(wù)必須使數(shù)據(jù)庫(kù)處于一個(gè)一致的狀態(tài)。
I--Isolated(孤立的):所有未提交的更改都必須能夠和其他事務(wù)孤立。
D--Durable(持久的):當(dāng)事務(wù)一旦提交,所做的更改必須存儲(chǔ)到穩(wěn)定的介質(zhì)上,防止系統(tǒng)失敗導(dǎo)致的數(shù)據(jù)庫(kù)不一致。(此點(diǎn)非常重要!。
二、EXCHANGE 2000/2003存儲(chǔ)系統(tǒng)的新特點(diǎn)
在EX5.5中,ESE的版本為ESE97,而在EX2000/2003里,ESE版本已經(jīng)升級(jí)ESE98了。ESE引起在以下方面得到了改進(jìn):
* I/O性能進(jìn)一步提高和優(yōu)化
* 對(duì)日志文件增加了計(jì)算校驗(yàn)操作
* 提高了ESEUTIL等工具的維護(hù)速度
而IS也在以下方面有了更新:
* 在每個(gè)SERVER上提供多個(gè)SG支持
* 數(shù)據(jù)庫(kù)STM文件格式的引入,提高了INTERNET郵件的性能
* WSS的引入,用戶可以使用多種協(xié)議訪問(wèn)數(shù)據(jù)庫(kù)
三、EDB和STM的關(guān)系
常有人問(wèn),EDB文件是數(shù)據(jù)庫(kù),那STM文件是做什么用的?可以刪除嗎?
在EX5.5里,只有EDB文件,因?yàn)樵贓X5.5發(fā)布時(shí),微軟主推的是內(nèi)部郵件系統(tǒng),因此其主要協(xié)議為MAPI,這是微軟的私有郵件西醫(yī),EDB文件是專(zhuān)門(mén)為此協(xié)議優(yōu)化過(guò)的。因此在EX5.5中,為了支持INTERNET郵件,必須在每次處理INTERNET郵件時(shí),做一個(gè)格式轉(zhuǎn)換。這顯然帶來(lái)了性能的損失。
在EX2000里,微軟加大了對(duì)INTERNET郵件的支持,這就是STM文件的來(lái)源。MAPI格式是RPC和二進(jìn)制標(biāo)準(zhǔn)的,而STM是純文本加上一些MIME編碼格式,這樣的區(qū)別使得它們不可能存儲(chǔ)在同一數(shù)據(jù)庫(kù)里。因此EX2000中,微軟開(kāi)始使用EDB和STM兩個(gè)文件來(lái)分別保存兩種格式的郵件。并且在兩個(gè)文件之間建立了引用和關(guān)聯(lián)。對(duì)于用戶來(lái)說(shuō),它的郵箱實(shí)際上是跨越了EDB和STM文件共同組成的。另外,需要注意的是,EDB文件中還保留著用戶的郵箱結(jié)構(gòu)。所以EDB文件更加重要。那么EDB和STM是怎么協(xié)同工作的呢?我們以幾個(gè)情景來(lái)分析之。
情景一:用戶使用OUTLOOK(MAPI)發(fā)送接收郵件
在該情景下,用戶將郵件通過(guò)MAPI協(xié)議提交給數(shù)據(jù)庫(kù),直接被保存EDB文件中。當(dāng)用戶通過(guò)MAPI訪問(wèn)郵箱里的郵件時(shí),如果被訪問(wèn)的郵件在EDB里,直接返回,如果在STM里(如外來(lái)郵件),則執(zhí)行轉(zhuǎn)換,將STM轉(zhuǎn)換為EDB文件格式,再返回用戶。
情景二:用戶使用標(biāo)準(zhǔn)SMTP/POP3/IMAP4等協(xié)議訪問(wèn)
用戶使用非MAPI協(xié)議提交的郵件,內(nèi)容保存在STM文件里,但是由于EDB里有郵箱結(jié)構(gòu),STM沒(méi)有,因此系統(tǒng)會(huì)把郵件的重要信息提取出來(lái),放在EDB里。當(dāng)用戶用MAPI提取郵件時(shí),過(guò)程同上,當(dāng)用戶通過(guò)標(biāo)準(zhǔn)協(xié)議訪問(wèn)時(shí),同樣需要進(jìn)行格式轉(zhuǎn)換,轉(zhuǎn)換為STM文件格式返回。 這些轉(zhuǎn)換是在后臺(tái)發(fā)生的。對(duì)用戶來(lái)說(shuō)是透明的。通過(guò)上面的描述,你會(huì)看到,這兩個(gè)文件是緊密聯(lián)系的缺一不可。所以,在任何時(shí)間我們都不要單獨(dú)操作這兩個(gè)文件,它們是一個(gè)整體。同時(shí)也要注意的是,無(wú)論用戶使用何方式訪問(wèn)郵箱,都需要向EDB文件請(qǐng)求郵箱結(jié)構(gòu)信息,這是需要注意的。
四、LOG文件的重大作用
在論壇里經(jīng)常會(huì)看到有人說(shuō)我的硬盤(pán)怎么很快就沒(méi)了,一看原來(lái)是日志文件搞的鬼,于是就有人刪除日志文件,甚至使用循環(huán)日志來(lái)強(qiáng)制減少日志,甚至有人提出這樣的疑問(wèn),日志到底有什么用?是不是多余的?那我們來(lái)看看日志的重大作用。
對(duì)于一個(gè)SG來(lái)說(shuō),系統(tǒng)會(huì)產(chǎn)生一系列的日志,這些日志的擴(kuò)展名為L(zhǎng)OG,前綴一般是E00、E01……除了這些連續(xù)的日志文件外,還有一些特殊的日志文件(res1.log,res2.log,e0x.chk))),它們又有什么用呢?我們的管理員通常不喜歡備份這一操作,因此對(duì)這些日志是痛恨不已啊。那么微軟在EXCHANGE數(shù)據(jù)庫(kù)系統(tǒng)中引入日志的作用難道真的是多此一舉嗎?我們從以下幾個(gè)方面來(lái)考察一下日志的作用:
1、作為一個(gè)企業(yè)級(jí)的郵件系統(tǒng),必須要保證數(shù)據(jù)安全和完整。必須能夠面對(duì)隨時(shí)可能發(fā)生的意外災(zāi)難,把數(shù)據(jù)損失降低到最小。
2、必須提供高性能的郵件處理能力,對(duì)數(shù)據(jù)庫(kù)中的郵件的事務(wù)操作在完成后必須馬上(或是說(shuō)立即)被記錄在存儲(chǔ)介質(zhì)上(見(jiàn)前面的事務(wù)持久性說(shuō)明)
3、災(zāi)難發(fā)生后,使用數(shù)據(jù)庫(kù)備份恢復(fù)必須要返回到災(zāi)難發(fā)生前一刻的數(shù)據(jù)庫(kù)狀態(tài)(這是至關(guān)重要的。。
現(xiàn)在我們來(lái)更進(jìn)一步的看一下,當(dāng)用戶要修改郵箱中的內(nèi)容時(shí),被修改的內(nèi)容首先被提取出來(lái)放到內(nèi)存中,實(shí)際的修改是發(fā)生在內(nèi)存里的,這是眾所周知的,當(dāng)修改完成后,這些內(nèi)容必須被盡快寫(xiě)回存儲(chǔ)介質(zhì),這樣才表示一個(gè)事務(wù)成功完成了。
從事務(wù)的描述中我們可以看到,事務(wù)是具有原子特性的,為了保證數(shù)據(jù)庫(kù)的一致和完整,事務(wù)必須全部成功或全部失敗,如果事務(wù)失敗,則必須回滾到事務(wù)開(kāi)始的狀態(tài)。而當(dāng)郵件在內(nèi)存中修改完成后,此時(shí)事務(wù)并沒(méi)有完成(為什么呢?)因?yàn)橐坏┫到y(tǒng)崩潰,這些修改就丟失了。所以要確保事務(wù)修改完成,必須盡快將修改寫(xiě)回到數(shù)據(jù)庫(kù)里去(也就是硬盤(pán)上)。這也是事務(wù)的持久性要求。注意,我們這里說(shuō)的第一時(shí)間或是盡快,是一個(gè)什么樣的概念。如果我們直接修改EDB文件,由于EDB
文件比較大,那么在硬盤(pán)上修改一個(gè)大文件,就 需要花費(fèi)大量的時(shí)間在等待和尋找數(shù)據(jù)存儲(chǔ)塊上(見(jiàn)操作系統(tǒng)原理),當(dāng)系統(tǒng)出現(xiàn)高負(fù)載的繁忙狀態(tài)時(shí),這將是一個(gè)非常大的瓶頸。也就無(wú)法做到“盡快”了。那怎么辦呢?所以數(shù)據(jù)庫(kù)系統(tǒng)使用了日志,而日志通常很。‥XCHANGE的日志只有5MB),向這些文件寫(xiě)入修改結(jié)果是很快速的,因此當(dāng)內(nèi)存的修改完成后,這些結(jié)果就會(huì)立即寫(xiě)入日志中,以保證了事務(wù)的持久性。當(dāng)成功寫(xiě)入日志后,該事務(wù)就成功完成了(現(xiàn)在在硬盤(pán)上了,不會(huì)因?yàn)楫?dāng)機(jī)丟失了)接下來(lái),ESE引擎會(huì)在后臺(tái)慢慢將這些日志里的修改記錄寫(xiě)回真正的數(shù)據(jù)庫(kù)里去(這對(duì)用戶來(lái)說(shuō)已經(jīng)不是那么重要了),這就是日志的第一個(gè)作用:確保事務(wù)在第一時(shí)間(盡可能快的)保存到非易失存儲(chǔ)器上(提供了事務(wù)持久性支持)。
根據(jù)上面的藐視,我們看到運(yùn)行中的EXCHANGE數(shù)據(jù)庫(kù),是由三個(gè)部分組成的:
* 內(nèi)存中已經(jīng)完成處理還沒(méi)有寫(xiě)會(huì)到日志里的內(nèi)容(Dirt page)
* 還沒(méi)有寫(xiě)到數(shù)據(jù)庫(kù)文件里的日志內(nèi)容
* EDB和STM數(shù)據(jù)庫(kù)文件
對(duì)于第一個(gè)部分,一旦掉電就回丟失的,是最不安全的。而對(duì)于第二部分的內(nèi)容,系統(tǒng)通過(guò)檢查點(diǎn)文件(CHK)來(lái)標(biāo)記哪些日志已經(jīng)被寫(xiě)入數(shù)據(jù)庫(kù)了,而哪些還沒(méi)有。CHK文件類(lèi)似一個(gè)指針。我們可以用“ESEUTIL /MK”來(lái)檢查CHK文件里的內(nèi)容,在該命令的輸出中的checkpoint:<0x8,26d1,29>這樣的東西就是檢查點(diǎn)位置,它表示E0x00008的日志的頁(yè)面序號(hào)已經(jīng)被成功寫(xiě)入數(shù)據(jù)庫(kù)了。大家可以自己看看。。:)
前面提到過(guò),EXCHANGE系統(tǒng)在出現(xiàn)災(zāi)難時(shí),應(yīng)能恢復(fù)到災(zāi)難發(fā)生前的時(shí)刻的狀態(tài)。這是非常重要的。但即使是最勤快的管理員,也只能在指定的預(yù)定時(shí)間內(nèi)做系統(tǒng)備份,而不可能時(shí)時(shí)刻刻的都在備份。那么在備份完成后到災(zāi)難發(fā)生之前的這段數(shù)據(jù)該如何保護(hù)呢?是不是就任由它丟失呢?顯然是不可能的。那答案是什么呢?就是日志文件。前面我們知道,任何對(duì)數(shù)據(jù)庫(kù)的更改都先寫(xiě)入日志里,再由日志寫(xiě)入數(shù)據(jù)庫(kù),這樣我們只要找到日志文件,就可以重新進(jìn)行模擬的操作來(lái)完成備份后的數(shù)據(jù)庫(kù)文件的更改了,我們舉個(gè)例子來(lái)看看:
假設(shè)我們?cè)诹璩?點(diǎn)完成了一次FULLBACKUP,備份完成后,系統(tǒng)正常運(yùn)行,到下午4點(diǎn)的時(shí)候,系統(tǒng)突然崩潰。管理員用凌晨3點(diǎn)的數(shù)據(jù)恢復(fù)了數(shù)據(jù)庫(kù),那么從凌晨3點(diǎn)到下午4點(diǎn)這段時(shí)間的數(shù)據(jù)變更,就只能依賴(lài)于日志了。當(dāng)完成數(shù)據(jù)庫(kù)恢復(fù)后,系統(tǒng)會(huì)自動(dòng)的跟蹤到關(guān)聯(lián)的日志文件,如果發(fā)現(xiàn)有比當(dāng)前數(shù)據(jù)庫(kù)還新的日志存在,系統(tǒng)就會(huì)自動(dòng)的按照日志的順序?qū)⒏膶?xiě)回到數(shù)據(jù)庫(kù)中去。因此這樣一來(lái),從凌晨3點(diǎn)到下午4點(diǎn)的數(shù)據(jù)變更就被完整的恢復(fù)了。這就是日志的第二個(gè)作用:保證系統(tǒng)備份和恢復(fù)的完整性。當(dāng)然前提是沒(méi)有使用循環(huán)日志。。ǹ吹搅税,使用循環(huán)日志的危害是相當(dāng)大的,比起你的數(shù)據(jù)來(lái)說(shuō),多做幾次備份不是沒(méi)有意義的吧?
說(shuō)到這里,有人可能要問(wèn),如果數(shù)據(jù)庫(kù)和日志同時(shí)損壞,如何辦?答案是:盡量避免這樣的情況發(fā)生。首先數(shù)據(jù)庫(kù)損壞的幾率要大于日志,另外,微軟建議將數(shù)據(jù)庫(kù)和日志分別存儲(chǔ)在不同的磁盤(pán)上,要是這樣還會(huì)同時(shí)壞,那就沒(méi)有辦法了,呵呵。。對(duì)于管理員對(duì)日志文件的抱怨,合理的解決方法是定期做備份。啟用循環(huán)日志是不正確的做法,當(dāng)啟用循環(huán)日志后,一旦系統(tǒng)發(fā)生災(zāi)難恢復(fù),將有可能不能將系統(tǒng)恢復(fù)到災(zāi)難發(fā)生時(shí)的狀態(tài),磁盤(pán)和數(shù)據(jù)誰(shuí)更重要,管理員自己要考慮考慮了。
五、ESE與IS服務(wù)的啟動(dòng)和關(guān)閉
ESE引擎在加載數(shù)據(jù)庫(kù)文件時(shí),會(huì)去檢查數(shù)據(jù)庫(kù)文件的標(biāo)志。這個(gè)標(biāo)志保留了上次關(guān)閉數(shù)據(jù)庫(kù)的狀態(tài),當(dāng)狀態(tài)為正常關(guān)閉說(shuō),系統(tǒng)將直接加載該數(shù)據(jù)庫(kù),當(dāng)數(shù)據(jù)庫(kù)標(biāo)志為非正常關(guān)閉時(shí),系統(tǒng)將先進(jìn)行一個(gè)軟恢復(fù)過(guò)程(你可以在事件里看到它),然后再加載。
那么,正常關(guān)閉和非正常關(guān)閉有什么區(qū)別呢?一個(gè)正常關(guān)閉的數(shù)據(jù)庫(kù),表示所有的日志信息都已經(jīng)正確的寫(xiě)入數(shù)據(jù)庫(kù)了。反之一個(gè)非正常關(guān)閉的數(shù)據(jù)庫(kù),則表示至少有一部分?jǐn)?shù)據(jù)未能正確的從日志寫(xiě)入數(shù)據(jù)庫(kù)。要注意的是,非正常關(guān)閉的數(shù)據(jù)庫(kù)并不等于已經(jīng)被破壞的數(shù)據(jù)庫(kù)。只表示有數(shù)據(jù)沒(méi)有提交到數(shù)據(jù)庫(kù)文件。
使用ESEUTIL/MH命令可以看到數(shù)據(jù)庫(kù)的該狀態(tài),其中的STATE字段標(biāo)記的就是這個(gè)狀態(tài),“CLEANSHUTDOWN”表示數(shù)據(jù)庫(kù)正常關(guān)閉。當(dāng)系統(tǒng)加載處于非正常關(guān)閉的數(shù)據(jù)庫(kù)時(shí),就會(huì)根據(jù)檢查點(diǎn)文件確定日志文件的位置,并做重放操作。當(dāng)檢查點(diǎn)文件丟失或損壞時(shí),系統(tǒng)將從最早的日志文件開(kāi)始處理。有的時(shí)候,系統(tǒng)不能自動(dòng)的修復(fù)數(shù)據(jù)庫(kù),這時(shí)我們也可以用“ESEUTIL /R”命令手工的恢復(fù)處于非正常關(guān)閉狀態(tài)的數(shù)據(jù)庫(kù)。強(qiáng)烈推薦在系統(tǒng)異常關(guān)閉后執(zhí)行此命令。在執(zhí)行前最好前確定數(shù)據(jù)庫(kù)文件的狀態(tài)確實(shí)為非正常關(guān)閉,不要對(duì)正常關(guān)閉的數(shù)據(jù)庫(kù)執(zhí)行該恢復(fù)命令!
由此可見(jiàn),EXCHANGE系統(tǒng)對(duì)數(shù)據(jù)庫(kù)有自我修復(fù)能力,能確保系統(tǒng)在發(fā)生意外后恢復(fù)正確的狀態(tài)。但這并不是說(shuō)我們可以隨意的關(guān)閉系統(tǒng),仍要UPS等必要的保護(hù)措施。
六、關(guān)于M盤(pán)
在EX2000里,有一個(gè)M盤(pán)的映射。這個(gè)映射只是提供開(kāi)發(fā)人員通過(guò)API訪問(wèn)郵箱和郵件用的。因此對(duì)M盤(pán)的手工操作都可能帶來(lái)數(shù)據(jù)庫(kù)的破壞,請(qǐng)注意,另外,有一種觀點(diǎn)認(rèn)為備份了M盤(pán)就備份了郵件,這是絕對(duì)錯(cuò)誤的。M盤(pán)雖然是數(shù)據(jù)庫(kù)的映射,但已經(jīng)去掉了很多的關(guān)聯(lián)和內(nèi)在聯(lián)系。因此備份M盤(pán)是不能恢復(fù)數(shù)據(jù)庫(kù)的。所有的EXCHANGE管理員必須按規(guī)定認(rèn)真的備份系統(tǒng)狀態(tài)和SG。切不可偷懶哦。
看了上面的描述,你還認(rèn)為日志文件是多余的嗎?EXCHANGE管理員,趕快取消循環(huán)日志,建立健全備份制度吧,為了你的前途,學(xué)會(huì)備份操作吧。
【詳析郵件服務(wù)器郵件存儲(chǔ)和日志】相關(guān)文章:
郵件個(gè)性簽名08-17
英語(yǔ)郵件作文01-14
如何制作郵件簡(jiǎn)歷08-15
《電子郵件》說(shuō)課稿08-08
郵件祝福語(yǔ)08-23
郵件自我介紹12-06
電子郵件作文04-26
淺析電子郵件營(yíng)銷(xiāo)08-05
淺析電子郵件營(yíng)銷(xiāo)08-05