关于数据库容灾缓存方案的咨询

6 小时 47 分钟前
 seedhk

数据库版本

阿里云 RDS SQLSERVER

需求

需求是因为老项目的长 SQL 实在是过于多了,几百行的 SQL 一找一个准,去优化 SQL 工作量非常大。

导致生产环境数据库很不稳定,经常因为 SQL 引起数据库不可用导致被客户投诉罚钱,问了阿里云他们推荐高可用集群,但是阿里云高可用对于小企业来说实在是太贵了。迁移下云又需要比较专业的 DBA 来运维数据库,小企业老板估计也不会同意。

做了什么

已经做了这几步:

  1. 使用了 DTS ,同步主库的数据到从库,基本上实现了读写分离;

  2. 拆分了核心业务,但是核心业务仍然有访问数据库的需求,因此万一数据库不可用时,如何保证核心业务的正常运行,成为了一个大问题;

想做什么:

领导提了一个想法:能否通过在中间加一层缓存层的方式,比如 Redis ,核心业务的增删改查先走 Redis 。一段时间后落库,这样即使数据库挂了,只要能撑住 10 分钟数据库就能恢复。

其他方案:

将数据库和接口都进行拆分,拆成多服务,需要对应数据的,走接口进行查询调用

不知道有没有其他更好的方案,求大佬们指教,谢谢~

1793 次点击
所在节点    程序员
82 条回复
duuu
6 小时 43 分钟前
那 Redis 挂了呢
seedhk
6 小时 40 分钟前
@duuu Redis 是集群,并且开了 AOF
evan1
6 小时 39 分钟前
我遇到的项目都是先加监控,定位慢 SQL 然后进行针对性的优化,比如加索引,分库分表之类的。

没有遇到过用 redis 做这种中间库的。
bg7lgb
6 小时 35 分钟前
数据库优化,从应用开始,而不是从数据库层面入手。

老老实实查日志,找慢 SQL 优化。
bg7lgb
6 小时 34 分钟前
Redis 做缓存,增加了技术的复杂性,故障节点也多了。

而且目前这个问题也不是用高可用版本就可以解决的。
seedhk
6 小时 33 分钟前
@evan1 @bg7lgb SQL 优化已经在做了,但是远水解不了近渴。
seedhk
6 小时 27 分钟前
@bg7lgb 大佬说的是,这样加东西,只会增加复杂性和排查问题的难度,最根本还是得优化 SQL 。

有没有什么其他好一些的方案? 因为 SQL 优化是一个很漫长的过程,其中还牵涉到很多老的业务逻辑,那些 SQL 和表我看过,给我的感觉是一天能改好一个都已经不错了。
Varobjs
6 小时 23 分钟前
redis 缓存有个项目叫 readyset ,可以兼容 mysql 协议,数据库连接可以直接改为 readyset 端口,默认 sql 都会直连数据库,可以在控制台指定 sql ,走内存
SoulSleep
6 小时 22 分钟前
@evan1 +1

不解决问题,要靠堆配置是最后的选择,又不舍得花钱,这不是既要又要吗?
阿里云的 dts 使用场景主要是异构数据库,相同数据库直接开主从就好了....

再就是如果分析型 sql 过多可以考虑用列存数据库、可以考虑加读写分离。。。但是归根结底

必须要做的:
精简在线业务库的单表大小(做做历史归档?)
做慢 SQL 优化(加索引、改写法、做限流...)
优化业务逻辑(如同步改异步)
seedhk
6 小时 19 分钟前
@SoulSleep 谢谢大佬的指导

1.公司买的是阿里云的 RDS sqlserver ,除了 DTS ,不支持其他方式做主从或者读写分离;
2.精简在线业务库的单表大小、做慢 SQL 优化、优化业务逻辑 这些都有在做,也在拆分核心业务,但是数据库这一层始终没有非常好的办法解决。

列存数据库您具体指的是哪些?
seedhk
6 小时 18 分钟前
@Varobjs 谢谢大佬,我司用的是 sqlserver
bg7lgb
6 小时 17 分钟前
挂的时候是什么情况?系统响应慢导致服务不可用?还是直接崩掉了?

最直接的方法就是升级配置,先缓解一下,争取点时间来优化。
cccb
6 小时 15 分钟前
goodryb
6 小时 13 分钟前
redis 本质是做缓存的(不乏一些开了持久化当数据库用),提升查询效率,正常写逻辑都是要直接写库

而且加缓存业务也得改,不如好好投入精力,优化 SQL ,短期来不及就先升级配置,后续改好了再奖降回去
fatyoung
6 小时 10 分钟前
用 redis 做只读缓存应该可以分担很多数据库压力吧?看描述应该是数据量不大,只是 sql 执行时间长吧?
adoal
6 小时 9 分钟前
这种典型的传统信息化型应用的性能瓶颈问题,就不要指望能直接套互联网基础设施来速成了。
seedhk
6 小时 6 分钟前
@bg7lgb 最常见的情况就是因为 SQL 太复杂,表数据量又太大,引起数据库 CPU 过高导致数据库服务不可用,一般重启就能解决,但是也要将近 10 分钟时间。配置目前是 16C 32G 次高,在网上就是顶配 16C 64G 。业务压力点是夏天,时间大概有 2-4 个月。
seedhk
6 小时 3 分钟前
@cccb 谢谢,我看一下
@goodryb #14 正常流程肯定是当做读的缓存来用,就是考虑数据库挂的了情况下,如何解决的问题
@fatyoung #15 最大的几张表已经过亿了,做了数据库拆分,在太复杂 SQL 的情况下,一张表即使只有 1 2KW 的数据,查询也是有风险的
@adoal #16 请问有什么好的方案吗? 谢谢
gostair
5 小时 56 分钟前
redis 增删改查,定期同步到 db,在游戏业务服务器上,是比较常见的方案.
但这种方案,仅针对单条记录的线性的增删改查.

但如果复杂业务复杂 sql,比如涉及跨表查询,比如 事务性的多表修改,加缓存层 实现起来也比较麻烦吧? 何况还得考虑并发等情况.
具体还得结合你的业务场景,看起来是复杂 sql,目测不适合.
seedhk
5 小时 54 分钟前
@goodryb 是的,这个方案目前来看不合适,用 Redis 做查询缓存层更合适一些

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

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

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

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

© 2021 V2EX