最近团队在做数据库架构选型,MyCat中间件和K8s Operator两种方案,到底该选哪个,今天来聊聊我的分析和思考。

最近,团队,在,做,数据库,架构,的,选型,和,升级,之前,我们,用,的,是,单,实例,的,MySQL,随着,业务,发展,数据量,越来越,大,访问量,也,越来越,高,单,实例,已经,有点,扛不住,了,需要,做,分库分表,和,高可用,架构,在,选型,的,时候,有,两个,主要,的,方案,一个,是,用,MyCat,这样,的,数据库,中间件,来,做,分库分表,和,读写分离,另一个,是,用,K8s,加,Operator,的,方式,来,部署,和,管理,数据库,集群,这,两个,方案,各有,优缺点,团队,讨论,了,很久,也,没,完全,达成,一致,我,作为,技术,负责人,需要,做,一个,决策,所以,花,了,不少,时间,深入,研究,和,对比,这,两个,方案,最后,做出,了,选择。

今天,这篇,文章,就,来,聊聊,我,对,这,两个,方案,的,分析,和,思考,以及,最后,是,怎么,选,的,希望,能,给,也,在,做,类似,选型,的,朋友,一些,参考,和,启发。

一、背景和需求

先,说说,我们,的,业务,背景,和,具体,需求,这样,大家,能,更,好,地,理解,我们,为什么,做,这个,选型,以及,各个,方案,的,适用,场景,我们,是,一家,互联网,公司,做,的,是,一个,面向,C端,用户,的,平台,用户量,大概,几百万,日活,几十万,业务,主要,是,用户,相关,的,数据,和,交易,相关,的,数据,数据量,增长,比较,快,目前,核心,的,几张,大表,数据量,已经,到,了,几千万,甚至,上亿,单表,查询,已经,开始,变慢,而且,随着,业务,继续,发展,数据量,还会,继续,增长,另外,访问量,也,比较,大,高峰期,QPS,能,到,几万,单,实例,的,MySQL,在,高峰期,CPU,和,IO,都,比较,高,有时候,会,出现,慢查询,和,响应,延迟,影响,用户,体验,还有,高可用,的,需求,数据库,是,核心,系统,不能,出,问题,一旦,数据库,挂,了,整个,业务,就,瘫,了,所以,需要,有,高可用,架构,保证,数据库,的,稳定性,和,可用性。

综合,这些,需求,我们,需要,做,数据库,架构,的,升级,主要,要,解决,几个,问题,一是,大数据量,的,存储,和,查询,性能,问题,需要,分库分表,二是,高,并发,访问,的,性能,问题,需要,读写分离,和,负载,均衡,三是,高可用,问题,需要,主从,切换,和,故障,转移,四是,运维,和,管理,的,便利性,需要,方便,地,扩容,缩容,备份,恢复,等等,基于,这些,需求,我们,开始,调研,和,选型,主要,考虑,了,MyCat,中间件,和,K8s,Operator,两个,方案,下面,分别,介绍,和,对比。

二、MyCat中间件方案

先,说说,MyCat,中间件,方案,MyCat,是,一个,开源,的,数据库,中间件,基于,Java,开发,主要,用来,做,MySQL,的,分库分表,读写分离,主从,切换,等等,功能,在,国内,用,得,比较,多,很多,互联网,公司,都,用,过,或者,正在,用,MyCat,来,做,数据库,架构,MyCat,的,核心,原理,是,在,应用,和,数据库,之间,加,一层,中间件,应用,连接,MyCat,就,像,连接,一个,普通,的,MySQL,一样,MyCat,负责,把,SQL,按照,分库分表,规则,路由,到,对应,的,数据库,节点,执行,然后,把,结果,汇总,返回,给,应用,对,应用,来说,是,透明,的,不用,关心,底层,有,多少,个,数据库,节点,数据,怎么,分布,就,像,操作,一个,数据库,一样,这,也是,中间件,方案,的,最大,优势,对,应用,侵入,小,迁移,成本,低。

