我们为客户提供的许多LOB应用程序具有营销/促销性质(抽奖活动,活动注册等)。大多数应用程序虽然非常简单,但对数据库要求很高。想象一下,一个“注册”类型的网站作为在超级碗中播放的商业广告的支持,例如(是的,我们有几个)。
虽然我们已经非常擅长优化我们的网络应用程序代码,但数据库始终是一个问题,尽管应用程序相对简单。流程通常类似于:
在许多情况下,这是我们的应用程序需要执行的所有数据访问。但是,鉴于它是应用程序的唯一目的,因此对这个简单的过程进行大量优化非常重要。
出于这个问题的目的,我们有一台服务器为数据文件运行raid 5磁盘阵列,为日志运行另一个raid 5阵列。此时,操作系统是Windows 2003标准32位,服务器有4 GB内存。一些应用程序使用SQL 2005标准,而其他应用程序使用MySQL 5.1我非常清楚这里可以进行某些操作系统和硬件优化,但我希望首先从软件方面解决我的需求。广泛的分析告诉我们磁盘IO通常是主要的瓶颈。
说了这么多,并且知道缓存不会有多大帮助,因为大多数读取都是唯一的并返回非常少的数据(通常只是指示记录是否存在),我正在考虑进入内存数据库领域作为真实数据库的写缓存层。这似乎是一个很好的选择,因为我们的大部分高流量流量本质上是零星的,并且不会持续数小时。此外,在大多数情况下,由于服务器崩溃可能会丢失几分钟的数据。
在最简单的形式中,我会修改一个典型的注册应用程序来执行以下操作:
我的问题是:这个中间内存数据库有哪些选择?我已经尝试了内存中的哈希表,数据表等,但我正在寻找其他选项,甚至是针对完全不同的方法的建议。
答案 0 :(得分:8)
如果您不需要实时知道是否存在现有记录(即记录进入该记录很重要,但您不需要报告该记录是新的还是现有的) ,您可以以允许极快写入时间的方式构建数据库,而无需内存数据库,如果服务器出现故障或工作进程重新启动,则会带来很多潜在问题。
在数据库中为每个与此写入流量相关的表创建两个表。一个表应该是您的“实时”表,并且应该尽可能地进行写入优化(即,除了移动到读取表之外,不会读取索引并且永远不会读取)。您的另一个表应该是您的读优化表 - 根据任何报告注意事项编制索引等等。
每当你写入你的直播表时,忽略任何关于记录是新的还是现有的事情,或者除了尽可能快地将数据放入表中并离开数据库之外的任何事情。设置一个计划作业,将记录从活动表移动到读取优化表中,并担心匹配现有记录。理想情况下,这将在非高峰时段完成,但您可能需要考虑第三个临时表,以便在任何时候都不会在实时表上发生争用。
答案 1 :(得分:6)
接受新概念“一切都是消息,数据库是备份”。当你有东西要存储时,创建一条消息并使用XMPP将其发送到黑盒子(如eJabberD)。让blackbox按照自己的计划更新您的数据库。这就是Twitter这样的网站的运作方式。
答案 2 :(得分:3)
这是一个奇怪的想法:不要使用数据库进行初始捕获。设计两个或三个令人惊讶的快速索引文件,其格式不需要经常更改。捕获这些文件中的数据。
编写一些适当触发的软件,将捕获的数据复制到数据库中,但不会延迟交互式用户。标记复制的数据以防止重复复制,并回收文件中的空间。
现在,您可以设计数据库,以便在多次使用之间共享数据,而不是跟上捕获过程的想法。毕竟,共享数据是数据库真正发挥作用的地方。
答案 3 :(得分:2)
没有编程相关,但肯定会有所帮助:获得一些较新的固态硬盘。
是的,它们的尺寸很昂贵,但由于磁盘IO是瓶颈,只需更换一些SSD的当前硬盘就可以大大提高性能。
答案 4 :(得分:1)
答案 5 :(得分:1)
我不知道你提到的数据库,但是如果数据库的内容(或者至少是重要的表)适合内存,oracle能够将它固定在缓存中,所以它基本上就像一个in记忆库。
我还会检查数据库的隔离级别设置。如果你能够放松那些,你可能会减少锁定。
最后考虑删除唯一约束,或在峰值时间禁用它们。
答案 6 :(得分:1)
在我看来,您应该能够使用具有用户大小缓存的RDBMS来适应您的工作负载。我看到每秒10000个索引记录的顺序与简单的C ++ - 可调用的RDBMS与普通硬件。这包括提交到磁盘。此外,由于您可能只查看记录中的一个小字段,因此请查找面向列的数据库 - 一个在列中存储数据的数据库。如果你只对一个领域感兴趣,那么整篇阅读就没有意义了。
答案 7 :(得分:1)
正如许多其他人所提到的那样,优化数据库架构以进行写入而非读取是您的第一个调用点,尽管我猜您已经在那里
在调查内存数据库之前,您可能需要查看一些可用的ORM,尤其是NHibernate。
NHibernate将一些数据保存在内存中,并允许您控制数据更新何时从内存中“刷新”并与数据库同步。
你可能会觉得值得一看。
答案 8 :(得分:1)
编辑:严格关注磁盘I / O ......
最小化数据库逻辑的数量并横向添加服务器(而不是尖端的服务器技术)基本上是ebay采用的方法。