乐趣区

关于微服务:设计数据库集群读写分离并非易事

灵魂拷问:

  • 解决数据库读写瓶颈有哪些解决方案呢?
  • 这些计划解决了什么问题呢?
  • 这些计划有那些劣势和劣势呢?

一个能够抵制高并发流量零碎的背地必然有一个高性能的数据库集群,就像每一个胜利的男人背地总有一个强势的女人一样。数据库集群在部署模式上属于分布式,然而 CAP 准则却不适用于分布式数据库,具体起因可见之前文章:、

艰涩难懂的 CAP,是否完全正确?

要想实现数据库读写的高性能,目前针对写操作的优化计划次要有分库分表以及采纳 IO 更优的设施来辅助,具体可见之前的文章:

做好分库分表其实很难之一

做好分库分表其实很难之二

用 NOSql 给高并发零碎减速

分库分表作为一种广泛的解决方案,简直曾经成为面试者吹水的利剑,却很少有人在意它所带来的副作用。其实分库分表是利用了分治的思路来解决数据库的瓶颈问题,这种计划同时解决了并发读和并发写的瓶颈,利用数据分片的形式,以沉积硬件的形式来抵制了高流量的冲击,当然带来了某些业务须要跨库查问,跨表 join 等问题,不过这些问题总能以别的解决方案来应答。

数据库读写拆散是解决数据库性能瓶颈的另外一个计划,和分库分表计划相比拟,他们有着实质的区别。分库分表会把数据扩散在多个库表中,而后利用数据分片的规定来读取和写入数据,而读写拆散是利用“冗余”的形式来应答大流量的冲击。

读写拆散原理

读写拆散的基本原理是将数据读写扩散到不同的数据库节点上,写操作个别只产生在主节点,能够承受大量提早的读操作产生在从节点上

至于读写拆散的实现形式:

  • 多台数据库服务器组件成集群,并配置主从关系
  • 主节点负责读写操作,从节点只负责读操作
  • 主节点通过数据复制机制,把数据从主节点同步到所有的从节点
  • 业务方利用程序或者中间件把写操作发送给主节点,将读操作发送给从节点

读写拆散劣势

个别的零碎都会满足 28 准则,既:80% 的操作是读操作,20% 的操作是写操作。零碎的读操作占比越大,读写拆散的劣势就越发显著,因为读操作能够通过简略的减少数据库从节点来解决,当然从节点的减少并不是毫无限度,当从节点达到肯定数量的时候,必然会影响主从同步的效率,会升高主节点的性能,这个时候须要思考一致性和可用性的均衡问题了。

另外一点,在很多业务中都会有肯定的数据统计需要,单机数据库的时候,这些统计需要执行的 sql 和业务 sql 混合在一起,在肯定水平上会影响失常业务的运行,尤其是那些数据量比拟大的业务场景。在做了读写拆散的策略之后,统计业务齐全能够独占一个从库来进行统计,就算是比拟耗时的操作,也不会影响失常的业务运行。

数据库的读写拆散计划在所有读操作场景中,施展了最大劣势

读写拆散劣势

数据库读写拆散有一个很多零碎都会遇到的问题,那就是有些业务在写操作胜利之后须要实时的读取到数据,可是数据从主节点同步到从节点是有肯定时间延迟的,所以很多状况下业务方在从节点并不能实时的读取到正确的数据,这种业务场景其实就是主节点也须要提供读操作的典型场景,当然如果零碎架设的有缓存模块,在主节点写操作胜利之后能够同步更新缓存,以达到业务须要实时数据的要求。

路由机制

读写拆散在写操作上有着严格的要求,写操作必须产生在主节点上,因为读写拆散是基于中心化的思维来建设的集群,中心化的思维要求主节点上的数据必须是最新且最全的。这就要求调用方必须要辨别出主节点才能够。

  • 代码封装

用程序代码封装读写拆散逻辑须要在代码中形象出一个数据拜访层,在这一层中实现操作拆散以及数据库的连贯治理等。

用代码封装读写拆散逻辑在落地上并非易事,须要通过很长时间的测试才能够上生产环境。如果公司外部存在多个语言的开发团队,每个语言可能都须要实现一次,开发量还是比拟大的。然而在针对不同的业务中,能够做到定制化的需要,在落地过程中还须要思考如果主从产生切换,代码中必须要有相似选举的过程。

  • 数据库中间件

数据库中间件是指基于数据库提供的 SQL 协定来开发的一套和具体业务无关的零碎,它的作用也是实现操作拆散和数据库的连贯治理等,它同样也是对读写拆散的一个形象层,然而这个形象层是基于数据库协定的,对于业务的应用方来说,就像拜访单个数据库一样不便。

同步提早

任何分布式的零碎都逃不过一致性的问题。数据库的主从架构也是一样,产生在主节点的操作须要同步给每个从库。像 MySQL 的主从复制是依赖于 binlog 的,主从复制就是将 binlog 中的数据从主库复制到从库上,个别这个过程都会采纳异步的形式,因为在网络提早的状况下,如果采纳同步形式会大大降低主库的可用性。

在 binlog 的复制过程中,极低的概率会产生 binlog 还没有来得及刷新到磁盘就呈现磁盘坏掉或者 down 机的状况,最终的成果就是主从数据的不统一,然而这种不可抗拒的因素,个别是能够容忍的。

还有一种景象,个别数据从主节点复制到从节点会开启单线程模式,如果主库产生新数据的速度大于同步的速度,那有可能会进一步加大主从同步的延迟时间,这个是否能够思考开启多线程或者利用缓存模块来屏蔽同步提早的问题呢?

主备计划

说到数据库主从的架构部署形式,还有一种相似的计划:主备。主备是利用冗余一个节点来做备用节点,然而这个节点在主节点失常运行的状况下,不会对外提供服务,做了一个真正的“备胎”。当主节点挂掉,备用节点会代替主节点的地位,并成为主节点开始对外提供服务。

主备形式能够利用简略的相似 keepalive 机制来实现自动化,实践上不须要进行选举操作。利用主备形式来实现数据库高可用有哪些特点呢?

  • 可用性是利用 keepalive 机制来保障的,这个切换过程对业务是通明的,业务方无需批改任何代码
  • 读写都在主库上进行,很容易产生单点的瓶颈问题,因为没有其余节点的数据同步过程,所以数据能够保障一致性
  • 主备架构中,备库只是单纯的备份,整体的资源利用率 50%,因为备库始终在被闲置
  • 扩展性比拟差,无奈做到横向扩大,然而能够利用分库分表来解决扩展性问题

一主一备或者一主多备计划在资源的利用率上很低,所以起初呈现了多主的架构,多主架构是指,会存在多个主库,每个主库都提供读写性能,这就波及到多个主库之间数据同步的形式,尽管性能上要比一次要高,然而数据一致性上很难搞。所以很多互联网公司并不举荐应用这种计划。

写在最初

数据库的扩大因为其属于有状态的领域,所以比无状态的网站或者服务要艰难很多。当初支流的落地计划也都是基于“分”的策略,分库分表计划和主从读写拆散计划是两种最罕用的扩大形式,在很多状况下,二者是联合起来应用的,即:在分库分表的状况下,每个节点采纳主从读写拆散的形式,这也是目前比拟支流的形式了。

更多精彩文章

  • 分布式大并发系列
  • 架构设计系列
  • 趣学算法和数据结构系列
  • 设计模式系列

退出移动版