云上RDS架构

摘要:
SLB转发模式是RDS链路的核心组件。RDS链接1。app+云服务器(DB)自建2。app+lvs+DB简单描述下,RDS使用SLB实现RDS的高可用性、负载均衡等功能。在DR模式下,SLB和RDS需要配置相同的VIP地址。2.2 NAT模式(NetworkAddressTranslation)核心逻辑:RDS IP不再需要是公共地址;SLB和RDS需要在同一局域网中。

概述

越来越多的企业选择上云,最基础的云服务就是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的高可用解决方案。

RDS链路

1. app+ECS(DB)自建

云上RDS架构第1张

2. app+lvs+DB

云上RDS架构第2张 

云上RDS架构第3张

简单说明下,云上并不提供单独买一个RDS的服务,因为这种场景无法提供高可用能力,所以一般购买数据库服务时,会同时带上SLB作为一套整体解决方案。SLB本质就是基于LVS的改进,LVS工作在IOS七层网络模型的TCP/IP层,属于4层负载均衡。利用IP,Port映射转发能力,提供高可用,负载均衡等能力,RDS正是借助SLB来实现RDS的高可用和负载均衡等能力。LVS主要有几种工作模式,DR模式,NAT模式,FULL-NAT模式,IP-TUN模式以及我们阿里云优化的ENAT模式。

2.1 DR模式(Direct Routing)

核心逻辑:本质是2层转发,SLB-Server与RDS共享一个IP,经过SLB-Server时,SLB-Server将mac地址改为目标RDS的mac地址,将请求包转给真实的RDS;回包时不用经过SLB-Server,DR模式要求SLB和RDS需要配置相同的VIP地址。

云上RDS架构第4张

云上RDS架构第5张

2.2 NAT模式(Network Address Translation)

云上RDS架构第6张

云上RDS架构第7张

核心逻辑:client端不感知RDS真实地址;发包经过SLB时,dip(dest_ip)会被替换成RDS的ip,请求包返回经过SLB时,再将回包源地址改为vip。对比DR模式,请求和回报都需要经过SLB-Server,RDS的ip不再需要是公网地址;与DR模式相同的是,SLB和RDS需要在同一个局域网内。

2.3 FULL NAT模式

云上RDS架构第8张

核心逻辑:本质是4层转发,请求经过LVS时,LVS请求的(IP,Port)替换成真实RDS的(IP,Port),回包时,再经过LVS,将回包的源地址改为LVS的(IP,Port),LVS与RDS不再要求在同一个局域网内。所有请求的来回都要经过LVS,效率比较低。

2.4 ENAT模式(Enhance NAT,三角模式)

云上RDS架构第9张

核心逻辑:ENAT模式解决了来回包都要经过LVS问题,具体而言,LVS接收请求后,修改包地址时,会将用户的CIP地址冗余在网络包中,回包时,将包改为(vip,cip),这样就不用再经过LVS了。

3. app+lvs+proxy+DB

云上RDS架构第10张

通过引入SLB,RDS已经具备了高可用的能力,但由于SLB是工作在4层负载均衡,对于应用层协议无法感知,所以当发生主备切换时,所有已经连接在old-master的连接都需要被断掉,对用户来说,就是连接发生了闪断,对于没有重连机制的业务简直就是灾难。引入proxy后,则能有效解决这种问题。切换过程中,对于old-master会等待事务完成,而新的请求则会路由到new-Master。

核心逻辑:本质是7层转发,proxy模拟实现MySQL协议,应用实际是连接proxy,proxy再连接RDS,转发SQL给RDS,并将结果集转发回传给应用。

4.主要优缺点对比

RDS链路类型

优势

缺陷

App+ECS(DB)自建

成本低

用户个人负责数据库的容灾、备份、恢复、监控、迁移

App+lvs+DB

无需经过proxy转发,RT短,具备高可用能力

无法解决闪断问题,也不容易实现读写分离等高级功能

App+lvs+Proxy+DB

功能丰富,包括防SQL注入,读写分离,连接池等。