MyCat,的,主要,功能,和,特点,有,几个,第一,支持,分库分表,MyCat,支持,多种,分库分表,规则,比如,取模,范围,枚举,时间,等等,能,灵活,地,配置,分库分表,策略,把,数据,分散,到,多个,数据库,节点,上,解决,单表,数据量,大,的,问题,第二,支持,读写分离,MyCat,能,配置,主从,数据库,节点,写,操作,路由,到,主库,读,操作,路由,到,从库,实现,读写分离,分担,数据库,压力,第三,支持,主从,切换,和,高可用,MyCat,能,检测,数据库,节点,的,健康状态,如果,主库,挂,了,能,自动,切换,到,从库,保证,可用性,第四,对,应用,透明,应用,不用,改,代码,或者,只,需要,改,很少,的,代码,把,数据库,连接,地址,改成,MyCat,的,地址,就,能,使用,迁移,成本,低,第五,功能,比较,成熟,MyCat,发展,了,很多年,用,的,人,也,多,功能,比较,成熟,稳定,社区,也,比较,活跃,遇到,问题,能,找到,资料,和,解决方案。

但是,MyCat,也,有,一些,缺点,和,问题,第一,MyCat,本身,是,一个,单点,虽然,可以,部署,多个,MyCat,节点,做,集群,但是,配置,和,管理,比较,复杂,而且,MyCat,本身,也,可能,成为,性能,瓶颈,和,故障点,第二,MyCat,对,复杂,SQL,的,支持,有限,比如,多表,关联,子查询,跨库,事务,等等,MyCat,处理,起来,比较,困难,或者,性能,不好,有些,甚至,不,支持,需要,应用,规避,或者,改,写法,第三,MyCat,的,运维,和,排错,比较,复杂,因为,多,了,一层,中间件,出,问题,的,时候,需要,排查,是,应用,的,问题,MyCat,的,问题,还是,数据库,的,问题,比较,麻烦,而且,MyCat,的,配置,也,比较,复杂,需要,理解,很多,概念,和,规则,第四,MyCat,的,扩展性,和,灵活性,有限,分库分表,规则,一旦,定,了,后面,要,改,比较,麻烦,扩容,也,需要,迁移,数据,比较,复杂,第五,MyCat,是,比较,传统,的,架构,和,现在,流行,的,云原生,K8s,生态,结合,得,不,是,很,好,如果,团队,已经,在,用,K8s,做,容器化,和,云原生,架构,MyCat,可能,不,是,最,好,的,选择。

三、K8s Operator方案

再,说说,K8s,Operator,方案,K8s,Operator,是,Kubernetes,生态,里,的,一种,模式,用来,在,K8s,上,部署,和,管理,有状态,应用,比如,数据库,消息队列,等等,Operator,本质,上,是,一个,自定义,控制器,通过,自定义,资源,CRD,来,描述,应用,的,期望,状态,然后,Operator,控制器,不断,地,把,实际,状态,调整,到,期望,状态,实现,应用,的,自动化,部署,管理,和,运维,对于,数据库,来说,现在,已经,有,很多,成熟,的,Operator,比如,MySQL,的,有,Percona,XtraDB,Cluster,Operator,MySQL,Operator,等等,PostgreSQL,的,有,Zalando,Postgres,Operator,等等,这些,Operator,能,帮,你,在,K8s,上,快速,部署,和,管理,数据库,集群,包括,主从,复制,读写分离,故障,转移,备份,恢复,扩容,缩容,等等,功能,很多,都,能,自动化,完成,大大,降低,数据库,运维,的,门槛,和,成本。

