》灵魂拷问:解决数据库读写瓶颈的方案有哪些?这些方案解决了哪些问题?这些方案的优缺点?一个能够抵抗高并发流量的系统背后一定有一个高性能的数据库集群,就像每个成功的男人背后总有一个女强人。数据库集群的部署方式是分布式的,但CAP原则并不适用于分布式数据库,分库分表作为一种常见的解决方案,几乎成为了面试官的利剑,却很少有人关心它带来的副作用。事实上,分库分表分表是使用分而治之的思路解决数据库的瓶颈问题,这个方案解决了同时读取并发写入的瓶颈ime,采用数据分片的方式,积累硬件来抵御大流量的冲击,当然带来了一些业务需要的跨库查询,跨表join等问题,但这些问题总能通过其他方式解决解决方案。数据库读写分离是解决数据库性能瓶颈的另一种方案。与分库分表方案相比,它们有着本质的区别。分库分表会将数据分散在多个数据库表中,然后使用数据分片的规则来读写数据,而读写分离则是使用“冗余”的方式来处理大交通影响。读写分离原理读写分离的基本原理是将数据读写分散到不同的数据库节点。写操作一般只发生在主节点上,可以接受少量延迟的读操作发生在从节点镜像上读写分离实现方式:多个数据库服务器组件组成一个集群,配置master-奴隶关系。主节点负责读写操作,从节点只负责读操作。主节点通过数据复制机制将数据从主节点同步到所有从节点服务一方使用程序或中间件向主节点发送写操作,向从节点发送读操作。读写分离的优点一般系统会满足28条原则,即:80%的操作是读操作,20%的操作是写操作系统中读操作的比例越大,越多读写分离的优势很明显,因为只需要增加数据库从节点就可以解决读操作。当然,从节点的增加不是无限的。当从节点达到一定数量时,势必会影响主从同步的效率,降低主节点的性能。这时候就需要考虑一致性和可用性之间的平衡。另外,在很多业务中都会有一定的数据统计需求。单机数据库有时候,这些统计需求执行的sql和业务sql混在一起,一定程度上会影响正常的业务运行,尤其是那些数据量比较大的业务场景。实现读写分离策略后,统计业务可以完全独占一个从库进行统计。即使是耗时的操作,也不会影响正常的业务运营。数据库的读写分离方案在所有的读操作场景中都发挥了最大的优势。数据库读写分离的缺点有一个问题很多系统都会遇到,就是有些业务需要在写操作成功后实时读取。数据,但是数据从主节点同步到从节点有一定的时间延迟,所以很多时候业务方无法在从节点上实时读取到正确的数据。在这种业务场景下,主节点还需要提供读操作的典型场景,当然如果系统配备了缓存模块,主节点写入成功后可以同步更新缓存,以满足实际需求。业务的时间数据要求。路由机制读写分离对写操作有严格的要求,写操作必须发生在master节点上,因为读写分离是基于中心化思想建立的集群,要求数据master节点上的必须是最新最全的。这就需要调用者区分主节点。Codeencapsulation程序代码的封装读写分离逻辑需要在代码中抽象出一个数据访问层,并在该层实现操作分离和数据库连接管理。Image将读写分离逻辑封装在代码中并不容易,需要经过长时间的测试才能用于生产环境。如果公司内部有多个语言开发团队,可能每种语言都需要实现一次,开发量还是比较大的。但是,针对不同的业务,可以实现定制化的需求。在落地的过程中,还要考虑到如果发生主从切换,代码中肯定有类似的选举过程。数据库中间件数据库中间件是指基于数据库提供的SQL协议开发的一套系统,与具体业务无关。它的作用也是实现数据库的操作和连接管理的分离。也是读写分离的一种抽象。层,但是这个抽象层是基于数据库协议的,对于业务用户来说就像访问单个数据库一样方便。图片同步延迟任何分布式系统都无法逃避一致性问题。数据库的主从架构也是如此。主节点上发生的操作需要同步到各个从数据库。像MySQL这样的主从复制依赖binlog。主从复制就是将binlog中的数据从主库复制到从库。一般这个过程会是异步的,因为在网络延迟的情况下,如果使用同步这种方式会大大降低主库的可用性。在binlog拷贝过程中,极小概率会出现磁盘坏掉或者机器宕机的情况,才能够将binlog刷新到磁盘中。最后的结果就是主从数据不一致。是可以忍受的。还有一个现象就是一般的数据从master节点copy到slave节点都会开启单线程模式。如果主库产生新数据的速度快于同步速度,可能会进一步增加主从同步的延迟时间。这可能吗?考虑启用多线程或使用缓存模块来屏蔽同步延迟?主备方案说到数据库主从架构部署,有一个类似的方案:主备。主备就是用一个冗余节点作为备份节点,但是这个节点在主节点正常运行的时候是不会对外提供服务的,是一个真正的“备胎”。当主节点挂掉后,备节点将代替主节点成为主节点开始对外提供服务。active-standby模式可以通过简单的keepalive-like机制实现自动化,理论上不需要选举操作。使用主备方式实现数据库的高可用有哪些特点?可用性由保活机制保证。这个切换过程对业务是透明的,业务方不需要修改任何代码。单点瓶颈问题,由于没有其他节点的数据同步过程,可以保证数据一致比较差,无法实现水平扩展,但是可以采用分库分表的方式解决扩展性问题.一主一备或一主多备方案的资源利用率非常低,所以后来出现了多主架构。主架构是指会有多个主库,每个主库提供读写功能,这就涉及到多个主库之间数据同步的方式。虽然性能比一个主库高,但是数据的一致性很难做到。所以很多互联网公司不推荐使用这个方案。写在数据库末尾的扩展比无状态的网站或服务要难得多,因为它属于状态的范畴。目前主流的实现方案也是基于“拆分”策略。分库分表方案和主从读写分离方案是最常用的两种扩展方式。很多情况下两者结合使用,即:在分库分表的情况下,各节点采用主从读写分离的方式,这是目前主流的方式。本文转载自微信公众号《建筑师实践之路》,可通过以下二维码关注。转载本文请联系架构师修炼之路公众号。
