服务器

位置:IT落伍者 >> 服务器 >> 浏览文章

详析邮件服务器邮件存储和日志


发布日期:2023年12月24日
 
详析邮件服务器邮件存储和日志

本文以数据库的基本原理为基础分析了EXCHANGE SERVER的存储系统并说明了各部分的作用

IIS服务和ESE的层次关系

IIS服务是EXCHANGE服务器中重要的服务之一它控制着对邮箱和PF的存储操作请求EXCHANGE服务器的存储实际上是由ESE的数据库引擎来管理的这个ESE引擎是微软专门为保存非关系型数据而开发的目前在微软的很多产品中都有广泛的应用AD数据库DHCPWINSSRS等等

EXCHANGE的数据库是由EDB文件STM文件和LOG文件组成在这些文件里微软使用了B+树的内部数据结构ESE的引擎的任务之一就是当IIS服务请求访问数据库的时候把这些请求转化为对内部数据结构的读写访问B+树的特点是能够对存储在硬盘上的数据提供快速访问能力微软利用B+树作为ESE的后台结构的主要原因就是尽可能的提高访问数据时I/O性能当然这些结构对于EXCHANGE STORE来说是透明的

另外作为一个数据库系统ESE有责任提供事务级别的操作的支持并维护数据库的完整性和一致性对数据库系统而言我们提到事务时一般用ACID来描述事务的特点

AAtomic(原子的)事务必须是全或全无的操作要么全部成功更新要么全部不被更新

CConsistent(一致的)一个成功提交的事务必须使数据库处于一个一致的状态

IIsolated(孤立的)所有未提交的更改都必须能够和其他事务孤立

DDurable(持久的)当事务一旦提交所做的更改必须存储到稳定的介质上防止系统失败导致的数据库不一致(此点非常重要!!)

EXCHANGE /存储系统的新特点

在EXESE的版本为ESE而在EX/ESE版本已经升级ESEESE引起在以下方面得到了改进

* I/O性能进一步提高和优化

* 对日志文件增加了计算校验操作

* 提高了ESEUTIL等工具的维护速度

而IIS也在以下方面有了更新

* 在每个SERVER上提供多个SG支持

* 数据库STM文件格式的引入提高了INTERNET邮件的性能

* WSS的引入用户可以使用多种协议访问数据库

EDB和STM的关系

常有人问EDB文件是数据库那STM文件是做什么用的?可以删除吗?

在EX只有EDB文件因为在EX发布时微软主推的是内部邮件系统因此其主要协议为MAPI这是微软的私有邮件西医EDB文件是专门为此协议优化过的因此在EX为了支持INTERNET邮件必须在每次处理INTERNET邮件时做一个格式转换这显然带来了性能的损失

在EX微软加大了对INTERNET邮件的支持这就是STM文件的来源MAPI格式是RPC和二进制标准的而STM是纯文本加上一些MIME编码格式这样的区别使得它们不可能存储在同一数据库里因此EX微软开始使用EDB和STM两个文件来分别保存两种格式的邮件并且在两个文件之间建立了引用和关联对于用户来说它的邮箱实际上是跨越了EDB和STM文件共同组成的另外需要注意的是EDB文件中还保留着用户的邮箱结构所以EDB文件更加重要那么EDB和STM是怎么协同工作的呢?我们以几个情景来分析之

情景一用户使用OUTLOOK(MAPI)发送接收邮件

在该情景下用户将邮件通过MAPI协议提交给数据库直接被保存EDB文件中当用户通过MAPI访问邮箱里的邮件时如果被访问的邮件在EDB里直接返回如果在STM里(如外来邮件)则执行转换将STM转换为EDB文件格式再返回用户

情景二用户使用标准SMTP/POP/IMAP等协议访问

用户使用非MAPI协议提交的邮件内容保存在STM文件里但是由于EDB里有邮箱结构STM没有因此系统会把邮件的重要信息提取出来放在EDB里当用户用MAPI提取邮件时过程同上当用户通过标准协议访问时同样需要进行格式转换转换为STM文件格式返回 这些转换是在后台发生的对用户来说是透明的通过上面的描述你会看到这两个文件是紧密联系的缺一不可所以在任何时间我们都不要单独操作这两个文件它们是一个整体同时也要注意的是无论用户使用何方式访问邮箱都需要向EDB文件请求邮箱结构信息这是需要注意的

LOG文件的重大作用

在论坛里经常会看到有人说我的硬盘怎么很快就没了一看原来是日志文件搞的鬼于是就有人删除日志文件甚至使用循环日志来强制减少日志甚至有人提出这样的疑问日志到底有什么用?是不是多余的?那我们来看看日志的重大作用

