我想了解如何为聊天信息构建一个大型网站数据库架构(例如facebook.com或gmail.com)。
我认为消息是在不同的表中重新分配的,因为不可能把所有的消息都放在一个表中,原因是它们有巨大的数量对吗?(我不认为在这里分区)
那么,使用什么逻辑在不同的表中重新分配消息呢?我有几个变种,但我认为没有一个是最佳变种。
所以总的来说,我对你的想法很感兴趣?此外,如果你知道一些关于这方面的好文章,请张贴链接。
最佳答案
好吧,问题是如何划分数据集。考虑这一点的最简单(通常也是最好的)方法是考虑访问模式。哪些信息需要快速处理,哪些信息可能比较慢,以及如何管理每个信息。
通常,较旧的消息可以保存在低网络速度/低内存/非常大的存储节点(兆字节)上。
新消息应位于高带宽网络/高内存/低存储节点(千兆字节足够)。
随着通信量的增长,您需要将存储添加到慢速节点,并将节点添加到快速节点(水平缩放)。
每晚(或更频繁地)您可以将旧消息复制到历史数据库,并从当前数据库中删除这些消息。查询可能需要处理两个数据库,但这并不太麻烦。
当您向外扩展时,可能需要对数据进行分片,即按某些数据值进行拆分。用户id拆分是有意义的。为了让生活变得简单,对话的所有方面都可以存储在每个用户的身上。我建议对此使用带时间限制的文本(磁盘访问通常在4k边界上),尽管这对您来说最初可能太复杂了。
查询现在需要用户感知,以便它们根据正确的数据库进行查询。一个简单的查找表会有帮助。
另一件事是在进入时压缩消息,在离开时解压缩。文本很容易压缩,只需增加一点CPU就可以使吞吐量翻倍。
许多nosql数据库为您做了很多这方面的艰苦工作,但是在当前系统的容量耗尽之前,您可能希望坚持使用您所知道的技术。
祝你好运!
关于mysql - 许多记录(例如社交网络中的消息)的数据库体系结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12660003/