非常多记录的数据库架构(例如社交网络中的消息)[关闭]

Posted

技术标签:

【中文标题】非常多记录的数据库架构(例如社交网络中的消息)[关闭]【英文标题】:database architecture for very many records (for example messages in social network) [closed] 【发布时间】:2012-09-30 08:56:39 【问题描述】:

我想了解如何为聊天消息构建大型站点数据库架构。(例如 facebook.com 或 gmail.com)

我认为消息被重新分配到不同的表中,因为将所有消息都放在一个表中是不可能的,原因是它们的数量很大,对吗? (我认为这里不能分区)

那么,使用什么逻辑在不同的表中重新分配消息?我有几个变体,但我认为它们都不是最佳变体。 所以一般来说,我对你对此的看法很感兴趣?另外,如果您知道一些关于此的好文章,请发布链接。

【问题讨论】:

从 Postgres 开始,如果需要,迁移到 HBase 【参考方案1】:

目前的答案是hadoop

他们有一个分布式文件系统和一个可以使用http://hbase.apache.org的数据库

http://en.wikipedia.org/wiki/HBase

【讨论】:

【参考方案2】:

好的,问题是如何对数据集进行分区。考虑这一点的最简单(通常也是最好的)方法是考虑访问模式。哪些消息需要快速,哪些消息可能很慢,以及如何管理每条消息。

通常较旧的消息可以保存在低网络速度/低内存/非常大的存储节点(数 TB)上。

新消息应该在高带宽网络/高内存/低存储节点上(千兆字节就足够了)。

随着流量的增长,您需要将存储添加到慢速节点,并将节点添加到快速节点(水平扩展)。

每晚(或更频繁地)您都可以将旧消息复制到历史数据库,并从当前数据库中删除消息。查询可能需要寻址两个数据库,不过这样也不算太麻烦。

当您向外扩展时,可能需要对数据进行分片,即按一些数据值拆分。用户 ID 拆分是有意义的。为了让生活更轻松,每个用户都可以存储对话的所有方面。我建议为此使用时间分段文本(磁盘访问通常在 4k 边界上),尽管最初这对您来说可能太复杂了。

查询现在需要用户感知,以便查询正确的数据库。一个简单的查找表将对此有所帮助。

另一件事是在输入时压缩消息,并在输出时解压缩。文本很容易压缩,并且可能会因 CPU 的少量增加而使您的吞吐量翻倍。

许多 NoSQL 数据库为您完成了很多艰苦的工作,但在您当前系统的容量用完之前,您可能希望坚持使用您熟悉的技术。

祝你好运!

【讨论】:

【参考方案3】:

前段时间有一篇文章reddit是如何从小到大的。 他们没有用户消息系统,但我想这将适用于大量数据的场景 http://highscalability.com/blog/2010/5/17/7-lessons-learned-while-building-reddit-to-270-million-page.html

编辑:关于数据库的“有趣”部分是#3 - 不要担心架构.. 他们使用 2 个表来处理所有事情。事物和数据。

【讨论】:

【参考方案4】:

Facebook 将Apache Cassandra 用于他们的一些存储(文档数据库),并大量使用memcached 以使其具有良好的扩展性。

这里有更多关于FB's nuts and bolts 的信息。 您还可以在FB developer news 中找到一些宝石。

【讨论】:

Facebook 不久前为 HBase 放弃了 Cassandra。 highscalability.com/blog/2010/11/16/…

以上是关于非常多记录的数据库架构(例如社交网络中的消息)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在社交网络设计中使用外键 - 好/坏?

您如何对社交网络节点进行分组?

[CQOI2018] 社交网络

社交类App开发中的IOS图像处理

开发社交网络:技巧、细节和信息

社交网络平台架构