当前位置: 首页 > 科技观察

Go在酷狗数据库中间件中的应用_0

时间:2023-03-12 06:47:42 科技观察

本次分享主要针对Go在数据库中间件中的应用;首先,我们会说到程序开发的要求,具体是指Go的特性是否满足这些要求;介绍一下最近用Go语言开发的mysql中间件项目,总体规划、分表路由、故障转移、平滑扩容、系统运维,主要从以上五个方面进行介绍。程序开发要求程序开发对开发语言的要求可以简单概括为:语言特性精炼、上手容易、开发效率高、代码逻辑清晰、运行性能强、节省机器资源、部署维护方便、完善生态系统Golang特性结合Golang和C下面我来解释一下Golang的特性:Go语法简洁;开发效率高,无学习压力;语言描述能力接近脚本语言,性能高;接近C/C++,充分利用资源,易于部署;可执行程序,编译解析在线部署和运行时依赖强大的标准库,丰富的第三方库,gotest,pprof自动内存管理;内存泄漏和野指针是C/C++语言开发者的噩梦Go例程+通道;简单并发简单数据同步Go开发mysql中间件系统总体方案图1本系统开发的出发点是突破mysql的单机单表容量,解决mysql访问的单点问题.上图是系统的整体框架。整个系统致力于提供一套mysql分布式解决方案。上层应用对本系统的访问与使用单机mysql相同;系统会做一些路由分发,故障转移,读写分离。Proxy接收SQL请求,解析SQL语句,路由分发,组装返回结果;mysql-group是一个“复制集”,可以是master-slave模式,也可以是master-master模式;dbmoniter主要负责故障转移、数据修复等;在zookeeper上存放相关的配置信息。分表路由逻辑分表规则有两种:hash-sharding和segment-segmentation;hash-sharding是通过Hash函数shardkey,segment-sharding是基于年月日或者整数范围。这两种方法的区别在于由于哈希规则不同而导致数据组织方式的不同。故障主备倒换关于MySQL的高可用方案,目前业界比较流行的方案是MHA。MHA在部署方面还是有点麻烦。需要在每台机器上部署一个代理,然后在机器之间进行SSH授权。我们采用的策略是通过配置rsync拉取mysql的binlog日志来处理。故障的几种情况及相应的处理:当从节点挂掉时,可以去掉下线处理;当master节点挂了,但是机器还活着,可以通过binlog恢复数据,将standby节点提升为主节点;如果节点宕机,机器不活,可以使用relaylog恢复数据,同时备节点提升为主节点。我们在双主模式下实现了如下主备切换机制,MHA不支持。图2主备倒换数据恢复流程:当Master发生故障时,尝试通过rsync拉取Binlog,最大程度保证数据不丢失;Slaves之间的数据差异通过relaylog恢复。图3在线平滑扩容数据迁移有两种方式:表迁移,将整张表的数据从一个Mysql迁移到另一个;分表,将数据表中的部分数据从一个Mysql迁移到另一个数据库进程。扩容工作原理:mysqldump引导存量数据+binlog增量扩容工作流程:首先,导出存量数据;第二,订阅binlog变化,跟踪增量;三、同步后,修改路由规则;最后,清理不必要的冗余数据。这样设计的好处是任何一个环节出现问题都可以立即回滚,数据操作相对安全;下图是扩容流程图。图4系统管理命令图5如图5所示,提供了几个主要的管理命令,如登录和注销MySQL、数据迁移指令、添加路由等。