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