nuomiphp
正在加载…
请使用更现代的浏览器并启用 JavaScript 以获得最佳浏览体验。
加载论坛时出错,请强制刷新页面重试。
请教一下聊天消息应该用什么数据库存储?
monkeydream
liuhan907
不是全文检索,是多端数据同步,要实现消息拉取。
wxf666
monkeydream
你要并发读多少啊?那个帖子里反馈,MySQL 单表这么多亿,单次查询也能 10- ms 啊(噢,26 楼写错了)
liuhan907
monkeydream
所以你是要做 IM 消息存储和消息本身的检索?那这个 2E 的量基本随便了吧,拿个 pgsql 硬件规格拉高一些单机大概都够。不放心就找一个分布式数据库一把梭。
wxf666
monkeydream
我大概算算 MySQL 单表,受限于 IO 的读并发吧:假设:- B+ 树 4 层 *(若 InnoDB 、Dynamic 、16 KB 每页、8 字节主键、1 KB 一条消息,可容纳 110 亿)*- 缓存前两层 *( 14 MB 内存代价)*- 有 `(uid 4 字节, time 5 字节)` 索引- 每个用户每次获取不超过 700 条消息 *(此时索引只需读一个叶节点)*- **不缓存实际消息** *(就当所有用户都在获取历史消息吧。因为每个叶节点可能存着 15 个不同用户的消息,太散了,不会算『每次一个用户获取一堆消息时,能利用上多少缓存』,直接按最差情况算)*设每秒有 x 人请求,平均每人有 y 条消息要获取,硬盘有 z 个 16 KB 的 IOPS ,那么:2x (每人消耗 2 次 IO 去索引读取自某个时间以来的消息 ID 列表) + 2xy (每条消息都要 2 次 IO 去消息表读取) <= z如,我的垃圾固态,16 KB 有 25000 IOPS (也就 400 多 MB/s )。那么:每秒 100 人要获取消息时,平均每人能得到(不在缓存中的) 124 条历史消息?(数据库新手,算的不对,恳请指出)
djoiwhud
monkeydream
#30 。你的需求选 mysql 或者 pg 就可以了。热数据放 redis 里面。实在想折腾新方案,想永久保存聊天记录,考虑 hbase 或者 hive 。本人做过 IM 类的需求产品,我负责的说,这个需求用 es 是个错误。
onlyhuiyi
monkeydream
我也不知道为啥,提申请页面都写着不再接新的实例了。应该是内部用的少吧,不想浪费人力去维护这部分了,主要还是用 mysql ,ES ,redis 等,最近越来越多用 clickhouse 。接触的系统很少用 mongo 。
joesonw
时序是存数字的,每条记录存的是差值来优化空间和统计。聊天记录这种文本的完全和时序没半毛钱关系。一般查询是本地的,服务器只是留档不检索的话,按时间存对象存储就好了。用户同步到本地 sqlite 再查询。
changdy
clickhouse 去掉 .不是干这个的 其次 时序数据库 了解的不多 .但是 也比较赞同
joesonw
的说法es 我觉得有几个问题吧.基于分词,无法保证查询结果 数据难分表. 不分表冷热数据混在一起也有点小问题.感觉 im 这个场景还是挺大的 ,最好还是和产品一起商量下如何优化 使用体验.
yangzhuowork
某办公 IM 大厂早期用的是 mysql 写扩散。 后面量大了。就扛不住了。 架构升级成 类 Hbase 的 OTS ( tableStore ) IM 业务核心特性之一是,基本上很少修改数据(撤回,删除等)。另外要核心关注一下 读写扩散模型的问题。 大群治理。 现代的 IM 都不是单纯的读扩散或者写扩散了。
MongoDB 不太建议。MongoDB 最贴合的应该是数据 schema 多变的这种业务类型 。IM 业务的表基本不会有啥变化。不适合。clickHouse 不了解。
realrojeralone
钉钉用的 TableStore https://help.aliyun.com/document_detail/430700.html#p-1dc-ajj-at1
pengtdyd
就没人推荐 postgresql 吗?
首先是场景:聊天记录需要频繁查询吗?拿微信来说,本地先有一份,同时同步多端消息,但是需要发送查询到服务器本身并不是一个高频的场景,聊天应用本地需要一个数据库,查询不到本地或者轮询同步的时候才需要和服务器进行交互。
lmshl
聊天场景的话,主要是写多读少,几乎不修改,而且顺序性明显
那我推荐 Cassandra ,以 Channel/Group 为 partition key ,timeuuid 为 clustering key ,写入每 key 几万且支持水平线性扩展,以 partition key 读取也是顺序读,速度不需要担心。
wxf666
b123405060
超过 500w 会怎样? B+ 树从 3 层 变为 4 层?然后由于内存只能完整缓存前两层(前两层代价是 20~30 MB 内存,前三层代价是 20~30 GB ),所以 3 层变为 4 层,会导致实际 IO 由 1 次 变为 2 次,即速度下降 50%?还是怎么个逻辑?数据库新人,求指教
lmshl
接 #35 Cassandra 还支持过期时间 (TTL).
你想存储几个月就存储几个月,过期后不需要手动清理
demon1991yl
mongodb 吧,我们的私信、im 消息目前都是存在 monodb 里面的,规模都是上百亿条,而且根据楼主的描述,数据量 2 亿不算多,存 mongo 的话,也方便后续扩展,,而且基本也是一些在线索引查询。ES 、CK 等对于 TP 类业务实时性不一定能保证
demon1991yl
onlyhuiyi
为啥不接 mongodb 了呢,我们挺多业务再用,还有很多 mysql 转过来的呢
onlyhuiyi
demon1991yl
我也不知道为啥,用的人少,不值得安排人来维护吧。
fengjianxinghun
实时查询用 ES ?都是 ppt 架构师?
fengjianxinghun
fengjianxinghun
还是都是个位数并发?
hahasong
肯定用 hbase 我之前就做过这个。消息都是时序写入,hbase 轻松无压力。只有硬盘到位,永久存都行
microxiaoxiao
2 亿条消息也不大吧,直接存内存相关的数据库吧。持久化随便选一个。200000000*1k/1024/1024/1024=190GB 。图片,视频另外存
tt67wq
热 tidb + 冷 hbase
helloxiaofan
MySQL 不行吗,我们之前每天 400w 左右,可以分库分表
shot
建议参考头部玩家的技术选型,比如 Discord 的数据库迁移历程:MongoDB → Cassandra → ScyllaDB
《 How Discord Stores Billions of Messages 》
> In July, we announced 40 million messages a day, in December we announced 100 million, and as of this blog post we are well past 120 million.
> The messages were stored in a MongoDB ……, we reached 100 million stored messages and…… see the expected issues appearing: the data and the index could no longer fit in RAM and latencies started to become unpredictable.
https://discord.com/blog/how-discord-stores-billions-of-messages
《 Discord Chooses ScyllaDB as Its Core Storage Layer 》
https://www.scylladb.com/press-release/discord-chooses-scylla-core-storage-layer/
cp19890714
首先排除 clickhouse 。clickhouse 主要用于 OLAP ,不适合 OLTP 。并发能力很弱,不适合你的场景。
mongodb 分片、写入并发、数据压缩、数据过期自动清理 都挺适合你的场景。数据量 2 亿真不多。
ES 我只是简单使用过,没有太多了解。不过,实时查询好像不是太快,而且服务器成本比 mongodb 高。
cp19890714
cp19890714
不过,如果要做聊天记录查询,那么全文索引又必然是用 ES 了
« 上一页
下一页 »