Go web 开发数据库管理平台,利用远程过程调用(RPC)实现对MySQL数据库的管理和使用

本文介绍了如何在Go web开发中利用gRPC框架操作MySQL数据库,包括定义通信消息、服务端和客户端的实现,以及如何进行数据库备份。通过gRPC实现远程过程调用,简化数据库管理。
摘要由CSDN通过智能技术生成

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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值