-->

从0开始学架构_15_14_高性能数据库集群读写分离

你好,我是华仔。

今天我和你分享的主题是高性能数据库集群读写分离从零开始学架构专栏已经更新了十三期,从各个方面阐述了架构设计相关的理论和流程,包括架构设计起源、架构设计的目的、常见架构复杂度分析、架构设计原则、架构设计流程等,掌握这些知识是做好架构设计的基础。

在具体的实践过程中,为了更快更好的设计出优秀的架构,除了掌握这些基础知识外,还需要掌握业界已经成熟的各种架构模式。

大部分情况下呢,我们做架构设计主要都是基于已有的成熟模式,结合业务和团队的具体情况进行一定的优化或者调整。

即使少部分情况,我们需要进行较大的创新,前提也是需要对已有的各种架构模式和技术非常熟悉。

接下来我将逐一介绍最常见的高性能架构模式。

高可用架构模式,可扩展架构模式。

这些模式呢可能你之前大概了解过,但其实每个方案里面都有很多细节,只有深入的理解这些细节才能理解常见的架构模式,进而设计出优秀的架构。

虽然近十年来各种存储技术飞速发展,但关系数据库由于其ACID的特性和功能强大的c口查询,目前还是各种业务系统中关键和核心的存储系统。

很多场景下,高性能的设计,最核心的部分就是关系数据库的设计,不管是为了满足业务发展的需要,还是为了提升自己的竞争力。

关系数据库厂商在优化和提升单个数据库服务器的性能方面也做了非常多的技术优化和改进,但业务发展速度和数据增长速度远远超出数据库厂商的优化速度。

尤其是互联网业务兴起之后,海量用户加上海量数据的特点,单个数据库服务器已经难以满足业务需要,必须考虑数据库集群的方式来提升性能。

从今天开始呢我会分几期来介绍高性能数据库集群。

高性能数据库集群的第一种方式是读写分离,其本质是将访问压力分散到集群中的多个节点,但是没有分散存储压力。

第二种方式是分库分表,既可以分散访问压力,又可以分散存储压力。

先来看看读写分离,下一期我再介绍。

分库分表。

读写分离的基本原理是将数据库读写操作分散到不同的节点上,其基本架构图请点击文稿查看。

读写分离的基本实现是数据库服务器搭建主从集群。

一主一从一主多从都可以数据库主机负责读写操作,从机只负责读操作,数据库主机通过复制将数据同步到从机每台数据库服务器都存储了所有的业务。

数据业务服务器将写操作发给数据库,主机将读操作发给数据库。

从机。

需要注意的是,这里用的是主从集群,而不是主备集群。

从机的从可以理解为仆从。

仆从是要帮主人干活的,从机是需要提供读数据的功能的,而备机一般被认为仅仅提供备份功能,不提供访问功能。

所以使用主从还是主备是要看场景的这两个词并不是完全等同的。

读写分离的实现逻辑并不复杂,但有两个细节,点将引入设计复杂度,分别是主从复制延迟和分配机制。

先来看复制延迟,以mysql为例,主从复制延迟可能达到一秒,如果有大量数据同步延迟,一分钟也是有可能的。

主从复制延迟会带来一个问题,如果业务服务器将数据写入到数据库主服务器后,立刻进行读取。

此时读操作访问的是从机主机,还没有将数据复制过来,到从机读取数据呢是读不到最新数据的业务上就可能出现问题。

例如,用户刚注册完后,立刻登录业务服务器,会提示他,你还没有注册。

而用户明明刚才已经注册成功了,解决主从复制延迟有几种常见的方法,一、写操作后的读操作,指定发给数据库主服务器。

例如,注册账号完成后,登录时读取账号的读操作,也发送给数据库主服务器,这种方式和业务强绑定对业务的侵入和影响较大。

如果哪个新来的程序员不知道这样写代码的话呢,就会导致一个bug.二、读从机失败后再读一次主机,这就是通常所说的二次读取,二次读取和业务无绑定,只需要对底层数据库访问的API进行封装,即可实现代价较小。

