rds proxy 数据库代理 简介
目录
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 数据库代理 简介相关推荐
- 阿里云ECS代理访问阿里云RDS MySQL数据库
一.前言 阿里云RDS数据白名单一般只对内部的服务器开放,一般不会开放给外网直接访问,有时开发需要直接访问RDS数据库,平时我们使用的网络都是动态公网IP,经常会变化,设置白名单相对繁琐一点.想了一个 ...
- Discuz!无法连接阿里云RDS数据库代理问题的处理方案
很多站长在使用RDS开启了数据库代理之后,使用数据库代理连接发现一直是无法连接的(1045 notconnect). 经过仔细阅读阿里云数据库代理文档:https://help.aliyun.com/ ...
- MySQL数据库代理技术
代理技术 代理技术 实验 实验1 实验2 代理技术 代理简介:DB Proxy,数据库中间件 功能: 读写分离 M-S-S M-M-S-S, 负载均衡 支持数据的分片自动路由与聚合 现在主要产品: M ...
- Proxy 动态代理 InvocationHandler CGLIB MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 阿里云RDS金融数据库(三节点版) - 案例篇
原文链接 摘要: 标签 PostgreSQL , MySQL , 三节点版 , 金融数据库 , Raft , 分布式共享存储版 背景 土豆哪里去挖? 土豆郊区去挖. 一挖一麻袋? 一挖一麻袋. 挖掘机 ...
- Amoeba数据库代理 实现mysql读写分离
Amoeba 依赖jdk centons7安装jdk8 目前Amoeba for Mysql最新版本为amoeba-mysql-3.0.5-RC-distribution.zip. 安装过程很简单 ...
- Nginx做HTTP代理、邮件服务器代理、数据库代理
一.背景 最近公司在做网络安全整改,对大数据环境的网络安全要求更高,要求所有的大数据环境的机器不能访问外网,但是可以访问公司的非大数据环境的其他服务器.我们组有四台单独的机器在大数据环境中,相关的py ...
- 图数据库Neo4j简介
图数据库Neo4j简介 转自: 图形数据库Neo4J简介 - loveis715 - 博客园 https://www.cnblogs.com/loveis715/p/5277051.html 最近我在 ...
- 如何分表分库 Mycat 与shadingjdbc 区别? Mycat 是基于服务器端的形式实现数据库代理 基于服务器端的形式 改写sql语句 shadingjdbc 基于客户端 改写sql语
如何分表分库 Mycat 与shadingjdbc 区别? Mycat 是基于服务器端的形式实现数据库代理 基于服务器端的形式 改写sql语句 shadingjdbc 基于客户端 改写sql语句的形式 ...
最新文章
- 2021年大数据Spark(三十三):SparkSQL分布式SQL引擎
- 虚幻引擎5:从零开始的蓝图近战AI学习教程
- Servlet 服务器端小程序
- 一套完整的3D结构光系统搭建指南!
- jdbc封装mysql_用Java手动封装JDBC连接池(一)
- js模板引擎——art Template
- jqgrid如何渲染表格数据_Jqgrid入门-操作表格的数据(二)
- linux下怎么监控网络 io swap,监控io性能,free命令,ps命令,查看网络状态,linux下抓包...
- 关于RAID与SCSI的一些基本概念(一)
- 爬kuku漫画网站的小爬虫
- 知识竞赛时,倒计时字体的大小和位置如何调整?
- SpringBoot连接Gbase数据库
- win7系统更换锁屏壁纸
- .netcore下使用Chloe.ORM框架
- CSDN如何修改用户名(CSDN ID)、用户昵称以及自定义博客域名等
- 给腾讯云主机上配置SFTP
- 分享几个css素材的网站
- 史上最人性化的U型枕,再也不用担心睡不好了!
- 非常详细的优化问题求解器列表
- 如何在elementUi动态表格table中翻译字典值。vue通用方案