愈来愈多的企业选择上云,最基础的云服务就是IaaS(Infrastructure as a Service)服务,直观理解就是虚拟主机,用户不用再自建机房,本身购买服务器,而是直接向云厂商购买虚拟主机服务ECS(Elastic Compute Service),按时按量付费。对于数据库而言,将数据库能力集成进来,就是DaaS(Database as a Service)服务,我这里主要讨论RDS(Relational Database Service)。由于目前主流云厂商在数据库领域,除了基础的RDS服务,还有新型分布式数据库服务,好比Amazon的Aurora,阿里云的PolarDB等。因此对于用户而言,他们选择在云上使用数据有两种方式,一种是本身买ECS,本身搭建数据库服务;另一种方式是,直接购买RDS服务。本文主要讨论RDS的链路,RDS链路中的核心组件SLB转发模式,以及RDS中proxy的做用,最后还会提到RDS的高可用解决方案。html
简单说明下,云上并不提供单独买一个RDS的服务,由于这种场景没法提供高可用能力,因此通常购买数据库服务时,会同时带上SLB做为一套总体解决方案。SLB本质就是基于LVS的改进,LVS工做在IOS七层网络模型的TCP/IP层,属于4层负载均衡。利用IP,Port映射转发能力,提供高可用,负载均衡等能力,RDS正是借助SLB来实现RDS的高可用和负载均衡等能力。LVS主要有几种工做模式,DR模式,NAT模式,FULL-NAT模式,IP-TUN模式以及咱们阿里云优化的ENAT模式。数据库
核心逻辑:本质是2层转发,SLB-Server与RDS共享一个IP,通过SLB-Server时,SLB-Server将mac地址改成目标RDS的mac地址,将请求包转给真实的RDS;回包时不用通过SLB-Server,DR模式要求SLB和RDS须要配置相同的VIP地址。后端
核心逻辑:client端不感知RDS真实地址;发包通过SLB时,dip(dest_ip)会被替换成RDS的ip,请求包返回通过SLB时,再将回包源地址改成vip。对比DR模式,请求和回报都须要通过SLB-Server,RDS的ip再也不须要是公网地址;与DR模式相同的是,SLB和RDS须要在同一个局域网内。服务器
核心逻辑:本质是4层转发,请求通过LVS时,LVS请求的(IP,Port)替换成真实RDS的(IP,Port),回包时,再通过LVS,将回包的源地址改成LVS的(IP,Port),LVS与RDS再也不要求在同一个局域网内。全部请求的来回都要通过LVS,效率比较低。网络
核心逻辑:ENAT模式解决了来回包都要通过LVS问题,具体而言,LVS接收请求后,修改包地址时,会将用户的CIP地址冗余在网络包中,回包时,将包改成(vip,cip),这样就不用再通过LVS了。app
经过引入SLB,RDS已经具有了高可用的能力,但因为SLB是工做在4层负载均衡,对于应用层协议没法感知,因此当发生主备切换时,全部已经链接在old-master的链接都须要被断掉,对用户来讲,就是链接发生了闪断,对于没有重连机制的业务简直就是灾难。引入proxy后,则能有效解决这种问题。切换过程当中,对于old-master会等待事务完成,而新的请求则会路由到new-Master。负载均衡
核心逻辑:本质是7层转发,proxy模拟实现MySQL协议,应用实际是链接proxy,proxy再链接RDS,转发SQL给RDS,并将结果集转发回传给应用。分布式
RDS链路类型优化 |
优点阿里云 |
缺陷 |
App+ECS(DB)自建 |
成本低 |
用户我的负责数据库的容灾、备份、恢复、监控、迁移 |
App+lvs+DB |
无需通过proxy转发,RT短,具有高可用能力 |
没法解决闪断问题,也不容易实现读写分离等高级功能 |
App+lvs+Proxy+DB |
功能丰富,包括防SQL注入,读写分离,链接池等。 |
多一跳proxy,增长RT。 |
proxy中间件引入使得RDS除了具有必要的高可用能力,还能实现更多的高级功能,包括读写分离,链接池,防SQL注入,防闪断等,这部分能力的获取是经过牺牲必定RT来得到的。实际上,中间件有两种模式,一种是client模式,一种是server模式,集团的TDDL和云上的Proxy就是两种典型表明。client模式要求与语言强绑定,好比TDDL中间件以jar包的模式打进用户的应用,只支持JAVA语言,这对于云上业务确定是不可行的,毕竟如今用PHP,Python写后端的应用也很是多。另一点是,client模式会致使链接数随着client的个数同比例增长,这带来的影响是到后端DB的链接数增长,client模式的好处是不用通过proxy这一跳,RT更好;而server模式则能有效控制到后端DB的链接数,可是整个链路增长了一层,也就增长了一层风险,Proxy自身的高可用也须要严格保证,确保整个链路的可用性。至于功能层面的,好比读写分离,链接池,防SQL注入等功能,两种都是能够实现的。
云上售卖的数据库都是传统的数据库包括MySQL,PostgreSQL,SQLServer等都是单机数据库,因此数据库的高可用还须要依赖于外部的HA组件。