MySQL Proxy和 Amoeba 工作机制浅析
认证过程包括:
- 客户端向服务器发起连接请求
- 服务器向客户端发送握手信息
- 客户端向服务器发送认证请求
- 服务器向客户端发送认证结果
如果认证通过,则进入查询过程:
- 客户端向服务器发起查询请求
- 服务器向客户端返回查询结果
当然,这只是一个粗略的描述,每个过程中发送的包都是有固定格式的,想详细了解MySQL Protocol的同学,可以去这里 看看。MySQL Proxy要做的,就是介入协议的各个过程。首先MySQL Proxy以服务器的身份接受客户端请求,根据配置对这些请求进行分析处理,然后以客户端的身份转发给相应的后端数据库服务器,再接受服务器的信息,返回给客户端。所以MySQL Proxy需要同时实现客户端和服务器的协议。由于要对客户端发送过来的SQL语句进行分析,还需要包含一个SQL解析器。可以说MySQL Proxy相当于一个轻量级的MySQL了,实际上,MySQL Proxy的admin server是可以接受SQL来查询状态信息的。
MySQL Proxy通过lua 脚本来控制连接转发的机制。主要的函数都是配合MySQL Protocol各个过程的,这一点从函数名上就能看出来:
- connect_server()
- read_handshake()
- read_auth()
- read_auth_result()
- read_query()
- read_query_result()
至于为什么采用lua 脚本语言,我想这是因为MySQL Proxy中采用了wormhole 存储引擎 的关系吧,这个虫洞存储引擎很有意思,数据的存储格式就是一段lua脚本,真是创意无限啊。
原理图:
Amoeba是一个类似MySQL Proxy的分布式数据库中间代理层软件,是由陈思儒开发的一个开源的java项目。其主要功能包括读写分离,垂直分库,水平分库等,经过测试,发现其功能和稳定性都非常的不错,如果需要构架分布式数据库环境,采用Amoeba是一个不错的方案。目前Amoeba一共包括For aladdin,For MySQL和For Oracle三个版本,本文主要关注For MySQL版本的一个读写分离实现。实际上垂直切分和水平切分的架构也相差不大,改动几个配置就可以轻松实现。
下图是一个采用Amoeba的读写分离技术结合MySQL的Master-Slave Replication的一个分布式系统的架构:
Amoeba处于在应用和数据库之间,扮演一个中介的角色,将应用传递过来的SQL语句经过分析后,将写的语句交给Master库执行,将读的语句路由到Slave库执行(当然也可以到Master读,这个完全看配置)。Amoeba实现了简单的负载均衡(采用轮询算法)和Failover。如果配置了多个读的库,则任何一个读的库出现宕机,不会导致整个系统故障,Amoeba能自动将读请求路由到其他可用的库上,当然,写还是单点的依赖于Master数据库的,这个需要通过数据库的切换,或者水平分割等技术来提升Master库的可用性。
Amoeba可以在不同机器上启动多个,并且做同样的配置来进行水平扩展,以分担压力和提升可用性,可以将Amoeba和MySQL装在同一台机器,也可以装在不同的机器上,Amoeba本身不做数据缓存,所以对于内存消耗很少,主要是CPU占用。对于应用来说,图中的三个Amoeba就是三台一模一样的MySQL数据库,连接其中任何一台都是可以的,所以需要在应用端有一个Load balance和Failover的机制,需要连接数据库时从三台中随机挑选一台即可,如果其他任何一台出现故障,则可以自动Failover到剩余的可用机器上。MySQL的JDBC驱动从connector-j 3.17版本起已经提供了这样的负载均衡和故障切换的功能,那么剩下的事情对于应用来说就很简单了,不需要做太多的改动就能搭建一套高可用的MySQL分布式数据库环境,何乐而不为?
区别:
主要是针对数据切分方面。
在 mysql proxy 上面如果想要读写分离并且 读集群、写集群 机器比较多情况下,用mysql proxy 需要相当大的工作量,目前mysql proxy没有现成的 lua脚本。mysql proxy根本没有配置文件,lua脚本就是它的全部,当然可以是相当方便的。那么同样这种东西需要编写大量的lua脚本才能完成一个复杂的配置。amoeba目标是走产品化这条路。只需要进行相关的配置就可以满足需求。
MySQL Proxy和 Amoeba 工作机制浅析相关推荐
- mysql的proxy机制_MySQL Proxy工作机制浅析
MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断.改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate之类的网络代理服务器的基本思想是一样的.代理服务器是和T ...
- mysql之索引的工作机制
mysql之高性能索引 当db的量达到一定数量级之后,每次进行全表扫描效率就会很低,因此一个常见的方案是建立一些必要的索引作为优化手段,那么问题就来了: 那么什么是索引呢? 索引的实现原理是怎样的? ...
- 使用MySQL Proxy解决MySQL主从同步延迟
MySQL的主从同步机制非常方便的解决了高并发读的应用需求,给Web方 面开发带来了极大的便利.但这种方式有个比较大的缺陷在于MySQL的同步机制是依赖Slave主动向Master发请求来获取数据的, ...
- mysql proxy 延迟严重_使用MySQL Proxy解决MySQL主从同步延迟
MySQL的主从同步机制非常方便的解决了高并发读的应用需求,给Web方面开发带来了极大的便利.但这种方式有个比较大的缺陷在于MySQL的同步机制是依赖Slave主动向Master发请求来获取数据的,而 ...
- mysql kingshard 扩容_如何用Go打造一个高性能mysql proxy
kingshard架构设计和功能实现 kingshard(https://github.com/flike/kingshard)开源有一段时间了,有些热心的用户发邮件来咨询kingshard的设计和实 ...
- mysql 返回 pair_【原创】MySQL Proxy中socketpair的使用
学习 MySQL Proxy 0.8.3 的源码后可知,其全部事件处理线程均对全局 socketpair 的读端进行了监听,以实现通知管道的功能:threads->event_notify_fd ...
- MySQL主从(MySQL proxy Lua读写分离设置,一主多从同步配置,分库分表方案)
Mysql Proxy Lua读写分离设置 一.读写分离说明 读写分离(Read/Write Splitting),基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELE ...
- SPI及其工作原理浅析
说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一.概述. SPI, Serial Perripheral ...
- 【CyberSecurityLearning 52】Web架构安全分析(web工作机制、HTTP协议)
目录 Web 工作机制 网页.网站 Web容器 静态页面 中间件服务器 数据库的出现 建立一个网站 HTTP 协议概述 概述 特点 URL HTTP 报文分析 HTTP 工作模式 REQUEST 请求 ...
最新文章
- 《JavaScript高级程序设计(第3版)》教程大纲
- 百度Apollo首次披露纯视觉L4无人车方案:10摄像头,对标Mobileye
- 查看自己设置的jvm参数
- 【今日CV 计算机视觉论文速览 第97期】Tue, 9 Apr 2019
- R语言聚类算法之k中心聚类(K-medoids)
- 输入网址按回车,到底发生了什么?
- 网络工程师/技术支持工程师面试题(1)
- 同学留步,我想跟你聊聊成长中的苦难
- 计算机主机hdmi接口是什么意思,笔记本电脑HDMI接口是干什么的
- bugly怎么读_Bugly迁入
- log4j警告的解决办法-狂奔的蜗牛-iteye技术网站
- 为什么员工辞职时,领导都要象征性挽留一下?
- Go + Redis 实现分布式锁
- Vivado安装找不到matlab,vivado安装System Generator不支持新版Matlab怎么办?
- Entity Framework Code First使用者的福音 --- EF Power Tool使用记之一
- css3文字水平垂直居中对齐的几种方法
- 【tinyint和int区别】
- syntax error, expect [, actual {, pos 0, fieldName null解决方法
- CodeForces 366C Dima and Salad (背包dp)
- FPGA---用FPGA加速机器学习应用(XILINX) 内含与CPU,GPU比较 (2017xilinx的宣讲)
热门文章
- 在html页面中使用模板继承,HTML静态模板的继承
- 用Visual Studio 2008编写Win32汇编程序
- PyCharm Active Code Generator
- PHP面向对象的魔术方法
- java项目命令编译,打包,运行
- 1,2,2,3,3,4,4,4,......
- KVM之一:安装准备(基于CentOS6.7)
- MySQL列类型之——数值类型
- 【古典入门】巴洛克音乐家-斯卡拉蒂
- elasticsearch获取一个字段的值_Elasticsearch,你觉得自己懂了多少,看看这篇文章吧...