K8s,Operator,方案,的,主要,功能,和,特点,有,几个,第一,云原生,和,K8s,生态,无缝,集成,如果,团队,已经,在,用,K8s,做,容器化,和,云原生,架构,用,Operator,部署,数据库,能,和,整个,技术,栈,统一,管理,和,运维,用,K8s,的,工具,和,命令,就能,管理,数据库,不用,单独,学,一套,东西,第二,自动化,运维,能力,强,Operator,能,自动化,完成,很多,数据库,运维,操作,比如,自动,部署,数据库,集群,自动,配置,主从,复制,自动,故障,检测,和,转移,自动,备份,和,恢复,自动,扩容,缩容,等等,大大,减少,人工,运维,的,工作量,也,减少,人为,出错,的,概率,第三,弹性,伸缩,能力,强,基于,K8s,的,能力,Operator,能,方便,地,做,数据库,的,扩容,缩容,比如,业务,高峰期,增加,从库,节点,分担,读,压力,业务,低谷期,减少,节点,节省,资源,而且,很多,Operator,支持,存储,的,动态,扩容,能,方便,地,增加,数据库,的,存储,容量,第四,高可用,和,故障,自愈,Operator,能,自动,检测,数据库,节点,的,健康状态,如果,某个,节点,挂,了,能,自动,重启,或者,重新,调度,节点,如果,主库,挂,了,能,自动,选主,和,切换,保证,数据库,的,高可用,很多,都,能,做到,故障,自愈,不用,人工,干预,第五,声明式,配置,和,版本,管理,用,Operator,的话,数据库,的,配置,是,通过,YAML,文件,声明式,定义,的,可以,用,Git,做,版本,管理,和,审计,也,方便,做,配置,的,回滚,和,复用,符合,基础设施,即代码,的,理念。

但是,K8s,Operator,方案,也,有,一些,缺点,和,问题,第一,学习,成本,高,K8s,本身,就,比较,复杂,Operator,又,是,K8s,上,比较,高级,的,用法,需要,团队,对,K8s,和,Operator,有,比较,深入,的,理解,才能,用,好,如果,团队,之前,没,接触,过,K8s,学习,成本,会,比较,高,第二,分库分表,需要,额外,处理,Operator,主要,解决,的,是,数据库,的,部署,和,运维,管理,问题,对于,分库分表,Operator,本身,一般,不,提供,需要,自己,在,应用,层,做,分库分表,或者,结合,其他,分库分表,中间件,或者,框架,比如,ShardingSphere,等等,所以,如果,需要,分库分表,用,Operator,的话,还,需要,额外,解决,分库分表,的,问题,第三,有状态,应用,在,K8s,上,的,稳定性,和,性能,问题,虽然,现在,K8s,对,有状态,应用,的,支持,越来越,好,Operator,也,越来越,成熟,但是,数据库,这种,对,性能,和,稳定性,要求,极高,的,有状态,应用,跑,在,K8s,上,还是,有,一些,争议,和,风险,比如,网络,性能,存储,性能,隔离性,等等,可能,和,物理机,或者,虚拟机,部署,有,差距,需要,做好,测试,和,调优,第四,Operator,的,成熟度,和,生态,参差不齐,虽然,有,很多,数据库,Operator,但是,不同,Operator,的,成熟度,功能,完整性,稳定性,社区,活跃度,等等,差别,很大,有些,比较,成熟,稳定,有些,可能,还,在,发展,中,有,不少,坑,需要,仔细,调研,和,测试,选择,合适,的,Operator,第五,排错,和,问题,定位,复杂,K8s,本身,就,比较,复杂,再加,上,Operator,和,数据库,出,问题,的,时候,需要,排查,的,层面,很,多,K8s,集群,层面,Operator,层面,数据库,层面,应用,层面,等等,排错,和,问题,定位,比较,复杂,需要,团队,有,比较,强,的,K8s,和,数据库,运维,能力。

四、两个方案的详细对比

下面,从,几个,维度,详细,对比,一下,这,两个,方案,帮,大家,更,清楚,地,看到,它们,的,区别,和,适用,场景。

1. 分库分表能力

MyCat:原生,支持,分库分表,功能,比较,完善,支持,多种,分库分表,规则,配置,灵活,对,应用,透明,不用,改,应用,代码,但是,对,复杂,SQL,和,跨库,操作,支持,有限。