多一跳proxy,增加RT。

Proxy中间件 VS TDDL 中间件

proxy中间件引入使得RDS除了具备必要的高可用能力,还能实现更多的高级功能,包括读写分离,连接池,防SQL注入,防闪断等,这部分能力的获取是通过牺牲一定RT来获得的。实际上,中间件有两种模式,一种是client模式,一种是server模式,集团的TDDL和云上的Proxy就是两种典型代表。client模式要求与语言强绑定,比如TDDL中间件以jar包的模式打进用户的应用,只支持JAVA语言,这对于云上业务肯定是不可行的,毕竟现在用PHP,Python写后端的应用也非常多。另外一点是,client模式会导致连接数随着client的个数同比例增加,这带来的影响是到后端DB的连接数增加,client模式的好处是不用经过proxy这一跳,RT更好;而server模式则能有效控制到后端DB的连接数,但是整个链路增加了一层,也就增加了一层风险,Proxy自身的高可用也需要严格保证,确保整个链路的可用性。至于功能层面的,比如读写分离,连接池,防SQL注入等功能,两种都是可以实现的。

RDS高可用

云上售卖的数据库都是传统的数据库包括MySQL,PostgreSQL,SQLServer等都是单机数据库,所以数据库的高可用还需要依赖于外部的HA组件。

云上RDS架构第11张

云上RDS架构第12张

参考文档

https://my.oschina.net/yunqi/blog/3069510

免责声明:文章转载自《云上RDS架构》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇二维vector的使用【转载】JExcelApi(JXL)学习笔记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Oracle11g】06_网络配置

目录 1.Oracle11g在windows上访问的两种方式 1.1 通过网络访问 1.2 本地直接访问 2.客户端访问服务器 2.1 监听相关内容2.1.1 listener.ora的作用 2.2 sqlnet.ora的作用 2.2.1 SQLNET.AUTHENTICATION_SERVICES参数 2.2.2 NAMES.DIRE...

刘强东,揭开京东未来盈利迷局

近期刘强东在内部培训时口出豪言,“赚取千亿利润才叫赚钱,一年三四十个亿也能叫赚钱?”由此引发业界热议,也有一些人质疑“京东还在烧钱和亏损,就喊出要盈利千亿。是吹牛”。 一鲨想说的是,假设你深入分析一下京东的成长之路以及刘强东的未来谋划,你就会发现那些所谓的质疑都无法站得住脚。京东未来盈利千亿也并不是仅仅是梦想。 京东的亏损源自重模式 事实上对京...

Oracle数据库之二 Oracle的下载与安装

二、Oracle 的下载与安装 2.1、Oracle 简介 Oracle 公司是全球最大的信息管理软件及服务供应商,成立于 1977 年,主要的业务是推动电子商务平台的搭建。Oracle 公司有自己的服务器、数据库、开发工具、编程语言,在行业软件上还有企业资源计划(ERP)软件、客户关系管理(CRM)软件、人力资源管理软件(HCM)等大型管理系统,所以...

phpmyadmin教程:使用phpmyadmin创建用户

phpmyadmin作为管理Mysql数据库的利器,越来越受到PHP网站开发建设者的欢迎,在此之前我介绍了两篇phpmyadmin入门教程:phpmyadmin3安装配置图解教程和允许phpmyadmin空密码登录的配置方法,今天继续phpmyadmin教程学习,介绍如何使用phpmyadmin创建添加新用户进行用户权限设置以及如何使用phpmyadmin...

Mongodb学习总结(2)——MongoDB与MySQL区别及其使用场景对比

对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL数据库。它们各有优点,关键看用在什么地方。 什么情况下,MongoDB是最好的选择? 很多人认为MongoDB难以置信的强大,是一个可扩...

微服务架构 SpringBoot(二)

第二天内容:想来想去玩个ssm小demo吧1.创建表 2..引入相关mybatis 数据库jar: <!--mybatis --> <dependency>   <groupId>org.mybatis.spring.boot</groupId>   <artifactId>mybatis-s...