DBA 怎么变得更强

Austindatabases公众号已经开启了,AI 文章分析,AI 文章问答,比如你想知道AustinDatabases 里面,说了多少种数据库,那些是讲 MySQL,那些是PostgreSQL, 那些是OB ,POLARDB ,MongoDB ,SQL Server, 阿里云的,问他他会列出来,同时如果有问题不明白,可以将文章的文字粘贴到公众号提供的专用AI ,公众号将通过众多文章(目前1300多篇)来进行尝试性的解释。使用方法,直接到微信公众号中点击服务,选择AI问答。如下示例

图片
图片

当一个DBA开始具有架构师的视角,在辅助数据库的技能,我们来看看到底会发生什么化学变化。

这里我们假设架构师经常会提到的一些问题,比如高并发。在业务设计中经常有高并发发生,高并发可能是基于业务本身的特殊性,也可能是基于业务本身的宽度。

特殊性这里指的是有可能是时间特性,业务宽度指的是业务本身所设计的面,如门店多,或者瞬时客户多,秒杀,很多情况都具有混合特性,如餐饮SaaS系统,当我们有40万家门店,且在节假日的晚上,同时大量人涌入这些门店来进行食品的点餐,且这些人大部分都是在同一个时间来进入到不同的门店来进行消费,对于整个系统来说量将是非常集中且大量的。

在Java程序中常用map,map是一种键值对的存储结构,用数据库的角度来理解,它是哈希表。在高并发中key:value,中的value是存在多个值的,而在程序中对于key的修改和变动是要加锁的,超高并发的产生就会产生程序中的锁。

那么在程序中由于KEY要带很多value,此时传统的方式要变更为arry的形式来进行数据的存储,这样的好处是锁的粒度的变化。

由于使用了数组,则会让对于值的修改的锁粒度变的更细,产生阻塞的可能就变低。

那么这里将这些理念应用到数据库中,在业务中如果知道是超高的并发表应该怎么设计,马上就会产出一套方法。

1 关键的高并发的数据与冗余数据要分开

2 关键的数据要用int bigint 等数值来表达,而这些值的真实意义可以放到字典表,好处是减少数据库内存的利用,加快数据的checkpoint的速度,如果在细致到 MYSQL OR POSTGRESQL的数据库,一个可以减少UNDO LOG的大小,一个可以减少vacuum 发生的频率。

3 反过来这里必然会产生一个问题,就是值与数据的对应关系。这里有两种方式 3.1 将关系动态放入到表中,通过多表关联来产生查询的结果 3.2 将值的对应关系,写入到缓存,然后单表就可以表达数据,那么这里就要借用 REDIS类的数据库或者更先进的云原生数据库中(云原生数据库中自带缓存系统)

map array对应关系

map array对应关系

后面就是将这些高并发的应用进行分析,将其中的数据如何进行打散的问题,这里就要用到算法,通过数据库算法将这些集中的访问打散到不同的槽位上。

这里如果用数据库来理解,我们可以动用到分布式数据库,通过分布式数据库中不同的数据的打散到不同的存储系统上,通过代理层和SQL解析路由层,将散落在不同存储位置的数据进行处理在聚合产生结果,这里分布式数据库也有自己的算法将数据进行打散,分布式的存储。

在说到算法,不同的算法的撞车率不同,简单的算法如CRC32撞车率高,如MD5的撞车率就底,但对应使用的CPU的利用率也不同,这就回导致整体程序的运行的效率,最终落地到成本的不同。

那么这里如果产生撞车怎么办,如果让数据库来解决,我们首先想到的就是唯一索引的方式来解决这个问题,这也是为什么不少开发愿意用好多个字段来承接唯一索引,然后他们告诉你这是业务决定的。

如果你就是一个装机DBA,俗称装机侠,你就只能任人宰割,因为就会装个数据库,装个高可用的低端数据库运维知识。

如果是高端的DBA,麻烦就会给他一个方案,我们可以采用POSTGRESQL的虚拟列,MYSQL也有,ORACLE也有,SQL SERVER 也有类似的解决方案(特殊的一个数据类型)。我们可以要求他程序写入数据时通过多个字段的组合+算法=一个字段,且这个字段加唯一索引来解决问题。或者如果他说可以接受容错,我们可以通过插入数据的时候通过 replace 法来解决,那些不具有这类功能的数据库,在这个系列里面就自动被去掉了。

此时如果你就会一个数据库,弊端就显现了,你无法满足开发的需求,而被踢出局。

且我并不认为一个只会装数据库和装高可用的是DBA,顶多算一个运维而已,不能和业务绑定且了解数据库如何满足业务的设计的DBA,都是可以被替代且低端的。

下面我们出一道题

在高并发中,如果应用程序在数据写入时无法保证数据的唯一性,要求数据库保证业务数据的唯一性,ORACLE ,SQL SERVER ,MYSQL ,POSTGRESQL ,MOGODB 分别如何满足需求,共同方案是什么,差异方案是什么。


公用方案:(5种数据库)

1 采用表的主键或唯一索引机制 2 多键值的情况下,可以采用算法(程序也可,数据库虚拟列也可),来产生一列数据作为多键值唯一索引的结题方案。 3 不将这个问题放到传统数据库,利用REDIS的特性,将数据写入REDIS set类型来实现去重,最后通过数据定期刷入到数据表中解决问题,完成去重。 (第三种方案需要根据业务逻辑情况应用)

私用方案:(无锁方案适合高并发)

ORACLE 通过merge into的方式将最后一个更新的数据写入到数据表中(在最后一个数据有效的业务中使用,如果是第一个数据有效的情况,则采用公用发,且通过捕获异常法来发现是否有多次插入键值重复的错误给应用程序)

SQL SERVER 通过 row version的机制,来发现一行中是否因为数据被更新而产生变化,使用方式为程序获得SQL SERVER中的rowversion列的数据后,在开始更新,当在此读到这个行的rowversion时发现值变化了,则说明行有冲突且行被更新的了,剩下的是程序来判断下一步该如何做了。

MYSQL 通过两个语法,insert ignore / replace into 的方式来去完成两种业务对重复数据库的要求。

POSTGRESQL 通过insert on conflict do update 或者 do noting 的不同方式来满足业务对于重复数据的业务要求。

MongoDB 通过findAndModify + 唯一索引的方式来解决问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-27,如有侵权请联系 cloudcommunity@tencent 删除高并发架构师数据数据库dba