博主信息
博文 2
粉丝 0
评论 0
访问量 2879
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
Online Schema Change(在线更新元数据)
手机用户871306741
原创
595人浏览过

  传统的关系型数据库在执行 Schema 变更时,为了保证数据一致性需要锁表,锁表期间任何读写操作都会受到阻塞,直到 Schema 变更结束,释放表锁。
  这样做法使处理流程简单化,但同时弊端也很明显,那就是其他的 DML 操作都会受到阻塞,影响正常业务。
  开务数据库的 OSC 引进 2 个中间状态,通过控制过渡状态来保证数据一致性且不需要锁表,因而不影响正常业务。为方便后续理解,这里先罗列常见的 4 种 OSC 状态
  1、Absent 此状态下 Schema 不存在,定义的对象不可用。Schema 对所有操作不可见,不可读写。
  2、DescriptorMutation_DELETE_ONLY 指变更的这部分 Schema 只对删除操作可见。
  3、DescriptorMutation_DELETE_AND_WRITE_ONLY 指变更的这部分 Schema 只对写操作可见,包括 Insert, Delete, Update。
  4、PublicSchema 已完成变更,定义的对象完全可用。Schema 对所有操作可见,定义的对象可读可写。
  接下来通过 “Create Index" 实例,介绍开务数据库在实际业务中如何保持数据一致性且不影响正常业务流程>>

s.png

  第 1 步: 由 Absent 状态演进到 DELETE_ONLY 状态,Version+1,Mutation 对 Delete 操作可见;
  第 2 步: 通过 waitToUpdateLeases 函数等待集群的其他节点将表元数据更新到 Version2,这期间 Version2 和 Version1 共存,此时在 Node2 插入业务数据,由于 DELETE_ONLY 状态下 Insert 对 Mutation 不可见,不会增加索引数据,所以不会出现数据不一致情况;
  第 3 步: 由 DELETE_ONLY 状态演进到 DELETE_AND_WRITE_ONLY 状态,Version+1,Mutation 对 Insert 和 Delete 可见;
  第 4 步: 通过 waitToUpdateLeases 函数等待集群的其他节点将表元数据更新到 Version3,这期间 Version3 和 Version2 共存,此时在 Node2 插入业务数据,由于 DELETE_AND_WRITE_ONLY 状态 Mutation 对 Insert 可见,所以会增加索引数据,Node1 还是 DELETE_ONLY 状态,Delete 业务数据能把对应的索引数据也删除,所以不会出现数据不一致情况;
  第 5 步:可选,需要做数据回填的 DDL 语句(增加索引、删除列、增加带默认值的列);
  第 6 步:由 DELETE_AND_WRITE_ONLY 状态演进到 Public 状态,Version+1,Mutation 对 Insert、Delete 和 Read 可见;
  第 7 步:通过 waitToUpdateLeases 函数等待集群的其他节点将表元数据更新到 Version4,这期间 Version4 和 Version3 共存,此时在 Node2 插入业务数据,由于 Public 状态 Mutation 对 Insert 可见,所以会增加索引数据。Node1 还是 DELETE_AND_WRITE_ONLY 状态,Delete 业务数据能把对应的索引数据也删除。相反 Node1 插入业务数据也会增加索引数据,Node2 删除业务数据也能删掉索引数据,所以不会出现数据不一致情况。
  至此,完成了创建索引的变更,由于每 2 个版本是兼容的,所以完成变更之后能保证数据的一致性。最后为大家梳理一下整体的脉络流程:

ss.png

1、执行算子,往表描述符添加变更操作 Mutation;
  2、执行算子,生成 Job 信息,往 System.jobs 系统表插入信息;
  3、将 DDL(Data Definition Language) 事务状态转为 Commit;
  4、通过 Channel 通知后台 Work 处理 Job;05 后台 Work 遍历 System.jobs,找到 Lease 属于本节点且状态为 Running 的 Job,并为每个 Job 起一个 Goroutine 进行处理。

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学