K8s Operator:本身,不,提供,分库分表,能力,需要,额外,在,应用,层,做,分库分表,或者,结合,其他,分库分表,框架,或,中间件,对,应用,有,一定,侵入,需要,改,应用,代码,或者,引入,额外,的,组件。

这一,轮,MyCat,占优,因为,原生,支持,分库分表,对,应用,透明,迁移,成本,低。

2. 高可用和故障转移

MyCat:支持,主从,切换,和,故障,转移,但是,MyCat,本身,可能,成为,单点,需要,部署,MyCat,集群,来,保证,高可用,配置,和,管理,比较,复杂。

K8s Operator:基于,K8s,的,能力,高可用,和,故障,自愈,能力,强,能,自动,检测,故障,自动,重启,节点,自动,选主,切换,很多,都,能,做到,不用,人工,干预,而且,K8s,本身,的,高可用,机制,也,比较,成熟。

这一,轮,K8s Operator,占优,高可用,和,故障,自愈,能力,更,强,更,自动化。

3. 运维和管理便利性

MyCat:需要,单独,部署,和,运维,MyCat,中间件,配置,比较,复杂,需要,理解,很多,概念,和,规则,运维,和,排错,也,比较,复杂,需要,专门,的,知识,和,经验。

K8s Operator:如果,团队,已经,在,用,K8s,管理,和,运维,比较,统一,用,K8s,的,工具,和,命令,就能,管理,数据库,很多,运维,操作,能,自动化,但是,学习,成本,高,需要,团队,有,K8s,能力。

这一,轮,各有,优劣,如果,团队,已经,有,K8s,能力,K8s Operator,更,方便,如果,没有,MyCat,可能,更,容易,上手。

4. 性能

MyCat:多,了,一层,中间件,会,有,一定,的,性能,损耗,而且,MyCat,本身,可能,成为,性能,瓶颈,对于,简单,SQL,性能,还,可以,对于,复杂,SQL,性能,可能,下降,明显。

K8s Operator:数据库,直接,跑,在,K8s,的,容器,里,没有,中间件,层,的,性能,损耗,但是,容器,的,网络,和,存储,性能,可能,和,物理机,有,差距,需要,做好,调优,整体,性能,取决于,K8s,集群,的,配置,和,调优。

这一,轮,各有,优劣,看,具体,场景,和,配置,一般来说,如果,K8s,集群,配置,好,调优,到位,K8s Operator,的,性能,可能,更,好,因为,没有,中间件,损耗。

5. 扩展性和灵活性

MyCat:分库分表,规则,一旦,定,了,后面,改,比较,麻烦,扩容,需要,迁移,数据,比较,复杂,灵活性,和,扩展性,有限。

K8s Operator:基于,K8s,的,能力,弹性,伸缩,方便,能,快速,增加,减少,数据库,节点,存储,也,能,动态,扩容,灵活性,和,扩展性,更,强,但是,分库分表,需要,自己,处理。

这一,轮,K8s Operator,占优,弹性,伸缩,和,扩展性,更,强。

6. 学习成本和团队要求

MyCat:相对,独立,学习,成本,中等,主要,需要,理解,MyCat,的,配置,和,分库分表,规则,对,团队,的,K8s,能力,没,要求。

K8s Operator:学习,成本,高,需要,团队,对,K8s,和,Operator,有,深入,理解,还要,有,数据库,运维,能力,对,团队,要求,高。

这一,轮,MyCat,占优,学习,成本,低,对,团队,要求,低。

7. 生态和发展趋势

MyCat:比较,传统,的,架构,发展,相对,缓慢,和,云原生,生态,结合,不,是,很,好,但是,功能,成熟,稳定,用,的,人,多。

K8s Operator:云原生,的,主流,方向,发展,迅速,生态,越来越,成熟,是,未来,的,趋势,很多,公司,都,在,往,这个,方向,走。

