Go web 开发数据库管理平台,利用远程过程调用(RPC)实现对MySQL数据库的管理和使用
前言
做DBA,最基本的工作就是需要管理公司的数据库系统。工作中,常常需要维护的数据库数量是非常多的。小公司可能有个几十套,上百套。大一点的公司,甚至可能有上万的数据库实例。对于数据库,如果我们不通过开发或者购买些第三方管理平台,维护工作是一个非常繁重的事情。
因为这个初衷,笔者想开启数据库云平台开发这个项目。
借开发过程中的几个具体问题的思考和实现,分享一些常见的技术问题。
本文主要分享,在go语言中,如何使用grpc框架去开发对MySQL数据库的操作等相关功能。
rpc框架介绍
RPC是(Remote Procedure Call)的简称,英文直译过来就是"远程的过程调用",可以理解为有不同的两个运行操作系统的服务器A和服务器B,从服务器A可以调用服务器B的某些程序的方法,反过来B调用A也是一样的。那么,被调用的一方,我们称它为服务端,调用的一方,也就是命令请求方,我们称它为客户端。
如何实现rpc功能呢?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TBLwTCww-1661345390797)(https://grpc.io/img/landing-2.svg)]
gRPC 是一个现代开源的高性能远程过程调用 (RPC) 框架,在微服务,移动通信,浏览器等场景中有丰富的应用。其丰富的开发语言支持,双向流式传输,身份验证,负载均衡和健康检查都是非常亮眼的功能。
在数据库领域,TiDB的源码中,便用到了大量的gRPC实现不同的功能节点之间的通信。
在众多的面试题中,有大佬也会去问gRPC跟HTTP协议的区别,以及为什么gRPC有更好的性能等,gRPC也是一个面试的热点和难点。
gRPC还是一个CNCF的一个孵化项目,在云原生方向有大量的应用。
关于它的更多的介绍,可以参考grpc官网 https://grpc.io/about/
如何使用gRPC
gRPC通过protobuf实现对数据的传输,关于protobuf的使用,主要是下载安装protobuf的二进制文件,可以参考七米老师的blog
https://www.liwenzhou.com/posts/Go/Protobuf3-language-guide-zh/
七米老师是一个非常优秀的开发者,同时他也是老男孩教育的go语言讲师,笔者的go语言课程就是学自七米老师的bilibili课程。
以上为基本的知识储备,后面是本节的主要内容,我们通过gRPC实现对MySQL的使用操作。
通过gRPC操作MySQL
1、实现各种备份
定义通信消息
首先我们要定义一个MySQLBackUP的server端,将其部署在MySQL所在的节点上。
通过proto3定义grpc通信的message
首先是一个BackUpRequest
的请求消息
message BackupTaskRequest {
MySQLConn MySQLConn = 1; // 备份MySQL的连接信息
BackUpType BackUpType = 2; // 备份类型
}
message MySQLConn {
string MySQLUser = 1;
string MySQLUserpasswd = 2;
string MySQLHost = 3;
uint32 MySQLPort = 4;
}
message BackUpType{
enum Types {
// 物理备份全备
FullBackUpWithXtra = 0;
// 物理备份增备 -- 留个标志 一般不用
IncrBackUpWithXtra = 1;
// 逻辑备份 需要先落地再上传 这种选择节点的时候 看是否找几台中间机器
// 逻辑备份使用mydmper 全备
FullBackUpWithMydumper = 2;
// 逻辑备份使用mudmper 单表
SingleTableBackUpWithMydumper = 3;
// 有些操作系统环境太次了,不支持安装mydumper 使用mysqldump
FullBackUpWithMySQLDump = 4;
SingleTableBackUpWithMySQLDump = 5;
}
Types Type = 1;
}
有了备份的请求消息之后,还需要有一个返回消息来告诉我们任务是否成功,或者作为异步消息,不关心是否成功,通过备份的任务脚本来往其他地方记录备份执行情况
message BackupTaskResponse{
string MessageInfo = 1;
string MessageWarn = 2;
}
接着我们定义备份服务的核心,即备份服务
service MySQLBackupService{
rpc NewBackup(BackupTaskRequest) returns (BackupTaskResponse){};
}
// 这个代码的意思是我们这个备份服务,接收一个备份任务的请求体和返回一个备份服务的返回体,这两个的内容为我们上方定义的消息的内容
有了定义消息之后,我们可以通过proto3工具来为我们生成自动化的代码
protoc --go_out=../pb --go_opt=paths=source_relative \
--go-grpc_out=../pb --go-grpc_opt=paths=source_relative ./*.proto
# 这个的意思是我们的protoc命令行工具会把我们当前目录下的所有的.proto文件编译成go语言的代码
之后我们发现在当前同级目录的pd文件夹下,生成了如下文件
mysqlbackup.pb.go
mysqlbackup_grpc.pb.go
他已经帮我们把相关的消息都整理成go代码了,举例来看这个备份任务请求结构体
type BackupTaskRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
WorkVm *WorkVm `protobuf:"bytes,1,opt,name=WorkVm,proto3" json:"WorkVm,omitempty"`
MySQLConn *MySQLConn `protobuf:"bytes,2,opt,name=MySQLConn,proto3" json:"MySQLConn,omitempty"`
SaasDBMySQLConn *SaasDBMySQLConn