目录

RDS Proxy定义

RDS Proxy实用功能

连接转发功能

连接池功能

IAM功能

故障转移功能

连接转发功能实现

场景1

场景2


RDS Proxy定义

RDS Proxy,定义为RDS的中间代理,致力于实现一些RDS当前不具备的功能或者解决RDS当前不易解决的问题。例如,在MySQL中,不易管控连接突增问题,不易按特定需求 (如:只审计DELETE操作) 定制审计功能。

RDS Proxy实用功能

我罗列了几个实用、不需要过多编码即可实现的功能:

连接转发功能

连接转发,做的事情很简单,将客户端的连接通过Proxy转发的DB   Server。该功能在做拆库,做设备裁撤很有用处。

连接池功能

连接池,可控制透传到DB Server的连接数,减轻DB连接压力。

IAM功能

IAM, 全称Identify and Access Manangement, 身份认证管理。通过Proxy,     可实现一种常用场景:

DBA/研发通过企业个人账号,通过Proxy,Proxy与公司IAM互通,

自动校验账户的身份,来决定是否转发请求到DB Server。

这样,就不用在每个DB上去管理单独的个人账户,减少因人员更替带来的      账号管理不善风险。

故障转移功能

故障转移,也就是通过Proxy实现DB Server的HA能力,对应用透明。

连接转发功能实现

本文主要介绍连接转发功能,其他功能后续序列中介绍。

先说说为什么需要这个功能。

场景1

在遇到机房裁撤或者DB Server机器跨机房搬迁时,如没有内部DNS服务,会涉及到DB地址的变更。DB地址变更后,需要业务配置做变更。为保证安全性,需要客户端业务侧一次性全部正确更改,如涉及多个业务,需要多个业务协同更改,难度极大。此时,。

参考上图,使用RDS Proxy, 可以更安全地实现APP搬迁请求至新DB,步骤:

1. 使用RDS Proxy,Proxy请求转发至old DB。APP侧可以逐步更改DB配置文件,将DB请求转至Proxy。

2. 等待应用侧全部更改请求至RDS Proxy。(如何判断? 下图中,如果old DB还有非 10.11.1.2的连接,代表未改完。可以通过设置long_query_time=0, 开慢查询日志检测)。

3. 同步完成,校验完数据后,将RDS Proxy指向新DB。

4. APP侧可以逐步将DB配置文件,改回新DB。

场景2

接下来看看如何实现DB Proxy的转发功能,此处使用golang作为编程语言,mysql作为后端RDS。

关键流程为:

1. 在Proxy上监听1个端口,用来接收客户端请求。

// listener为监听的对象,可读取客户端发送的数据,也可响应给客户端。
// 假设Proxy监听端口在 8080上。客户端直接访问Proxy IP+该端口,即可连接到Proxy
listener, err := net.Listen("tcp", "0.0.0.0:8080")

2. 通过goroutine不断地获取监听到的数据,然后持续连接到目标DB。

// 伪代码示例
for {// 通过Accept不断读取客户端数据。conn,err := listener.Accept()if err != nil {continue}go connDestDB(conn)
}// connDestDB:与目标DB交换数据包
func connDestDB(conn net.Conn) {dbConn,err := net.Dial("tcp", "10.11.1.1:3306")// 这里的readPackage,代表DB侧返回的初始认证包// 官方描述整个过程为 Initial Handshake: starts with server sending the Initial Handshake Packet.// and then client sends the Handshake Response Packet.// 这里面官方文档在Protocol::Handshake中没有体现出4字节包头,实际上存在header,handshake := readPackage(dbConn)// 发送给客户端,要求完成认证conn.Write(header)// handshake中为官方文档Protocol::HandshakeV10的内容。conn.Write(handshake)
}// readPackage 读取DB交互过程中的数据包处理逻辑(伪代码)
func readPackage(conn net.Conn) ([]byte,[]byte,error)  {header := []byte{0, 0, 0, 0}rb := bufio.NewReaderSize(conn, 8*1024)// 4字节为mysql包头,前3字节代表包长度,后1字节为sequence ID.if _, err := io.ReadFull(rb, header); err != nil {return nil,nil,err}// 网络字节序,小端存储。length := int(uint32(header[0]) | uint32(header[1])<<8 | uint32(header[2])<<16)data := make([]byte, length)handshake := io.ReadFull(rb, data)return header, handshake,nil
}

3. 客户端数据包与DB进行交互,完成Handshake认证后,即可完成连接建立。