这一,轮,K8s Operator,占优,是,未来,的,发展,趋势,生态,发展,快。

五、我们的选择和理由

介绍,完,两个,方案,和,对比,再,说说,我们,最后,是,怎么,选,的,以及,理由,我们,最后,选择,的,是,K8s Operator,方案,结合,ShardingSphere,做,分库分表,主要,有,几个,理由。

第一,我们,团队,已经,在,全面,拥抱,云原生,和,K8s,我们,的,应用,已经,全部,容器化,跑,在,K8s,上,用,K8s,做,部署,和,运维,管理,所以,数据库,也,用,K8s Operator,部署,和,管理,能,和,整个,技术,栈,统一,不用,单独,维护,一套,MyCat,的,架构,和,运维,体系,降低,了,整体,的,复杂度,和,运维,成本。

第二,我们,团队,有,比较,强,的,K8s,能力,我们,有,专门,的,云原生,和,基础架构,团队,对,K8s,有,比较,深入,的,研究,和,实践,经验,能,hold住,K8s Operator,的,部署,和,运维,所以,学习,成本,和,团队,要求,对,我们,来说,不是,大,问题。

第三,我们,看重,长期,的,发展,和,趋势,云原生,和,K8s,是,未来,的,大,趋势,越来越,多,的,公司,都,在,往,这个,方向,走,Operator,也,越来越,成熟,生态,越来越,好,选择,K8s Operator,方案,符合,技术,发展,的,趋势,长期,来看,更,有,前景,也,能,享受到,生态,发展,带来,的,红利。

第四,我们,的,业务,需要,比较,强,的,弹性,和,扩展性,我们,的,业务,有,比较,明显,的,高峰期,和,低谷期,需要,能,方便,地,做,弹性,伸缩,K8s Operator,的,弹性,伸缩,能力,更,强,能,更好,地,满足,我们,的,需求,而且,未来,业务,继续,发展,需要,扩容,的,时候,也,更,方便。

第五,分库分表,的,问题,我们,通过,引入,ShardingSphere,来,解决,ShardingSphere,是,一个,开源,的,分布式,数据库,中间件,生态,功能,很,强大,支持,分库分表,读写分离,分布式,事务,等等,而且,能,和,K8s,很好,地,结合,我们,用,ShardingSphere-JDBC,在,应用,层,做,分库分表,对,应用,有,一定,侵入,但是,功能,更,强大,性能,也,更,好,而且,我们,的,应用,本来,就,需要,做,一些,改造,来,适配,分库分表,所以,这个,成本,是,可以,接受,的。

当然,我们,也,不是,说,MyCat,不好,MyCat,也是,一个,很,优秀,的,方案,功能,成熟,稳定,对,应用,透明,迁移,成本,低,对于,很多,团队,来说,是,很,好,的,选择,只是,结合,我们,团队,的,具体,情况,和,需求,我们,觉得,K8s Operator,方案,更,适合,我们,而已,技术,选型,就是,这样,没有,绝对,的,好坏,只有,适合,不,适合,要,根据,自己,的,业务,场景,团队,能力,发展,规划,等等,综合,考虑,做出,最,适合,自己,的,选择。

六、选型建议

最后,给,也,在,做,类似,选型,的,朋友,一些,建议,帮,大家,更,好,地,做,决策。

第一,先,明确,自己,的,核心,需求,和,痛点,做,选型,之前,先,想,清楚,你,最,需要,解决,的,问题,是什么,是,分库分表,还是,高可用,还是,运维,便利性,还是,弹性,伸缩,不同,的,核心,需求,适合,的,方案,不一样,比如,如果你,最,核心,的,需求,是,快速,做,分库分表,对,应用,侵入,小,迁移,成本,低,那,MyCat,可能,更,适合,你,如果,你,最,核心,的,需求,是,云原生,统一,运维,弹性,伸缩,那,K8s Operator,可能,更,适合,你。

