我正在开发一个介于电子邮件服务和社交网络之间的网络应用程序。我觉得它有潜力在未来变得非常大,所以我担心可扩展性。
我决定为每个活动用户创建一个单独的 SQLite 数据库,而不是使用一个集中式 MySQL/InnoDB 数据库,然后在那个时候对其进行分区:每个“分片”一个活动用户。
这样备份数据库就像每天一次将每个用户的小型数据库文件复制到远程位置一样简单。
扩大规模就像添加额外的硬盘来存储新文件一样简单。
当应用程序超出单个服务器时,我可以使用 GlusterFS 在文件系统级别将服务器链接在一起并保持不变地运行应用程序,或者安装一个简单的 SQLite 代理系统,允许每个服务器操作相邻服务器中的 sqlite 文件。
并发问题将是最小的,因为每个 HTTP 请求一次只会触及一个或两个数据库文件,在数千个中,而且 SQLite 无论如何只会阻塞读取。
我敢打赌,这种方法将使我的应用程序能够优雅地扩展并支持许多很酷和独特的功能。我赌错了吗?我错过了什么吗?
更新我决定采用一个不太极端的解决方案,到目前为止效果很好。我正在使用固定数量的分片 - 准确地说是 256 个 sqlite 数据库。每个用户都通过一个简单的散列函数分配并绑定到一个随机分片。
我的应用程序的大多数功能只需要每个请求访问一到两个分片,但有一个特别需要对 256 个分片中的 10 到 100 个不同的分片执行简单查询,具体取决于用户。测试表明,如果所有数据都缓存在 RAM 中,大约需要 0.02 秒或更短的时间。我想我可以忍受它!
更新 2.0我将应用程序移植到 MySQL/InnoDB 并且能够获得与常规请求大致相同的性能,但是对于需要分片遍历的请求,innodb 快 4-5 倍。出于这个原因,以及其他原因,我放弃了这个架构,但我希望有人能在某个地方找到它的用途......谢谢。