// 同样滴, 在我们将客户端的HandshakeResponse发送给服务端
header,data := readPackage(conn)
dbConn.Write(header)
dbConn.Write(data)// 持续不断地获取MySQL Server返回的结果,Copy是指的从右到左复制
go func() {_, err = io.Copy(conn, dbConn)if err != nil { //客户端exit,则退出return}
}// 可以继续接收客端后续的SQL请求
for {//正常会在连接成功后,客户端发送select @@version_comment limit 1_,_,err := readPackage(conn)//无法从客户端获取到数据,可能是账号认证失败了。if err != nil {return}
}

rds proxy 数据库代理 简介相关推荐

  1. 阿里云ECS代理访问阿里云RDS MySQL数据库

    一.前言 阿里云RDS数据白名单一般只对内部的服务器开放,一般不会开放给外网直接访问,有时开发需要直接访问RDS数据库,平时我们使用的网络都是动态公网IP,经常会变化,设置白名单相对繁琐一点.想了一个 ...

  2. Discuz!无法连接阿里云RDS数据库代理问题的处理方案

    很多站长在使用RDS开启了数据库代理之后,使用数据库代理连接发现一直是无法连接的(1045 notconnect). 经过仔细阅读阿里云数据库代理文档:https://help.aliyun.com/ ...

  3. MySQL数据库代理技术

    代理技术 代理技术 实验 实验1 实验2 代理技术 代理简介:DB Proxy,数据库中间件 功能: 读写分离 M-S-S M-M-S-S, 负载均衡 支持数据的分片自动路由与聚合 现在主要产品: M ...

  4. Proxy 动态代理 InvocationHandler CGLIB MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  5. 阿里云RDS金融数据库(三节点版) - 案例篇

    原文链接 摘要: 标签 PostgreSQL , MySQL , 三节点版 , 金融数据库 , Raft , 分布式共享存储版 背景 土豆哪里去挖? 土豆郊区去挖. 一挖一麻袋? 一挖一麻袋. 挖掘机 ...

  6. Amoeba数据库代理 实现mysql读写分离

    Amoeba   依赖jdk centons7安装jdk8 目前Amoeba for Mysql最新版本为amoeba-mysql-3.0.5-RC-distribution.zip. 安装过程很简单 ...

  7. Nginx做HTTP代理、邮件服务器代理、数据库代理

    一.背景 最近公司在做网络安全整改,对大数据环境的网络安全要求更高,要求所有的大数据环境的机器不能访问外网,但是可以访问公司的非大数据环境的其他服务器.我们组有四台单独的机器在大数据环境中,相关的py ...

  8. 图数据库Neo4j简介

    图数据库Neo4j简介 转自: 图形数据库Neo4J简介 - loveis715 - 博客园 https://www.cnblogs.com/loveis715/p/5277051.html 最近我在 ...

  9. 如何分表分库 Mycat 与shadingjdbc 区别? Mycat 是基于服务器端的形式实现数据库代理 基于服务器端的形式 改写sql语句 shadingjdbc 基于客户端 改写sql语

    如何分表分库 Mycat 与shadingjdbc 区别? Mycat 是基于服务器端的形式实现数据库代理 基于服务器端的形式 改写sql语句 shadingjdbc 基于客户端 改写sql语句的形式 ...

最新文章

  1. 2021年大数据Spark(三十三):SparkSQL分布式SQL引擎
  2. 虚幻引擎5:从零开始的蓝图近战AI学习教程
  3. Servlet 服务器端小程序
  4. 一套完整的3D结构光系统搭建指南!
  5. jdbc封装mysql_用Java手动封装JDBC连接池(一)
  6. js模板引擎——art Template
  7. jqgrid如何渲染表格数据_Jqgrid入门-操作表格的数据(二)
  8. linux下怎么监控网络 io swap,监控io性能,free命令,ps命令,查看网络状态,linux下抓包...
  9. 关于RAID与SCSI的一些基本概念(一)
  10. 爬kuku漫画网站的小爬虫
  11. 知识竞赛时,倒计时字体的大小和位置如何调整?
  12. SpringBoot连接Gbase数据库
  13. win7系统更换锁屏壁纸
  14. .netcore下使用Chloe.ORM框架
  15. CSDN如何修改用户名(CSDN ID)、用户昵称以及自定义博客域名等
  16. 给腾讯云主机上配置SFTP
  17. 分享几个css素材的网站
  18. 史上最人性化的U型枕,再也不用担心睡不好了!
  19. 非常详细的优化问题求解器列表
  20. 如何在elementUi动态表格table中翻译字典值。vue通用方案

热门文章

  1. (附源码)ssm产品裂变管理系统 毕业设计 100953
  2. 程序员他们也可以很可爱幽默
  3. ESP8266之TFT_eSPI库的自定义字体
  4. 4-10 阶乘计算升级版
  5. 标题:互联网轻松赚钱之道。。
  6. LabVIEW之TDMS学习笔记
  7. 四年级下册计算机课本目录,人教版小学四年级数学教材下册目录;
  8. 用英文给嵌入式计算机下定义,嵌入式课程设计报告--嵌入式系统项目设计.doc
  9. golang的基本语法
  10. 上市企业统计面板数据集(2011-2020年)