第二,评估,自己,团队,的,能力,和,技术栈,选型,要,结合,团队,的,能力,和,现有,技术栈,如果,团队,已经,在,用,K8s,有,比较,强,的,K8s,能力,那,K8s Operator,是,很,好,的,选择,能,统一,技术栈,降低,整体,复杂度,如果,团队,没,接触,过,K8s,也,没,打算,短期,内,全面,转向,云原生,那,MyCat,可能,更,务实,学习,成本,低,能,快速,落地,解决,问题,不要,为了,追,热点,而,盲目,上,K8s,结果,团队,hold不住,反而,出,问题。

第三,做好,调研,和,测试,不管,选,哪个,方案,都,要,做好,充分,的,调研,和,测试,不要,只,看,文档,和,别人,的,经验,就,拍脑袋,决定,要,自己,动手,搭,环境,测,性能,测,稳定性,测,高可用,测,运维,操作,等等,实际,体验,一下,看看,是不是,真的,适合,自己,的,业务,场景,而且,要,做,压测,和,故障,演练,看看,在,高,并发,和,故障,场景,下,表现,如何,有没有,什么,坑,这些,都,很,重要,能,帮,你,避免,很多,后期,的,问题。

第四,考虑,长期,发展,和,可维护性,选型,不,只要,看,眼前,能,不能,解决,问题,还要,考虑,长期,的,发展,和,可维护性,这个,方案,未来,的,发展,前景,如何,社区,活不活跃,能不能,持续,更新,和,维护,团队,后续,能不能,招,到,会,这个,技术,的,人,学习,资料,多不多,等等,这些,长期,的,因素,也,很,重要,不要,选,一个,已经,停止,维护,或者,越来越,小众,的,技术,后面,出,问题,没人,修,也,招,不到,人,维护,就,麻烦,了。

第五,做好,预案,和,回滚,方案,不管,选,哪个,方案,上线,之前,都,要,做好,预案,和,回滚,方案,数据库,是,核心,系统,迁移,和,升级,有,风险,一定要,做好,充分,的,准备,比如,数据,备份,回滚,方案,灰度,发布,方案,监控,和,告警,等等,确保,即使,出,问题,也,能,快速,恢复,减少,对,业务,的,影响,不要,盲目,上线,结果,出,问题,手忙脚乱,造成,大,的,损失。

七、写在最后

MyCat,中间件,和,K8s Operator,是,两种,不同,的,数据库,架构,方案,各有,优缺点,也,各有,适用,场景,没有,绝对,的,谁,好,谁,坏,只有,适合,不,适合,大家,做,选型,的,时候,要,结合,自己,的,业务,需求,团队,能力,技术栈,发展,规划,等等,综合,考虑,做出,最,适合,自己,的,选择,我们,最后,选,了,K8s Operator,加,ShardingSphere,的,方案,是,因为,这个,方案,更,符合,我们,团队,的,情况,和,长期,发展,规划,但是,这不,代表,MyCat,就,不好,对于,很多,团队,来说,MyCat,可能,是,更,务实,更,合适,的,选择。

另外,技术,是,不断,发展,的,现在,云原生,和,K8s,发展,很快,Operator,也,越来越,成熟,未来,可能,会,有,更,多,更好,的,方案,出现,大家,也要,保持,学习,关注,技术,发展,动态,及时,了解,新,的,技术,和,方案,但是,也,不要,盲目,追,新,技术,要,根据,自己,的,实际,情况,选择,稳定,可靠,适合,自己,的,技术,毕竟,技术,是,为,业务,服务,的,能,稳定,可靠,地,支撑,业务,发展,才,是,最,重要,的。

希望,这篇,文章,能,给,也,在,做,数据库,架构,选型,的,朋友,一些,参考,和,启发,也,欢迎,大家,在,评论,区,分享,你们,的,选型,经验,和,思考,或者,有,什么,问题,也,可以,一起,交流,讨论,谢谢,大家,的,阅读。