我们向客户提供的很多LOB应用程序都具有市场/促销性质(抽奖,事件注册等)。大多数应用程序虽然非常简单,但对数据库要求很高。例如,想象一个“注册”类型的网站作为超级碗期间播出的商业广告的支持,例如(是的,我们有几个)。用于写入沉重的Web应用程序的数据库设计
虽然我们已经非常善于优化我们的网络应用程序代码,但尽管应用程序相对简单,数据库仍然是个问题。流程通常是这样的:
- 阅读从数据库检测现有记录
- 写入数据库,如果记录是新
在许多情况下,这是所有的数据访问我们的应用程序需要执行。但是,鉴于它是应用程序的唯一目的,因此这个简单的过程要大大优化是非常重要的。
就这个问题而言,我们有一台服务器为数据文件运行raid 5磁盘阵列,为日志运行另一个raid 5阵列。此时,操作系统是Windows 2003标准32位,服务器有4 GB的内存。一些应用程序使用SQL 2005标准,而另一些使用MySQL 5.1。我是非常了解某些操作系统和硬件优化在这里是可能的,但我希望首先从软件方面解决我的需求。广泛的性能分析告诉我们,磁盘IO一般是主要瓶颈。尽管大多数读取都是唯一的,并且返回的数据非常少(通常只有一点说明记录是否存在),但我知道缓存并不会有多大帮助,所以我正在考虑跳到内存数据库领域作为实际数据库的写缓存层。鉴于我们大部分的高流量流量本质上是零星的,并且不能持续几个小时,这看起来很合适。另外,在大多数情况下,服务器崩溃导致的几分钟数据可能会丢失。
在最简单的形式,我会修改一个典型的注册应用程序来执行以下操作:
- 查询磁盘数据库和内存数据库现有记录
- 如果没有,写数据到内存数据库和返回
- 定时冲洗内存数据库到磁盘DB
我的问题是:什么是我对这个中间同我的选择mory数据库?我已经尝试过使用内存中的哈希表,数据表等,但我正在寻找其他选项,甚至为完全不同的方法提供建议。
请提供记录的数量和大小的数量级,可能在特定活动之前和之后(即包括活动期间额外记录计数收集的粗略想法)区分计数 – mjv 2009-11-04 16:52:03
在典型的应用程序支持通过电视广告或电台等高交通量的司机,我们可能会在现场后的15-30分钟内看到大约20万次登记尝试。这大部分通常在现场后的3-5分钟内完成,因此存在争用问题。纯粹的卷不是问题,这是问题的并发性。我们有史以来最大的单一短期应用程序数据库在2个月内接近1000万条记录,其中大部分流量来自电视广告和电子邮件活动。 – Chris 2009-11-04 16:58:37
另一种选择是将UPSERT逻辑封装在存储过程中,这将为您节省数据库行程(及相关开销)。 – 2009-11-04 17:02:26