Extreme Sharding:每用户一个SQLite数据库
我正在开发一个位于电子邮件服务和社交网络之间的Web应用程序。 我觉得它有可能在未来成长得很大,所以我担心可扩展性。
我决定为每个活动用户创建一个单独的SQLite数据库:每个“shard”有一个活动用户,而不是使用一个集中的MySQL / InnoDB数据库,然后进行分区。
这样备份数据库就像每天将每个用户的小型数据库文件复制到远程位置一样简单。
扩展将像添加额外的硬盘来存储新文件一样简单。
当应用程序增长超过单个服务器时,我可以使用GlusterFS将文件系统级别的服务器连接在一起,并且可以不变地运行应用程序,或者构建一个简单的SQLite代理系统,以允许每个服务器操作相邻服务器中的sqlite文件。
并发问题是最小的,因为每个HTTP请求一次只能触及一个或两个数据库文件,成千上万,并且SQLite仅阻止读取。
我敢打赌,这种方法将允许我的应用程序优雅地扩展并支持许多很酷且独特的功能。 我打赌错了吗? 我错过了什么?
更新我决定采用一个不太极端的解决方案,目前工作状况良好。 我正在使用固定数量的分片 - 256个sqlite数据库,准确无误。 通过简单的散列函数将每个用户分配并绑定到随机分片。
我的应用程序的大多数功能都要求每个请求只能访问一个或两个分片,但有一个特殊情况需要在256个分区中的10到100个不同分片上执行简单查询,具体取决于用户。 测试表明,如果所有数据都缓存在RAM中,则需要大约0.02秒或更少的时间。 我想我可以忍受这一点!
UPDATE 2.0我将应用程序移植到MySQL / InnoDB,并且能够获得与常规请求相同的性能,但对于需要碎片散步的那一个请求,innodb速度提高4-5倍。 出于这个原因,以及其他原因,我放弃了这个架构,但我希望有人在某处找到它的用处......谢谢。
如果你不得不做所谓的“碎片散步”,那就是找出所有不同用户的数据。 这种特殊的“查询”将不得不以编程方式完成,依次询问每个SQLite数据库 - 而且很可能是您网站的最慢方面。 在任何系统中,数据已被“分解”为单独的数据库是一个常见问题。
如果所有数据都是自包含给用户的话,那么这个数据应该可以很好地扩展 - 使得这个设计成为有效的关键是要知道如何使用这些数据以及如果来自一个人的数据将会相互影响来自另一个数据(在你的上下文中)。
您可能还需要注意文件系统资源 - SQLite是伟大的,真棒的,快速的等等,但是当您使用“标准数据库”(例如MySQL,PostgreSQL等)时,您会获得一些缓存和写入优势,因为它们的方式'重新设计。 在你提出的设计中,你会错过一些。
听起来像一个维修噩梦。 当所有这些数据库上的模式更改时会发生什么?
一个可能的问题是,每个用户拥有一个数据库会非常低效地使用磁盘空间和RAM,随着用户群的增长,使用轻量级和快速数据库引擎的好处将完全丢失。
解决这个问题的一个可能的方法是创建由多达1024个SQLite数据库组成的“ minishards ”,每个数据库最多可容纳100个用户。 这比数据库用户方法更有效率,因为数据的打包效率更高。 而且比Innodb数据库服务器方法更轻,因为我们使用的是Sqlite。
并发性也会相当不错,但查询会不太优雅(shard_id yuckiness)。 你怎么看?
链接地址: http://www.djcxy.com/p/19811.html