《如何打造MySQL高可用平台(2)》要点:
本文介绍了如何打造MySQL高可用平台(2),希望对您有用。如果有疑问,可以联系我们。
笔者之前一直都在公司云存储中心工作,由于种种原因,2015年年中调到了运维部的数据库团队,在这里才发现,rds项目其实只是在数据库运维平台中走出了很小的一步。为了提供全方位的数据库云服务平台,于是我们开始打造了全新的数据库配置中心,同时提供MySQL、Redis、Mongodb等数据库和缓存内部云服务。
与此同时,之前在rds项目中实现的4层代理的缺点也越来越明显:
1、只能使用MySQL主库,M-M-S结构是的MySQL资源极其浪费;
2、只能在单机房使用,跨机房访问效率非常低;
3、运维功能太少,由于采用iptables,在代理机器上无法看到任何的连接信息,也无法捕获任何业务访问的指标,甚至于连接信息都无法获取;
基于以上几点原因,笔者决定开发基于7层应用层的MySQL代理层平台,系统的具体架构如下所示:
clipboard.png
由于代理层是自己实现的应用程序,所以笔者在代码中很容易就实现以下几个核心的功能:
1、授权认证模型;
2、SQL拦截;
3、负载均衡;
4、读写分离;
5、高可用;
6、大SQL隔离;
除了这些特性以外,基于我们公司的多机房特点,笔者给代理层添加了机房感知能力。在整个数据库配置中心,每个代理层程序、每个MySQL实例都有机房属性。有了机房属性,代理层可以实现自动就近访问MySQL的能力,从而提高了系统性能同时,简化了业务程序的部署。
一个典型的业务部署例子如下:
clipboard.png
从上图可以看出,应用程序永远也不再需要考虑多机房高可用、负载均衡、读写分离的问题。而且由于代理层实现了高可用功能,一旦发现主写MySQL故障,会自动把主读切换为主写,从而在秒级实现FAILOVER。
由于我们的代理层采用了平台级的设计,上图中的代理层可以连接多套业务(MySQL集群),新的业务只需要在zookeeper配置好,代理层就会自动感知,业务方马上能够在代理层上使用,而不需要为每个业务部署自己的独立的代理层,从而极大的减少了运维成本。
除此以外采用代理层还为数据库云服务平台带来不少好处:
业务方连接代理机器和相应的端口,底层MySQL主从切换可以对业务方透明;
MySQL实例维护或者迁移可以对业务方透明(一键迁移);
MySQL业务扩容/缩容也对业务透明(一键扩缩容);
代理层上线推广到现在,已经有好几百套的MySQL集群跑在上面了,MySQL的高可用平台成功落地。
Mongodb相对于MySQL的一个很大的优势就是高可用性,MySQL的高可用方案很多,但是完美的方式不多,代理层是在我们公司成功实施的一套平台,希望有机会能和业界一起探讨和学习,实现更多完美的解决方案。
代理层虽然已经在公司大规模使用,但是还有很多发展和改善的空间,随着MySQL 5.6和MySQL 5.7的广泛应用,GTID已经非常成熟,由于公司内部使用场景少,代理层的切换还没有实现GTID模式的切换,所以下一阶段,笔者会考虑实现基于GTID的高可用模式。
原文:http://www.jianshu.com/p/bc50221972ca
转载请注明本页网址:
http://www.vephp.com/jiaocheng/34_2.html