请教一下聊天消息应该用什么数据库存储?

2022-09-29 10:06:43 +08:00
 monkeydream

公司要开发运营聊天功能,估计用户 10w 左右,在线 1w 人,消息每天 100w 以上,需要存储 6 个月左右的消息,差不多 2 亿条,而且考虑到不同终端之间的消息同步,客户端需要频繁的查询聊天数据。 请问针对这样的场景应该选择哪种数据库? 目前考虑 Mongodb 或 Clickhouse ;考虑 mongodb 主要是 mongodb 的分片模式适合存储大量数据、查询也比较快,考虑 clickhouse 主要是其能存储大数据并且查询性能也比较好(但是听说并发不太好,不知道是否适合并发查询要求)。

10064 次点击
所在节点    数据库
88 条回复
di1012
2022-09-29 10:48:42 +08:00
要不试试时序数据库?
onlyhuiyi
2022-09-29 10:48:45 +08:00
为什么要用 mongo 呢,我们公司 mongo 都不再支持新的接入了
monkeydream
2022-09-29 10:51:10 +08:00
@di1012 你们实际项目生产上有使用过吗?我们没接触过这块,怕坑太多。
monkeydream
2022-09-29 10:52:51 +08:00
@onlyhuiyi 为啥不接入了? mongo 写入查询效率还可以吧?这么多年了也比较成熟,也可以进行分片存储大数据。比存 mysql 肯定要强不少吧。
Singular
2022-09-29 11:01:29 +08:00
System Design 的书介绍设计 Facebook Messenger 用的是 Hbase 这类宽表存储 DB

F.Y.I.: https://akshay-iyangar.github.io/system-design/grokking-system-design/system-design-problems/facebook-messenger.html
wxf666
2022-09-29 11:02:20 +08:00
@monkeydream 3 天前的 [这个帖子]( https://www.v2ex.com/t/882773 ) 里,有很多人反映,MySQL 单表存 1~2 亿(#11 楼 #16 #18 #19 #21 #35 )、4 亿(#27 )、10 亿(#35 )、20 亿(#28 )都没问题诶,查询也很快(几十 ms ,#27 #28 )

MySQL 真的不行吗?
liuhan907
2022-09-29 11:12:46 +08:00
@monkeydream 聊天数据,你要搜索要全文搜索,除了 ES 你还想自己实现倒排索引?
monkeydream
2022-09-29 11:13:09 +08:00
@wxf666 主要考虑不仅仅是数据量存的问题,还有并发读。最终还是要做个压测对比下。
b123405060
2022-09-29 11:13:19 +08:00
@wxf666 mysql 单表一般不超过 500w, 单表上亿的数据? mysql 这么强大吗
monkeydream
2022-09-29 11:14:32 +08:00
@liuhan907 不是全文检索,是多端数据同步,要实现消息拉取。
joesonw
2022-09-29 11:15:29 +08:00
时序是存数字的,每条记录存的是差值来优化空间和统计。聊天记录这种文本的完全和时序没半毛钱关系。一般查询是本地的,服务器只是留档不检索的话,按时间存对象存储就好了。用户同步到本地 sqlite 再查询。
Yada
2022-09-29 11:17:10 +08:00
某办公 IM 大厂早期用的是 mysql 写扩散。 后面量大了。就扛不住了。 架构升级成 类 Hbase 的 OTS ( tableStore ) IM 业务核心特性之一是,基本上很少修改数据(撤回,删除等)。另外要核心关注一下 读写扩散模型的问题。 大群治理。 现代的 IM 都不是单纯的读扩散或者写扩散了。

MongoDB 不太建议。MongoDB 最贴合的应该是数据 schema 多变的这种业务类型 。IM 业务的表基本不会有啥变化。不适合。clickHouse 不了解。
realrojeralone
2022-09-29 11:17:43 +08:00
pengtdyd
2022-09-29 11:22:30 +08:00
就没人推荐 postgresql 吗?
首先是场景:聊天记录需要频繁查询吗?拿微信来说,本地先有一份,同时同步多端消息,但是需要发送查询到服务器本身并不是一个高频的场景,聊天应用本地需要一个数据库,查询不到本地或者轮询同步的时候才需要和服务器进行交互。
lmshl
2022-09-29 11:22:51 +08:00
聊天场景的话,主要是写多读少,几乎不修改,而且顺序性明显
那我推荐 Cassandra ,以 Channel/Group 为 partition key ,timeuuid 为 clustering key ,写入每 key 几万且支持水平线性扩展,以 partition key 读取也是顺序读,速度不需要担心。
wxf666
2022-09-29 11:25:20 +08:00
@b123405060 超过 500w 会怎样? B+ 树从 3 层 变为 4 层?

然后由于内存只能完整缓存前两层(前两层代价是 20~30 MB 内存,前三层代价是 20~30 GB ),所以 3 层变为 4 层,会导致实际 IO 由 1 次 变为 2 次,即速度下降 50%?

还是怎么个逻辑?

数据库新人,求指教
lmshl
2022-09-29 11:28:44 +08:00
接 #35 Cassandra 还支持过期时间 (TTL).
你想存储几个月就存储几个月,过期后不需要手动清理
wxf666
2022-09-29 11:30:03 +08:00
@monkeydream 你要并发读多少啊?

那个帖子里反馈,MySQL 单表这么多亿,单次查询也能 10- ms 啊(噢,26 楼写错了)
demon1991yl
2022-09-29 11:31:24 +08:00
mongodb 吧,我们的私信、im 消息目前都是存在 monodb 里面的,规模都是上百亿条,而且根据楼主的描述,数据量 2 亿不算多,存 mongo 的话,也方便后续扩展,,而且基本也是一些在线索引查询。ES 、CK 等对于 TP 类业务实时性不一定能保证
demon1991yl
2022-09-29 11:32:42 +08:00
@onlyhuiyi 为啥不接 mongodb 了呢,我们挺多业务再用,还有很多 mysql 转过来的呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/883731

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX