其他
一、背景随着业务的快速发展,酷家乐数据库量越来越大,其中部分数据表达到二十亿级别。前段时间int整型溢出导致的故障就是一个典型案例,作为公司第一张表达到20亿级别。单库或单表数据量过大,会导致数据库的查询压力越来越大,数据库读写耗时持续上升。实际工作中我们会发现,对于复杂链路场景,数据库的读写性能往往会成为业务发展的瓶颈。一般来说对于数据量较大的表,我们会在业务迭代过程中会使用分库分表来降低单实例的查询压力和请求耗时。此外,不少场景对数据读取耗时要求非常高,尤其是一些关联性非常高的核心表,为了进一步降低请求耗时,也会接入ES等搜索引擎。二、方案设计一般数据迁移需要考虑以下两个问题:数据同步的一致性和线上业务无感知渲染在过去两年内进行了多次的分库分表及数据迁移任务,并攒下了不少经验,供大家参考。数据迁移大致可以分为以下几个步骤:迁移过程设计、影响范围评估、数据同步与验证、开关操作与代码清理前面两步相信大家都轻车熟路了,链路梳理完后基本会对业务整体有个清晰的认识,并能给出一个初步的影响范围评估。这个数据迁移过程中核心环节主要有两个:数据同步与验证,开关控制。为了尽可能降低对业务的影响,实现数据的平滑迁移,一般我们会通过开关控制整个项目进度。确认数据同步完成与校验通过后,逐步打开外网的开关,灰度实现数据的迁移。同时开关为我们提供了一种应急响应方案,迁移过程中一旦新库出现稳定性或数据一致性问题,可快速切回旧库,保证数据库的稳定和数据可靠。通常我们数据迁移操作主要为以下几个节点:代码上线。开关支持双写切换、读切换,且已在内网验证过;执行双写。打开开关同步写入新老库。默认情况下新库自增主键id来自旧库。存量数据同步。将旧库存量数据同步到新库中;写顺序切换。改写入顺序为先写入新库,旧库自增主键id来自新库。数据同步校验与业务测试验证。切换读开关。改为读新库。观察一段时间,若无问题反馈,则停写旧库、下线开关及迁移代码通常情况下,线上库每天的写入量是巨大的,因此需要先保证增量数据同步写入新库和旧库后,才会去做存量数据的同步。这里需要优先保证迁移的代码及其开关上线。数据同步本身的过程相对简单,但是数据源订阅的切换及顺序操作才是风险最大的地方。因此业务逻辑代码实现必须首先得到保障。另外一个需要注意的地方,数据库迁移之前一定要完成数据表的读写收拢,避免迁库完成后数据不一致,尤其是写入操作主键冲突。一般情况下原数据表是默认有效且可靠的,那么迁表初期自增主键取自旧表;当数据同步完成且校验一致后,自增主键id则可切换到新表。因为外网和beta共用数据库,两个环境顺序不一致就会有可能导致自增主键冲突写入失败,尤其像renderpic,两个环境时刻都在大量写入操作,风险较大。。当然如果数据表比较简单且业务量不大,那么选择深夜直接切换会相对比较简单。三、数据同步在进行数据同步时,首先需要确认主键,只有确定了主键ID才能实现数据同步操作。如果当前表使用了自增主键id,那么在分库分表前需要将主键id的增长规则确定,一般建议采用sequence表同步。数据同步一般有两种方式:基于特定框架或者工具,自定义代码实现数据同步。1、存量数据同步