而不是使用一个集中的MysqL / InnoDB数据库,然后在那段时间进行分区,我决定为每个活动用户创建一个单独的sqlite数据库:每个’shard’一个活动用户。
这样备份数据库将像每天一次将每个用户的小数据库文件复制到远程位置一样简单。
当应用程序超越单个服务器时,我可以使用GlusterFS在文件系统级别链接服务器,并且运行应用程序不变,或者建立一个简单的sqlite代理系统,允许每个服务器操纵相邻服务器中的sqlite文件。
并发性问题很少,因为每个HTTP请求每次只能触及一个或两个数据库文件,数千个sqlite只阻塞读取。
我敢打赌,这种方法将允许我的应用程序优雅地缩放,并支持许多酷和独特的功能。我下注错了吗?我缺少什么吗?
更新我决定使用一个不太极端的解决方案,这是工作正常到目前为止。我使用固定数量的分片 – 256个sqlite数据库,更准确。每个用户通过简单的散列函数被分配并绑定到随机碎片。
我的应用程序的大多数功能需要访问每个请求只有一个或两个分片,但有一个特别需要执行一个简单的查询10到100不同的碎片256,根据用户。测试指示如果所有数据被高速缓存在RAM中,则它将花费大约0.02秒或更少。我想我可以住在那里!
UPDATE 2.0我将应用程序移植到MysqL / InnoDB,并能够获得与常规请求相同的性能,但对于那个需要分片行走的请求,innodb的速度是4-5倍。因为这个原因,和其他原因,我丢弃这个架构,但我希望有人在某处找到一个使用它…谢谢。