GaussDB(DWS)扩容重分布介绍
一 扩容重分布背景介绍
GaussDB(DWS)采用MPP架构,数据通过一定的分布策略分布在所有的数据节点上.
随着集群部署时间及业务的增长,数据库在运行性能及存储上慢慢会达到瓶颈。此时通过增加计算节点来提升集群的计算、存储资源的过程即为扩容, 扩容过程包含了 集群加节点, 数据重分布两个过程. 扩容从本质上说是把数据从原集群搬迁到新集群的过程.
为保证数据均衡,新扩节点需要数据重分布;表重分布采用 创建临时表 —> 同步表数据 —>切换数据文件方式实现,这样做的目的是保持表元数据和依赖关系不变,切换完文件后临时表将被删除.
二 扩容重分布流程简介
2.1 离线扩容与在线扩容
扩容分为离线扩容与在线扩容, 具体区别如下:
离线扩容:集群关闭白名单限制业务接入状态下完成节点添加和数据重分布。该方式不涉及与业务资源的冲突,资源利用率高, 扩容总耗时短. 适用于资源紧张,业务处理有空档期的场景。
该方式在813版本后,逐步被在线扩容代替;后续主要应用于资源紧张,客户可提供较长停机窗口的场景。
在线扩容:在线扩容过程支持用户业务执行,业务SQL不中断并能够在规定时间内完成。该方式适用于没有合适的扩容期,同时资源相对充足的场景。此外, 为了保证业务正常运行, 此过程需要运维人员支撑, 并要求运维人员熟悉业务与重分布业务的干扰情况.
2.2 扩容重分布流程
在线扩容重分布的流程主要分为三个步骤: 下发节点、将节点加入集群、数据重分布.
步骤1. DWS节点发放:从云底座分配虚拟机或物理机给DWS;
步骤2. 在线扩容加节点阶段:
将分配的节点加入DWS集群,从CN上获取数据对象元数据构建新的DN节点,包括各种表、外表、schema、function、用户等元数据;
为了实现在线扩容,构建过程分为全量build和增量build两阶段,增量build阶段会加集群锁,阻塞所有DDL语句;build完成后,会创建一个包括新旧节点的新节点组(NodeGroup);对逻辑集群,build完成后还需要删除不属于当前逻辑集群的表,所以逻辑集群扩容build过程阻塞DDL语句的时间比物理集群长;
当所有新增DN都完成元数据同步后,会将这些DN添加到DWS集群中,并创建一个新的节点组(包含所有新老DN),新节点组创建完成后会释放集群锁,所有阻塞的DDL语句会继续执行;
新节点组创建后,所有新创建的表都会分布在新节点组上(即分布在所有新老DN上);扩容前已经存在的表需要通过扩容重分布来将数据迁移到新节点组上。
新节点组创建后,新增的DN还要完成DN主备同步后才能完成整个扩容加节点过程。
步骤3. 在线扩容重分布:
将所有老节点组(只包含扩容前的DN节点)上的表重新分布到新节点组(包括所有新旧节点)上。在线重分布阶段是以表为单位进行重分布,可以动态调整重分布的并发度。表在重分布过程中对访问该表的业务语句有一定约束,重分布前和重分布完成后业务语句对表访问没有影响;重分布结束,会删除旧的节点组(NodeGroup);对逻辑集群,需要保留旧的节点组,因此还需要将新节点组中所有表转移回就的节点组,并删除新节点组;
在线重分布过程中,会创建一个和待重分布表定义完全相同的临时表,但临时表分布在新节点组(包含新增DN)中. 在线重分布阶段是以表为单位进行重分布,可以动态调整重分布的并发度。表在重分布过程中对访问该表的业务语句有一定约束,重分布前和重分布完成后业务语句对表访问没有影响;重分布结束,会删除旧的节点组(NodeGroup).
扩容重分布的难点在于在线扩容, 需要考虑扩容期间的各个流程中, 都能保证用户执行各种SQL语句有一致、正确的结果, 并尽可能降低对用户业务的影响.
三 扩容重分布规格
在线重分布模式下数据库支持部分DDL和DCL操作。
- 正在重分布的表支持插入、删除、更新和部分DDL语法。支持功能如下:
- 重分布过程中用户可进行正在重分布的本地表的INSERT、DELETE、UPDATE、MERGE INTO、OVERWRITE、UPSERT业务。
- 重分布过程中用户可进行正在重分布的本地表跨节点组的关联查询业务。
- 重分布过程中用户可进行正在重分布的本地表的重命名、修改schema、DROP、TRUNCATE、TRUNCATE-PARTITION业务。
- 正在重分布的表不支持功能如下:
- 正在重分布过程中用户不能执行ALTER TABLE语句,典型包括增加、删除字段,增加或删除分区等,但TRUNCATE PARTITION除外。
- 表正在重分布过程中用户不能创建、修改、删除索引。
- 表正在重分布过程中用户不能对该表执行VACUUM FULL和CLUSTER语句。
- 表正在重分布过程中用户不能修改字段依赖的SEQUENCE对象,包括创建和修改字段依赖的SEQUENCE对象,典型的语句是CREATE/ALTER SEQUENCE ... OWNED BY。
- 超过996列的表(后拓展为1596),表重分布期间不支持UPDATE和DELETE语句,更新删除语句会报错,但允许执行SELECT/INSERT语句。
- 整个重分布过程中不支持创建、删除或修改Database对象和Tablespace对象。
重分布前, 一般还需要做如下环境检查工作, 否则可能会导致重分布失败
- 离线重分布:
- 磁盘空间评估,单表过大重分布可能导致磁盘空间不足,需要评估重分布执行需要的额外磁盘空间和重分布并发度,否则可能因为磁盘不足导致扩容失败;
- 扩容时间评估,这影响用户业务停机时间窗,需要根据表数量、数据规模、索引情况来评估,数据库较多或索引较多情况会使得重分布时间更长;
- 需要扩容前巡检和元数据检查,扩容前需要全库执行analyze,检查是否存在元数据不一致,元数据不一致或表数据损坏会导致表重分布失败;
- 在线重分布
在线扩容过程支持用户业务执行,业务SQL不中断并能够在规定时间内完成。该方式适用于没有合适的扩容期,同时资源相对充足的场景。在线扩容实施过程中业务会保持运行,在线扩容和业务SQL语句执行会有资源竞争和加锁冲突存在。具体注意事项如下:
- 扩容加节点申请集群锁会阻塞DDL,导致扩容失败或用户DDL被长时间阻塞;
- 扩容重分布耗时长,单表重分布过程需要多次加8级锁,容易因为用户长作业导致单表重分布失败,或和用户作业产生死锁;
- 表重分布追增阶段,更新和删除数据多容易引起追增语句耗时很长,从而持有8级锁耗时长,阻塞用户业务或引起业务锁超时,也容易导致重分布耗时更久。
- 表重分布没有空间检查,表重分布顺序固定,可能由于单表过大引发磁盘空间不足;
- 表重分布不支持多库同时重分布,会引起长尾问题和并发度上不去;
- 表重分布中大部分Alter table语句不支持,包括各种分区DDL;
- 行存表在线重分布需要新增4个临时列用来记录删除信息,所以超过996列的表在线重分布过程不支持在线重分布, 重分布期间不能做数据更新和删除;
- 点赞
- 收藏
- 关注作者
评论(0)