我必须重写一个在32台服务器上运行的大型数据库应用程序。硬件是最新的,每台机器有两个四核Xeon和32 GByte RAM。
数据库是多租户的,每个客户都有自己的文件,每个文件大约5到10 GB。我在这个硬件上运行了大约50个数据库。该应用程序是对Web开放的,所以我无法控制 在负载上。没有真正复杂的查询,因此如果有更好的解决方案,则不需要SQL。
数据库每天午夜都会通过FTP更新。数据库是只读的。 C#是我最喜欢的语言,我想使用ASP.NET MVC。
我想到了以下几个选项:
使用运行SQL Server 2012的两个大型SQL服务器为32台服务器提供数据。在运行IIS主机提供REST服务的32台服务器上。
对数据库进行非规范化并在每个Web服务器上使用Redis。使用booksleeve作为Redis客户端。
使用SQL Server和Redis的组合
将SQL Server 2012与Hadoop一起使用
使用不带SQL Server的Hadoop
只读数据库的最佳方法是什么,在不失去可维护性的情况下获得最佳性能?在这种情况下,Map-Reduce是否有意义?
重写的原因是,使用ISAM技术用C ++编写的旧应用程序速度太慢,界面老旧且不适合在网站上使用,尤其是在使用ajax时。
应用程序使用具有许多表的关系数据模型,但是可以编写一个可以执行所有查询的accerlerator表,并且可以通过简单的键查找来显示其他表中的所有其他信息。
答案 0 :(得分:1)
几个问题。你有什么问题要改写吗?查询模式是什么样的?听起来您最熟悉SQLServer +缓存(memcached)来解决导致您重写此问题的任何问题。 Redis很好,但是你不需要db处理查询的数据结构功能,如果它只被用作缓存,你就不需要持久性。在不了解更多问题的情况下,我想我会看看MongoDB在一个解决方案中处理数据分片,冗余存储和缓存。此设置中没有特殊的机器,可以配置冗余,并且负载应该很好地平衡。
答案 1 :(得分:1)
这个问题几乎是一个意见。如果性能至关重要,并且白天的并发读取量很高,我个人更喜欢使用带有TimesTen的Oracle RAC进行缓存。
这里有一份白皮书......
http://www.oracle.com/us/products/middleware/timesten-in-memory-db-504865.pdf
磁盘子系统的规格以及跨物理磁盘的索引和数据文件的组织可能是最重要的因素。