背景
需求场景,原来很多业务团队共用一个数据库实例,随着业务、团队的发展,这个数据库实例可能已经成为业务链路的瓶颈,需要做实例的拆分,这就需要依赖云数据库提供的能力,由1个实例拆分2个甚至多个的数据库实例。
原本云上提供了DTS(数据库传输服务)的指定库表迁移方案,能满足大部分用户场景的拆库需求,但是由于切换读写到拆分新实例的这个最后的步骤,存在部分用户由于业务客户端多,分布广,并且业务连续性要求没办法停服做变更,没办法做到所有的客户端配置同时一把切到新实例,这就有带来数据双写的风险。
分析
在解决数据库配置平滑修改的问题,TEG架平数据库运维团队在解决数据库自研上云配置平滑修改提出并落地了一个方案可以有效解决。
具体可以看下面这个图:
这里大概讲解一下方案
1、通过dts把数据从自研实例搬迁到腾讯云上的数据库实例,并且做实时的数据同步
2、把云上的vpcgw绑定到自研实例的tgw1(腾讯内部网关)上,这样无论是从自研还是腾讯云的入口访问的数据库最终都是自研实例。
3、在自研实例的主节点母机上使用tcpdump抓包,获取数据库访问流量数据,排查业务的访问入口是否完全切换到腾讯云实例
4、流量确认都通过腾讯云的VPC访问后,对自研数据库操作只读,同步追平等,腾讯云实例停止数据同步关系,切换vpcgw到tgw2。保证无双写、无数据丢失等情况
那这里的云上拆库也是可以借鉴这个思路,可以把目标实例的VPC绑定到源实例上,所有的访问都还是走源实例,然后做客户端机器配置的平滑修改,通过抓包的方式进行请求来源的区分。
但是由于现在拆库,源和目标都已经是腾讯云的实例,通过主节点母机抓包的方式没办法有效区分来源ip(因为所有的数据包都来自同一个地域的VPCGW,抓包解析的是对应VPCGW的网关机器,后端同学和业务同学没办法做区分,如果在网管设备的设备上做抓包,这里成本非常大并且可行性不高,需要在几百台网关机器抓包然后分析,包量大,而且数据包中也不一定包括访问的DB信息),业务同学提出使用数据库审计功能进行区分,实际上数据库审计记录的是业务客户端的实际ip,这样也没办法区分是通过哪个数据库实例过来的请求。
方案
这里和相关业务同学验证后,有两种方案解决这个问题。
方案一:通过新账号和数据库审计的能力解决
因为同一个账号,抓包和审计都没办法区分哪个客户端通过VPC1来访问拆分出来的库表。这里需要业务做一次全量梳理,使用独立的新账号访问需要拆分的DB,平滑迁移过程中持续通过数据库审计来抓取老的账号还在访问新DB的客户端,逐步改好客户端,最后确认完成后再切换
在云数据库控制台上,点击数据库审计,选择未开启的审计实例,选定审计实例开启审计功能,默认选择全审计即可。
通过拆分账号,业务逐步改好客户端的配置,通过审计日志来判断新拆出去的库表都通过新账号来访问,这个时候就可以把目标实例的VPC重新绑会对应的新的目标数据库上,来完成平滑拆分。
方案二:通过内网CLB和数据库审计的能力解决
负载均衡(Cloud Load Balancer)是对多台 云服务器进行流量分发的服务。负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。
在腾讯云官网选择负载均衡产品,新建CLB实例
申请跨VPC访问,这个时候会可以邦迪云上的VPC,云下IDC的IP,从数据库审计日志中获取到的客户端的ip也是这个IP,通过绑定目标数据库实例的VPC,客户端把目标地址改为CLB的VIP即可(注意并非内网IP)。
怎么绑定目标数据库的VPC呢,点击监听管理器,新建监听器策略,配置访问、权重规则,绑定对应的目标实例VIP,VPORT(假如是x.x.x.x 3306),最终绑定成功会在右方显示绑定规则,如果端口健康状态为:健康,说明数据库实例监听绑定正常。
从后端审计日志可以看到从9.164.156.78过来的请求,说明通过CLB绑定VPC是可以满足平滑切换的需求:
这样用户后续就可以把需要拆分出来的DB客户端改为对应CLB的VIP,VPORT,通过审计判断所有请求都已经改干净后,做一次目标实例VPC的绑定,如果后续不需要通过CLB 来访问,业务还需要再做一次VIP的切换即可。
扩展
上述的拆分方案处理起来还是有一定的复杂度,建议业务可以考虑引入配置中心的管理方式,避免后续还有该类场景的拆分需求