不足之处在于,如果有很多二次读取,将大大增加主机的独操作压力。

例如,黑客暴力破解账号会导致大量的二次读取操作,主机可能顶不住读操作的压力,从而崩溃。

三、关键业务读写操作全部指向主机,非关键业务采用读写分离。

例如,对于一个用户管理系统来说,注册加登录的业务读写操作全部访问主机,用户的介绍、爱好等级等业务呢可以采用读写分离。

因为即使用户改了自己的自我介绍,在查询时却看到了自我介绍还是旧的业务,影响与不能登录相比,就小很多,还可以忍受。

分配机制是将读写操作区分开来,然后访问不同的数据库服务器,一般有两种方式,分别是程序代码封装和中间件封装。

程序代码封装指的是在代码中抽象一个数据访问层,实现读写操作分离和数据库服务器连接的管理。

例如基于hiybernet进行简单封装,就可以实现读写分离。

基本架构图请点击文稿,查看程序代码封装的方式,具备这样几个特点,实现简单,而且可以根据业务做较多定制化的功能,每个编程语言都需要自己实现,一次无法通用。

如果一个业务包含多个编程语言写的多个子系统,则重复开发的工作量比较大。

故障情况下,如果主从发生切换,则可能需要所有系统都修改配置并重启。

目前开源的实现方案中,淘宝的TTTR是比较有名的,它是一个通用数据访问层,所有功能封装在JAR包中提供给业务代码调用。

其基本原理是一个基于集中式配置的JDBC data source,实现具有主备读写分离、动态数据库配置等功能。

基本架构图请在文稿中查看。

中间件封装指的是独立一套系统出来实现读写操作分离和数据库服务器连接的管理。

中间件对业务服务器提供c口兼容的协议,业务服务器无需自己进行读写分离。

对于业务服务器来说,访问中间件和访问数据库没有区别。

事实上,在业务服务器看来,中间件就是一个数据库服务器,请参考文稿中的基本架构图,数据库。

中间件的方式具备的特点是能够支持多种编程语言。

因为数据库中间件对业务服务器提供的是标准c口接口,数据库中间件要支持完整的c口语法和数据库服务器的协议实现比较复杂,细节特别多,很容易出现bug,需要较长的时间才能稳定。

数据库中间键自己不执行真正的读写操作,但所有的数据库操作请求都要经过中间键,中间键的性能要求也很高。

数据库主从切换对业务服务器无感知。

数据库中间件可以探测数据库服务器的主从状态,例如像某个测试表写入一条数据,成功的就是主机失败的就是从机由于数据库中间件的复杂度要比程序代码封装高出一个数量级。

一般情况下呢建议采用程序语言封装的方式或者使用成熟的开源数据库中间件。

如果是大公司,可以投入人力去实现数据库中间件。

因为这个系统一旦做好接入的业务,系统越多,节省的程序开发投入就越多,价值也越大。

目前的开源数据库中间件方案中,mysql官方先是提供了mysql proxy,但mysql proxy一直没有正式GA.现在mysql官方推荐mysql routter, mysql routter的主要功能有读写分离、故障自动切换、负载均衡连接池等。

奇虎三六零公司也开源了自己的数据中间件。

Attlas atlas是基于mysql proxy实现的,atlas是一个位于应用程序与mysql之间的中间件在后端DB看来,atlas相当于连接他的客户端前端应用。

看来,atlas相当于一个DB atllas作为服务端与应用程序通信,它实现了mysql的客户端和服务端协议。

同时,作为客户端与mysql通信,它对应用程序屏蔽了DB的细节。

同为为了降低mysql负担,它还维护了连接池。

上面这段呢是官方介绍更多内容,你可以参考文稿中的链接。

今天我为你讲了读写分离方式的原理,以及两个设计复杂度、复制、延迟和分配机制,希望对你有所帮助,这就是今天的全部内容。

留一道思考题给你吧。

数据库读写分离一般应用于什么场景,能支持多大的业务规模呢?欢迎你把答案写到留言区,和我一起讨论。

相信经过深度思考的回答,也会让你对知识的理解更加深刻。