背景
需求场景,在业务起步初期,很多客户的业务团队共用一个数据库实例,随着业务的快速发展,这个数据库实例可能已经成为业务链路的瓶颈,需要做实例的拆分,这就需要依赖云数据库提供的能力,由1个实例拆分2个甚至多个的数据库实例。
腾讯云提供了DTS(数据库传输服务 https://cloud.tencent.com/document/product/571 )的指定库表迁移方案,能满足大部分用户场景的拆库需求,但是部分用户在切换读写到拆分新实例的这个最后的步骤,由于没有使用配置中心,业务的客户端多,分布广,并且业务连续性要求没办法停服做变更,没办法做到所有的客户端配置同时一把切到新实例,这就有带来数据双写的风险,为了解决这个问题,我们整理相关的平滑拆库方案。
构建场景并分析
这里拆库实例为A,目标实例为B,需要把实例A(a,b,c)其中的c库往实例B上拆分,首先就需要通过DTS配置迁移任务,选择指定对象,全量 增量迁移,这个时候,流程跑通后,实例B是和实例A做实时的数据同步。
这里大概讲解一下拆库平滑修改配置的思路
1、通过dts把指定对象从实例A搬迁到实例B,并且做实时的数据同步
2、把实例B VIP绑定到实例A的后端网关节点上,这样无论是从实例A还是实例B的VIP入口访问的数据库最终都是实例A的数据。
3、用户这个时候就可以修改客户端配置,把原来访问C库的配置改为访问实例B的VIP
4、这个时候只需要确认访问拆分出去的C库都是从实例B的VIP过来的请求(后续会讲到使用数据库审计的功能来实现)。
4、确认流量切分干净和实例A与实例B同步关系追平,就可以把后端的实例B的VIP重新绑定为自身实例的后端网关节点,并且中断同步关系(如果有些节点没办法排查到修改,为了避免双写,可以把实例A的对应库权限回收,如果出现报错,这个时候再改动配置访问到实例B)。
那这里的云上拆库也是可以借鉴这个思路,可以把目标实例的VPC绑定到源实例上,所有的访问都还是走源实例,然后做客户端机器配置的平滑修改,通过抓包的方式进行请求来源的区分。
这个方案的关键难点在于,实际上数据库审计记录的是业务客户端的实际ip,这样通过审计没办法区分是通过实例A还是实例B过来的请求。
方案
经过验证后,有两种方案解决这个问题。
方案一:通过新账号和数据库审计的能力解决
因为同一个账号,抓包和审计都没办法区分哪个客户端通过实例B的VIP来访问拆分出来的库表。这里需要业务做一次全量梳理,使用独立的新账号访问需要拆分的C库,平滑迁移过程中持续通过数据库审计能力来抓取老的账号还在访问C库的客户端,逐步改好客户端,最后确认完成后再切换
在云数据库控制台上,点击数据库审计,选择未开启的审计实例,选定审计实例开启审计功能,默认选择全审计即可。
通过拆分账号,业务逐步改好客户端的配置,通过审计日志来判断新拆出去的库表都通过新账号来访问,这个时候就可以把实例B的VPC重新绑会对应的新的目标数据库上,来完成平滑拆分。
方案二:通过内网CLB和数据库审计的能力解决
负载均衡(Cloud Load Balancer)是对多台 云服务器进行流量分发的服务。负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。
在腾讯云官网选择负载均衡产品,新建CLB实例
申请跨VPC访问,这个时候会可以绑定实例B的VIP,从数据库审计日志中获取到的客户端的IP也是这个SNAT IP,通过绑定数据库实例B的VIP,客户端把目标地址改为CLB的VIP即可(注意并非内网IP)。
怎么绑定实例B的VIP呢,点击监听管理器,新建监听器策略,配置访问、权重规则,绑定对应的目标实例VIP,VPORT(假如是x.x.x.x 3306),最终绑定成功会在右方显示绑定规则,如果端口健康状态为:健康,说明数据库实例监听绑定正常。
从后端审计日志可以看到从9.164.156.78过来的请求,说明通过CLB绑定目标实例B的VIP是可以满足平滑切换的需求:
这样用户后续就可以把需要拆分出来的C库的客户端改为对应CLB的VIP,VPORT,通过审计判断所有请求都已经改干净后,做一次目标实例VPC的绑定,如果后续不需要通过CLB 来访问,业务还需要再做一次VIP的切换即可。
扩展
上述的拆分方案处理起来还是有一定的复杂度,建议业务可以考虑引入配置中心的管理方式,避免后续还有该类场景的拆分需求