楼主背景游戏服务器开发, 一直以来沿用的是老一套 DB + redis/memcache 的形式来做存储。虽然方案比较稳定了,但是在扩容和复杂度上一直感觉不是那么直观。 看到过有一些公司直接舍弃 DB 层,只用一个 redis 定时持久化做存储, 但感觉小规模的项目还行,数据量上去了对内存要求会不会过大呢? 也见过有人舍弃缓存层只用 Postgres 来存储,据说百万级并发请求性能只比 redis 慢 1 倍?
另外问一下 MongoDB 算不算是一个 DB/Cache 合一的解决方案呢?就是我项目里只用一个 MongoDB ,MySQL/Postgre/redis 之流通通不要
请大佬现身说法!!!
1
youngce 2022-08-07 14:34:21 +08:00 3
建议先搞清楚缓存和数据库用途的区别。。。
|
2
b00tyhunt3r OP 期待真大佬干货回答!!
|
3
xsen 2022-08-07 16:19:29 +08:00
若是针对扩容与复杂度的话,建议了解下分布式数据库,如国内的 TiDB 之类的
当然,你游戏场景的这不算太复杂;分布式数据库之所以提出来,是因为基于传统的 SQL 数据库,在数据量海量情况下,要做在线或离线数据分析所以额外的大数据分析之类方案结合进来,会导致异常复杂 |
4
b00tyhunt3r OP @xsen
感觉有点杀鸡牛刀了吧。。。确实如你所说,游戏场景并不复杂,但是对性能要求却极高,这也是大部分时候我需要把数据存在内存的原因, 但是内存数据落地后的处理就有不一致的风险, 所以我现在思考的是能否去掉缓存 /DB 其中一端,来消除不一致性的一个成因,并减少开发复杂度? 我听说 PostgreSQL 自带 Cache 功能,如果使用 DB 自带的 Cache 层,那还需要引入 Redis 等外部软件吗? |
5
mrsatangel 2022-08-07 17:24:14 +08:00
- DB 的 cache 对外保持 ACID 的语义,Redis 压根就不是事务型数据库;
- DB 的 cache 是 page 维度的,Redis 作为 cache 的数据是 key 维度的; 去掉缓存:损失性能; 去掉 DB:损失 durability 。但是也不能不能解,比如前段时间太监了的 optane 这种; Redis 的扩展性问题:老东家见过很多九百多 GB 的 redis 实例;实在不行还可以按 key 分片啊。 |
6
geekvcn 2022-08-07 17:39:58 +08:00 via iPhone
对内存容量要求未来应该可以不用太焦虑了,钱够就趁着 Intel 傲腾停产前多存点货,或者等 CXL 生态成熟,内存容量以后都不是事。以后数据库应该会围绕 CXL 生态开发,以后内存会分为 CPU 封装的高速 HMB 内存,CPU 扩展的 DDR 内存,CXL 扩展大容量共享内存池
|
7
ryalu 2022-08-07 18:33:33 +08:00
aws 推出的 [memoryDB]( https://aws.amazon.com/cn/blogs/china/comparison-of-amazon-memorydb-and-amazon-elasticache/) 会不会成为未来的一种趋势
|
8
wctml 2022-08-07 18:50:20 +08:00
|
9
Lighfer 2022-08-07 21:20:32 +08:00
apache ignite ?
|
10
killpanda 2022-08-07 21:27:52 +08:00
couchabase
|
11
killpanda 2022-08-07 21:27:58 +08:00
couchbase
|
12
roundgis 2022-08-07 21:32:12 +08:00 via Android
現在單機都可以支持 1T ram
大部分的場景也夠用了吧 |
13
noparking188 2022-08-07 21:51:46 +08:00
之前看的 V 站一个老哥回帖说,他们公司 MySQL 内存给几十上百 TB ,缓存开到最大,基本上数据都在内存里了
楼主你的场景和痛点没详细描述,不大好给你建议 |
14
mxT52CRuqR6o5 2022-08-07 21:53:32 +08:00 via Android
游戏的局内信息一般都不持久化的吧,局外信息也没有多高的性能需求啊
|
15
nicebird 2022-08-07 22:01:22 +08:00
tcaplusDB
|
16
joesonw 2022-08-07 22:23:46 +08:00 via iPhone
redis 有落盘的,可以按 key hash 做分布式,特别适合游戏场景,公司里有用到 2 个多 T 的。一般玩家的相关数据都是按玩家 id hash 。
|
17
linoder 2022-08-07 22:56:45 +08:00 via Android
tidb
|
18
fkdtz 2022-08-08 00:20:07 +08:00
本质上来说还是 AP 和 CP 的取舍问题,没有办法既要高性能高可用,又要很强的一致性,只能根据业务场景来搭配使用。
|
19
iwdmb 2022-08-08 00:52:09 +08:00
Cassandra
|
20
akira 2022-08-08 02:04:20 +08:00
你一个游戏能有多少人 多少数据哦。。只看数据规模的话,redis 肯定是完全足够了的
|
21
documentzhangx66 2022-08-08 02:32:24 +08:00
羡慕楼主,居然不用 RMDB 也能撑起业务。其实 RMDB 能不用就别用,毕竟麻烦。
另外,Redis \ MongoDB 这种,没遇到极端情况与场景,不会触发其不稳定问题,用起来当然好。 不然地球上最强数据库 Oracle 为啥能卖这么贵。 |
22
aima 2022-08-08 04:53:35 +08:00 via iPhone
singlestore
|
23
hoopan 2022-08-08 08:53:48 +08:00
之前也思考过这个问题,貌似没有这种数据库,还是要根据业务场景搭配使用。高并发场景,必然是 Redis 这类内存数据库,缺点是容量小、非关系型,目前只能放一些热数据。
|
24
dqzcwxb 2022-08-08 09:33:29 +08:00
jetcache 做好本机缓存+远程缓存,远程缓存可以是多层
|
25
tairan2006 2022-08-08 09:38:05 +08:00
redis lab 里面有支持 sql 的扩展,做好落盘的话,直接拿来当 db 用也行。
不过游戏场景,有时候 redis 都扛不住…… |
26
bthulu 2022-08-08 09:41:38 +08:00
有的, mysql 有内存数据库, 可以当缓存用
|
27
nothingistrue 2022-08-08 09:43:51 +08:00
如果你要知道缓存是干什么的,大概就不会这样问了。直接读取最终存储效率不够,于是弄个缓存提高读取效率。所以,只会出现因为数据库效率够了不要缓存的情况,不会出现数据库和缓存合一的情况。
|
28
hst001 2022-08-08 10:26:00 +08:00
小项目没有问题,压力大了还是会回到 DB + Cache 那一套
|
29
Martens 2022-08-08 10:30:51 +08:00
可不可以这样:玩家登陆直接把数据读到内存里,离线后把数据落盘
|
30
huangwei8ku 2022-08-08 10:33:05 +08:00
@b00tyhunt3r clickhouse 了解下
|
31
litguy 2022-08-08 10:37:56 +08:00
你们数据库存什么东西
如果只是简单记录 理论上 sqlite 都能有足够高 qps 大部分数据是可以通过 os 的 page cache 命中的 |
32
stevefan1999 2022-08-08 11:31:02 +08:00
這不就是 NoSQL 嗎
|
33
zhangxzh 2022-08-08 12:39:00 +08:00
传统点的方案, Oracle TimesTen Application-Tier Database Cache
|
34
wxdiy 2022-08-08 17:28:47 +08:00
游戏这么多年基本都是这么用的。用 C++基本都是进程内存缓存数据,有变化时或者定时同步到数据库。这种架构不好动吧,还是直接用这稳定的架构谢谢业务逻辑吧
|
35
whileFalse 2022-08-08 19:16:36 +08:00 via iPhone
aws dynamodb 是一种 nosql 。
aws 官方支持内存缓存,启用后延迟从毫秒级缩短到微秒级,并且 api 和一致性不变,对应用层面是透明的。 |
36
whileFalse 2022-08-08 19:23:08 +08:00 via iPhone
另外 aws memorydb 是 redis 的强持久化版本。
|