我正在开发一个介于电子邮件服务和社交网络之间的网络应用程序。我认为它有潜力在未来快速增长,因此我很关心可扩展性。
我决定为每个活跃用户创建一个单独的SQLite数据库:即每个“碎片”一个活跃用户,而不是使用一个集中式MySQL/InnoDB数据库,然后在需要时进行分区。
这样备份数据库将像每天将每个用户的小数据库文件复制到远程位置一样容易。
扩展将像添加额外的硬盘以存储新文件一样容易。
当应用程序超出单个服务器范围时,我可以在文件系统级别使用GlusterFS连接服务器并无需更改应用程序;或者搭建一个简单的SQLite代理系统,允许每个服务器操作相邻服务器中的sqlite文件。
并发问题将很小,因为每个HTTP请求每次只会访问数千个文件中的一个或两个数据库文件,并且SQLite只会在读取时阻塞。
我打赌这种方法将使我的应用程序能够平滑扩展并支持许多酷炫而独特的功能。 我是否犯了错误? 我有遗漏什么吗?
更新 我决定采用不那么极端的解决方案,目前运行良好。我使用了一个固定数目的碎片-精确地说是256个SQLite数据库。每个用户都通过简单的哈希函数分配并绑定到一个随机碎片。
我的应用程序大多数功能只需要访问一个或两个碎片,但有一项特别需要在256个碎片中执行10到100个简单查询的功能,具体取决于用户。 测试表明,如果所有数据都缓存在RAM中,则大约需要0.02秒或更短时间。我认为这已经可以应对了!
更新2.0:我将应用程序移植到MySQL/InnoDB并能够获得类似于常规请求的性能,但是对于需要分片操作的那个请求,InnoDB会快4-5倍。因此,出于这个原因和其他原因,我放弃了这种架构,但我希望有人能够找到它的用途...谢谢。