怎么理解数据库的分库分表、读写分离问题

发布时间:2021-11-16 17:58:12 作者:iii
来源:亿速云 阅读:194

这篇文章主要介绍“怎么理解数据库的分库分表、读写分离问题”,在日常操作中,相信很多人在怎么理解数据库的分库分表、读写分离问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解数据库的分库分表、读写分离问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、为什么要用分库分表

当不使用分库分表的情况下,系统的性能瓶颈主要体现在:

而分库分表正是为了解决这些问题,提高数据库读写并发量,磁盘容量大大提高,单表数据量降低,提高查询效率。

二、垂直拆分和水平拆分

以表的维度来说:

以库的维度来说:

所以,我们平常说的分库分表,一般都是指的水平拆分

三、分库分表工具

主要关注MyCat和sharding-jdbc。

两者对比:

四、分库分表的两种策略

这里,我认为最好的分法是hash分库、range分表。因为对库来说重要得是负载要均衡,对表来说重要的是可以动态扩容。

五、分库分表数据迁移方案

停机分库分表

方案很简单,就是停机维护时,用后台临时程序基于数据库中间件将老库数据直接分发到需要迁移的数据库

此方案的主要缺点是一定会出现几个小时的停机,如果没搞定要回滚,第二天继续搞,开发人员心是慌得。

不停机双写方案

主要步骤:

该方案解决了停机造成的服务不可用。

六、分库分表下的动态扩容问题

在分库分表的情况下,如何在已经分库分表的基础上进一步分库分表提高系统效率,是一个麻烦的问题。特别是基于hash分片的服务器,再次分库分表,一般只能对服务器进行停机,然后将所有数据又基于新的规则插入到不同的库与表。为了避免这种问题,可以在第一次分库分表的时候就将库切分的较细,避免二次扩容。比如:

七、全局id的生成策略

几种生成id的方式对比:

往公用的一张表(这张表是自增主键)插入一条数据,获取id的返回值,用这个id再去插入中间件当中去。oracle可以通过自增序列。

缺点:不适合并发高的场景,毕竟不管是自增序列还是采取自增键的方式来生成,会并发竞争写锁,效率太低。

缺点:uuid太长了,不规则

一般联合其他业务字段拼接作为一个Id,如时间戳+用户id+业务含义编码

缺点:并发高容易重复

怎么理解数据库的分库分表、读写分离问题

原理:前面1位为定值0+41位为时间戳+5位机房id+5位为机器id+12位为序号,唯一需要保证同步的地方是生成一个序号,锁粒度较低。另外这个算法可用于分布式环境中。最大的优点是不需要依赖任何中间件,核心原理是用5位机房id,5位机器id标志了唯一一台机器,所以不需要分布式锁去保证不同机器生成id的同步性,只需要在当前机器保证生成的序号不一样就行了。

原理:利用redis单线程工作线程属性去维护一个自增变量。

八、读写分离

为什么要读写分离

读写分离的实现方式

一般来说是基于mysql自带的主从复制功能。mysql主从复制的流程图如下:

怎么理解数据库的分库分表、读写分离问题

总结mysql的主从复制过程大体是主库有一个进程专门是将将记录的Binlog日志发送到从库,从库有一个io线程(5.6.x之后IO线程可以多线程写入relay日志)将收到的数据写入relay日志当中,另外还有一个SQL进程专门读取relay日志,根据relay日志重做命令(5.7版本之后,从可以并行读取relay log重放命令(按库并行,每个库一个线程))。

主从同步的三种模式:

异步模式如下图所示,这种模式下,主节点不会主动push bin log到从节点,这样有可能导致failover的情况下,也许从节点没有即时地将最新的bin log同步到本地。

怎么理解数据库的分库分表、读写分离问题

这种模式下主节点只需要接收到其中一台从节点的返回信息,就会commit;否则需要等待直到超时时间然后切换成异步模式再提交;这样做的目的可以使主从数据库的数据延迟缩小,可以提高数据安全性,确保了事务提交后,binlog至少传输到了一个从节点上,不能保证从节点将此事务更新到db中。性能上会有一定的降低,响应时间会变长。如下图所示:

怎么理解数据库的分库分表、读写分离问题

全同步模式是指主节点和从节点全部执行了commit并确认才会向客户端返回成功。

读写分离场景下主从延迟可能导致的问题

在代码中插入之后,又查询这样的操作是不可靠,可能导致插入之后,查出来的时候还没有同步到从库,所以查出来为null。如何应对这种情况了?其实并不能从根本上解决这种情况的方案。只能一定程度通过降低主从延迟来尽量避免。

降低主从延迟的方法有:

但这并不能根本性解决这个问题,其实面对这种情况最好的处理方式是:

到此,关于“怎么理解数据库的分库分表、读写分离问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. Mycat实现MySQL的分库分表、读写分离、主从切换
  2. Mycat简单实现读写分离与分库分表

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

数据库

上一篇:服务器集群容错是什么

下一篇:jquery如何获取tr里面有几个td

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》