我正在开发一个类似于谷歌分析的分析工具。这将在数据库中存储关键字、访问和页面。
所以数据库可以快速增长,因为我希望有很多人使用它。
我应该如何设置数据库?一个数据库用于所有帐户和所有被监控的网站?还是每个帐户都有一个数据库会更好?
另外,我计划从一台专用服务器开始,但我确信将来我需要不止一台服务器,所以我必须牢记这一点来构建它。
我也知道,如果我为每个帐户创建多个数据库,那么当应用程序的架构发生变化时,我将不得不在所有这些数据库上运行升级脚本。
我正在开发一个类似于谷歌分析的分析工具。这将在数据库中存储关键字、访问和页面。
所以数据库可以快速增长,因为我希望有很多人使用它。
我应该如何设置数据库?一个数据库用于所有帐户和所有被监控的网站?还是每个帐户都有一个数据库会更好?
另外,我计划从一台专用服务器开始,但我确信将来我需要不止一台服务器,所以我必须牢记这一点来构建它。
我也知道,如果我为每个帐户创建多个数据库,那么当应用程序的架构发生变化时,我将不得不在所有这些数据库上运行升级脚本。
你打算使用什么样的数据库?关系(PostgreSQL,MySQL)和“NoSQL”(MongoDB,CouchDB)之间有很大的区别
我只会在关系方面谈论 PostgreSQL,因为它是我唯一使用过的数据库。
首先,我会将所有内容保存在一个数据库中。每个帐户使用一个数据库没有任何好处。
其次,您应该绝对确定您将超越单台机器。鉴于这种应用程序您将处理比读取更多的写入,因此主从复制只能用于高可用性,而使用 PostgreSQL 的多主复制并不容易。
从我上次的研究来看,最不痛苦的方法是使用像Postgres-XC这样的工具,它被设计为可写扩展,但我不知道它的生产准备情况如何。
另一种解决方案是使用 Bucardo 或 SkyTools 等工具。没有使用 SkyTools 的经验,但去年让 Bucardo 工作时遇到了很多麻烦。
最后的解决方案是做分片。分片的天真方法是执行类似
shard number = id % 10
. 但是,使用它时,您需要在添加/删除分片时重新平衡集群。这将要求您编写“分片感知”应用程序,以便将查询定向到正确的分片。
无论如何,就像我之前说的,确保你需要先进行分片/集群化。
现在对于“NoSQL”方面,我对任何解决方案都没有经验,但我知道 MongoDB 和 CouchDB 自己处理分片,因此使用这些解决方案更容易,但是你放弃了很多。