对于一个SG来说系统会产生一系列的日志这些日志的扩展名为LOG前缀一般是EE……除了这些连续的日志文件外还有一些特殊的日志文件(reslogreslogexchk)))它们又有什么用呢?我们的管理员通常不喜欢备份这一操作因此对这些日志是痛恨不已啊那么微软在EXCHANGE数据库系统中引入日志的作用难道真的是多此一举吗?我们从以下几个方面来考察一下日志的作用

作为一个企业级的邮件系统必须要保证数据安全和完整必须能够面对随时可能发生的意外灾难把数据损失降低到最小

必须提供高性能的邮件处理能力对数据库中的邮件的事务操作在完成后必须马上(或是说立即)被记录在存储介质上(见前面的事务持久性说明)

灾难发生后使用数据库备份恢复必须要返回到灾难发生前一刻的数据库状态(这是至关重要的!!)

现在我们来更进一步的看一下当用户要修改邮箱中的内容时被修改的内容首先被提取出来放到内存中实际的修改是发生在内存里的这是众所周知的当修改完成后这些内容必须被尽快写回存储介质这样才表示一个事务成功完成了

从事务的描述中我们可以看到事务是具有原子特性的为了保证数据库的一致和完整事务必须全部成功或全部失败如果事务失败则必须回滚到事务开始的状态而当邮件在内存中修改完成后此时事务并没有完成(为什么呢?)因为一旦系统崩溃这些修改就丢失了所以要确保事务修改完成必须尽快将修改写回到数据库里去(也就是硬盘上)这也是事务的持久性要求注意我们这里说的第一时间或是尽快是一个什么样的概念如果我们直接修改EDB文件由于EDB文件比较大那么在硬盘上修改一个大文件就 需要花费大量的时间在等待和寻找数据存储块上(见操作系统原理)当系统出现高负载的繁忙状态时这将是一个非常大的瓶颈也就无法做到尽快那怎么办呢?所以数据库系统使用了日志而日志通常很小(EXCHANGE的日志只有MB)向这些文件写入修改结果是很快速的因此当内存的修改完成后这些结果就会立即写入日志中以保证了事务的持久性当成功写入日志后该事务就成功完成了(现在在硬盘上了不会因为当机丢失了)接下来ESE引擎会在后台慢慢将这些日志里的修改记录写回真正的数据库里去(这对用户来说已经不是那么重要了)这就是日志的第一个作用确保事务在第一时间(尽可能快的)保存到非易失存储器上(提供了事务持久性支持)

根据上面的藐视我们看到运行中的EXCHANGE数据库是由三个部分组成的

* 内存中已经完成处理还没有写会到日志里的内容(Dirt page)

* 还没有写到数据库文件里的日志内容

* EDB和STM数据库文件

对于第一个部分一旦掉电就回丢失的是最不安全的而对于第二部分的内容系统通过检查点文件(CHK)来标记哪些日志已经被写入数据库了而哪些还没有CHK文件类似一个指针我们可以用ESEUTIL /MK来检查CHK文件里的内容在该命令的输出中的checkpoint:<0x8,26d1,29>这样的东西就是检查点位置它表示Ex的日志的页面序号已经被成功写入数据库了大家可以自己看看

前面提到过EXCHANGE系统在出现灾难时应能恢复到灾难发生前的时刻的状态这是非常重要的但即使是最勤快的管理员也只能在指定的预定时间内做系统备份而不可能时时刻刻的都在备份那么在备份完成后到灾难发生之前的这段数据该如何保护呢?是不是就任由它丢失呢?显然是不可能的那答案是什么呢?就是日志文件前面我们知道任何对数据库的更改都先写入日志里再由日志写入数据库这样我们只要找到日志文件就可以重新进行模拟的操作来完成备份后的数据库文件的更改了我们举个例子来看看

假设我们在凌晨点完成了一次FULLBACKUP备份完成后系统正常运行到下午点的时候系统突然崩溃管理员用凌晨点的数据恢复了数据库那么从凌晨点到下午点这段时间的数据变更就只能依赖于日志了当完成数据库恢复后系统会自动的跟蹤到关联的日志文件如果发现有比当前数据库还新的日志存在系统就会自动的按照日志的顺序将更改写回到数据库中去因此这样一来从凌晨点到下午点的数据变更就被完整的恢复了这就是日志的第二个作用保证系统备份和恢复的完整性当然前提是没有使用循环日志!!(看到了吧使用循环日志的危害是相当大的比起你的数据来说多做几次备份不是没有意义的吧?

说到这里有人可能要问如果数据库和日志同时损坏如何办?答案是尽量避免这样的情况发生首先数据库损坏的几率要大于日志另外微软建议将数据库和日志分别存储在不同的磁盘上要是这样还会同时坏那就没有办法了呵呵对于管理员对日志文件的抱怨合理的解决方法是定期做备份启用循环日志是不正确的做法当启用循环日志后一旦系

上一篇:计划你的服务器

下一篇:windows下cvs服务器端配置