要点
币安的账本迁移旨在解决此前的关系数据库服务器固有的热点账户问题。
区别于有每日暂停服务时间的常规加密货币交易平台,币安一年365天全天候运行,没有维护窗口可供利用。
我们需要在线完成对新币安账本的迁移,保证用户资产安全,同时不能对业务造成影响,以保障终端用户的无缝体验。
我们选择了逐个账户迁移的策略,而非gh-ost工具采用的一次性切换策略。
阅读本文,了解币安账本迁移以及过程中使用的工具和技术。
币安账本是我们技术运营的基石,每日处理涉及庞大用户群的数百万笔交易。阅读《币安账本如何支撑用户体验》博客文章,详细了解该系统、及其目标和面临的挑战。在新旧版本的迁移过程中,我们面临着一个典型难题:如何在飞机飞行的过程中升级正在运行的引擎呢?我们必须迁移用户资产,而保障用户资金安全是我们的首要任务。
币安在迁移中面临的主要挑战
要实现我们的既定目标,就必须应对下列挑战:
确保新账本的绝对准确
能够及时准确地发现和解决任何资金问题
无需上游服务停机维护
我们的迁移任务与在线数据库DDL的对比
在深入了解我们的具体解决方案之前,让我们先来看看针对大表执行在线DDL(数据定义语言)会面临的常见问题。究竟什么是DDL?设想一下,要在拥有数亿行数据的表格中添加一列,应该如何操作?我们希望在不中断业务的情况下在线完成这项工作。
gh-ost工具被广泛应用于解决此类问题,您可以通过以下图示了解其工作方式。
这一过程主要包括两个阶段:
同步阶段会持续到新表与原始表完全相同。有两种数据需要同步:
现有数据
增量数据(在迁移过程中原始表生成的新数据)。
切换阶段是指在不中断任何交易的情况下,用新表替换原始表。
币安账本面临的独特挑战
尽管存在相似之处,但在在线迁移任务中,币安账本也面临一些独特的挑战。
首先,币安的后端系统在分布式环境下运作,而在线数据库DDL则是在单体环境下运作的。其次,由于我们的数据是用户资产,所以无法采用一次性的切换方法。最后,在执行大规模迁移之前,我们需要确保所有相关服务能够协同运作。
类似上文的在线DDL,我们的迁移也分为两个阶段:
在同步阶段,我们专门创建了一个复制服务,将旧账本中的余额同步到新账本中
逐个账户切换阶段
阶段性方法
这是一项庞大的任务。俗话说得好,罗马不是一天建成的。在处理复杂庞大的问题时,分治法往往非常有效。
第1阶段:复制
原理
我们的思路可以概括为两个要点:
将币安账本建模为一个新的从属节点,添加到现有的MySQL集群中,该集群为当前账本系统提供支持。借助复制技术,我们可以异步全面同步用户余额。
随后,我们可以将生产流量原样导向至币安账本,以验证其正确性和稳健性。即使这个阶段出现问题,我们和我们的用户也不会受到影响。
操作流程
下面是整个复制流程的示意图。需要关注的关键路径是:
转移 → 账本 → 币安账本复制器 → 币安账本
具体做法
我们将复制过程拆分为两个独立的步骤:
转储账本数据库的快照,然后将其导入币安账本中。
转储快照后,复制账本数据库的二进制日志。
最终,旧账本和币安账本中的余额和余额日志数据将保持完全同步,而且可以通过全面对账模块进行验证。
花费时间
币安账本于2022年8月初开始运行。随后,我们启动了复制过程,一直持续到2022年11月中旬。新账本系统需要在验证中达到100%的正确性,所以这个过程对我们非常重要。在进入下一迁移阶段之前,必须经过这一步骤。
最终,我们没有发现任何问题,并运行了几次发布例行程序来熟悉情况。这个过程算不上快,共花费三个月时间,但对于实现我们保护用户资金安全的目标来说却是必要的。
第2阶段:在线迁移
原理
我们开发了一项自定义迁移作业来迁移数亿账户。
操作流程
以下是单个账户迁移的核心流程图:
这是一些需要记住的要点:
账户系统维护着每个账户的所有权映射。
账户A→账本
账户B→币安账本
账户C→禁用
在迁移某账户之前,该账户任何待处理的并发交易将被跳过,以减少业务影响。
将所有权映射从账本更改为禁用状态,防止余额进一步更新,从而将其维持在固定数额。
核对旧账本和币安账本两者的余额。
将所有权映射从禁用状态更改为币安账本,因此未来的余额更新将直接在币安账本进行。
根据我们的性能指标,从第3步到第5步平均花费150毫秒。理论上,在这150毫秒的迁移过程中,用户不能执行任何交易操作。事实证明,没有任何交易受到影响。
执行过程
币安秉持“坚决执行胜过万全规划”的原则。坚决的执行力对我们的成功至关重要,而资金安全始终是我们的首要关切。我们在长达三周的时间里采用了渐进迁移策略,以尽早发现问题,减少不利影响。
对账过程
对账对于客观及时地检测潜在余额异常至关重要。我们可以以近乎实时的方式进行对账,以在问题恶化前及时采取行动。我们专门为在线迁移过程开发了两种对账模块:实时对账和全面对账。
实时对账
基于交易级别构建的对账过程,旨在实时检测任何资金问题。
全面对账
我们可以根据同步到数据仓库的快照定期进行全面对账。这个过程可以确保旧账本和币安账本之间所有余额的一致性。
例如,假设旧账本中还有一千万用户。我们可以通过全面对账,验证旧账本和币安账本之间的余额和余额日志是否相同。
圆满完成迁移过程
总体来说,这项任务是通过两个步骤完成的:(1)采用复制技术验证新币安账本的正确性;(2)采用逐个账户迁移的策略,以平缓、安全、稳妥的方式升级引擎。
我们认为上述的在线迁移范例也适用于类似的任务。如果您对上述过程和话题感兴趣,不妨考虑加入我们的团队?币安始终在寻找想法新颖的敬业人才,与我们一起应对日常的挑战。
参考资料
币安账本如何支撑用户体验
GitHub的MySQL在线模式迁移工具
延伸阅读
《利用MLOps构建实时端到端机器学习管道》丨币安博客
《如何成为一名优秀的币安人?》丨币安博客
推荐阅读: