AntDB 企业增强特性介绍——AntDB在线数据扩容关键技术

数据库集群安装完成后,其数据存储容量是预先规划并确定的。随着时间的推移以及业务量的增加,数据库集群中的可用存储空间不断减少,面临数据存储容量扩充的需求。
传统的在线扩容的流程大致如下。
(1)在集群中加入新的 Datanode Master 节点。由于在创建 Hash 表和复制表时,将表分布的节点写入表定义(pgxc_class),因此新增 Datanode Master 节点后,新建表会使用新增节点,而之前建立的表不会使用新增节点, 从而不会影响表的访问。
(2)对于已经存在的表,调用 alter table 语句,重新分布已有表的数据,对表加锁(AccessExclusiveLock)进行数据重分布,释放表锁,通过新增Datanode Master 节点重新分布数据,现有方案就完成了集群数据扩容。
传统方案存在的问题是,在表的扩容期间,AccessExclusiveLock 锁会阻塞对该表的所有操作,对于大容量表,扩容时间长,会影响集群的可用性。由此, AntDB 提出了hot expasion 扩容方案,将扩容对集群可用性的影响限制在秒(10s) 级别。

1.关键技术
1)HashMap 路由算法
对于分区表,要根据记录的分区字段取值确定该记录所在的数据节点。原有路由算法为:
节点序号 =hash(hashkey)/ 节点数量
该算法存在两个问题:一是记录所在的位置是由分区字段值确定的,如果数据倾斜,无法将数据量多的节点中的数据迁移到数据量少的节点。二是扩容时,为避免数据全部重新分布,通常采用将 n 节点扩容到 2n 节点的方法。
系统中原有 2 个数据节点 DB1 和 DB2,扩容为 4 个数据节点 DB1、DB1’、DB2、DB2’,如图 3-23 所示。

由于 Hash 算法基于节点数目取模,无法做到 DB1 数据不动,仅增加 DB2’
节点,对 DB2 扩容,如图 3-24 所示。

为克服以上问题,hot expasion 扩容方案采用 HashMap 路由算法。首先,将整个集群的数据划分为 1024(可设定)的 slot。对分片 key 字段Hash 后,除 1024 取模,可以得到一个对应的 slotid。示意代码如下:

其次,建立 slotid 到物理节点的映射表,表示 slotid 的数据存放在 nodeid 节点,映射表(SlotNodeMap)维护数据的映射和每个 slot 的状态,包含以下字段:
●slotid:slot序号。
●nodeid:节点序号。
●status: slot的状态,包括在线( online)、迁移( move)、清除(clean)。

最后,数据路由时,通过 slotid 从映射表中找到对应的节点。示意代码如下:

2)数据热备份与增量数据同步

扩容节点需要复制被扩容节点的完整数据。数据复制包括基础数据复制和增量数据复制两个部分。采用 checkpoint 和 xlog 同步技术完成复制,不会影响被扩容数据节点对外提供服务。首先,在被扩容节点做 checkpoint;然后, 直接热拷贝数据到扩容节点做基线数据备份,之后,启动扩容节点,建立到被扩容节点的流复制,从 checkpoint 的 redo_lsn 位置开始回放 xlog 日志,做增量数据同步。AntDB 的 basebackup 工具已实现以上功能,hot expasion 直接使用basebackup 工具完成数据复制。
基于 AntDB 的逻辑复制,可以实现一个数据节点中的 slotid 数据热迁移到另外一个数据节点,以平衡数据的分布。

3)重复数据处理

将 1 个数据节点扩容为 2 个数据节点的过程中,1 条记录会存储在 2 个数据节点。重复数据的存在,需要增加记录的可见性处理和冗余数据删除。对于不包含分区键信息的 SQL 语句,数据节点需要根据 HashMap 路由算法计算该记录的 slotid,并判断该 slotid 是否属于本节点,该步骤称为 slot 可见性处理。对每条记录进行 Hash 算法,会占用较多 CPU 资源,应仅在必须时才进行 slot 可见性处理。路由切换完成后,被扩容节点和扩容节点都包含冗余数据。将冗余数据删除后,空间才能够被再次利用,实现数据扩容。冗余数据的删除不应影响正常的数据访问,并能够根据集群负载调整删除进度。
hot expasion 将扩容操作分为数据同步、路由切换、数据清理三个阶段, 节点的状态包括 online、move、clean、expended,具体如下:

●online:节点处于非扩容状态。
●move:被扩容节点状态,表示该节点正在向扩容节点同步数据。
●clean:被扩容节点已加入集群,节点包含冗余数据。

一次扩容中被扩容节点状态变化为 online → move → clean → online,扩容节点状态变化为expended → clean → online。
扩容具体流程见“z. 扩容示例”。

hot expasion 仅在数据清理阶段(节点状态为 clean)启用 slot 可见性处理, 在非扩容和扩容的同步数据阶段不启用 slot 可见性处理,将该操作对集群性能的影响降至最低。

节点进入 clean 状态后,自动启动清除进程。该进程首先统计当前节点的Hash 表,并依次对每个 Hash 表进行清除处理,删除非本节点数据。根据系统负载控制删除进度,当所有 Hash 表清除完成后,节点进入 clean 状态。清除处理使用普通的 delete from 语句处理流程,只在数据可见性判断时,返回不属于本节点的记录,从而删除非本节点数据,保留本节点数据。此清除方法,不需要改动 vacuum 和事务处理流程,对系统的影响最小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/28758.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库迁移 | Oracle数据迁移方案之技术两三点

今年Oracle似乎又火了,火得要下掉,目前中国大概有240数据库企业,在国产信创的大趋势下,一片欣欣向荣,国库之春已然来临。到今天为止,Oracle依旧是市场份额最大的数据库,天下苦秦久矣&#xff0c…

【JVM 监控工具】JVisualVM的使用

文章目录 前言二、启动JVisualVM三、安装插件四、使用 前言 JVisualVM是一个Java虚拟机的监控工具,要是需要对JVM的性能进行监控可以使用这个工具哦 使用这个工具,你就可以监控到java虚拟机的gc过程了 那么,这么强大的工具怎么下载呢&…

顶奢好文:3W字,穿透Spring事务原理、源码,至少读10遍

说在前面 在40岁老架构师 尼恩的读者社区(50)中,最近有小伙伴拿到了一线互联网企业如阿里、美团、极兔、有赞、希音的面试资格,Spring事务源码的面试题,经常遇到: (1) spring什么情况下进行事务回滚? (2) spring 事务…

Transformer在CV领域有可能替代CNN吗?

目前已经有基于Transformer在三大图像问题上的应用:分类(ViT),检测(DETR)和分割(SETR),并且都取得了不错的效果。那么未来,Transformer有可能替换CNN吗&#…

索尼RSV视频修复方法论视频文件修复时样本文件的三同

索尼RSV类的文件修复案例有很多,程序操作也很简单没什么可说的,这次这个索尼ILCE-7SM3的案例就是为了让大家更好的认识视频修复中我称之为“三同“的重要性,想要恢复的效果好必须要把准备工作做到位。 故障文件:45.1G RSV文件 故障现象: 索…

工具篇--4 消息中间件-RabbitMq 模型介绍

1 介绍: RabbitMQ 是一个开源的消息中间件,它实现了 AMQP(高级消息队列协议)标准,并且支持多种语言和操作系统,包括 Java、Python、Ruby、PHP、.NET、MacOS、Windows、Linux 等等。RabbitMQ 提供了可靠的消息传递机制…

竞赛无人机搭积木式编程(三)---用户自定义航点自动飞行功能(全局定位,指哪打哪)

竞赛无人机搭积木式编程(三)---用户自定义航点自动飞行功能(全局定位,指哪打哪) 无名小哥 2023年6月10日 用户通过对前面两讲中全国大学生电子设计竞赛真题植保无人机(2021)、送货无人机&#…

【UE 从零开始制作坦克】2-控制坦克移动(简单的移动效果)

效果 步骤 1. 新建蓝图类,父类选择“VehicleWheel(载具车轮)” 这里就命名为“TankWheel” 双击打开“TankWheel”,设置形状半径为40 2. 打开 “BP_West_Tank_M1A1Abrams” 选中“网格体(VehicleMesh)&…

JMeter参数化4种实现方式

目录 前言: 1 参数化释义 2 参数化实现 CSV实例 注意事项 前言: 在使用JMeter进行测试时,参数化允许您模拟不同的用户、不同的数据、不同的操作等,从而增加了测试的灵活性和复用性 1 参数化释义 什么是参数化?…

设计模式(十八):行为型之观察者模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

分布式数据库HBase

大数据基础-分布式数据库HBase 概述HBase简介HBase与传统关系数据库的对比分析 HBase数据模型数据模型概述数据模型相关概念数据坐标 HBase的实现原理HBase功能组件表和RegionRegion的定位HBase框架结构HMasterRegionServerHBase协作组件RegionColumnFamilyKeyValue小结 HBase运…

STM32单片机(六)TIM定时器 -> 第二节:TIM定时中断练习(定时器定时中断和定时器外部时钟)

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

docker数据管理---数据卷,数据卷容器

在Docker中,数据卷(data volumes)和数据卷容器(data volume containers)是用于在容器之间共享和持久化数据的两种不同的机制。 一、数据卷 数据卷是一个特殊的目录或目录,可以绕过容器文件系统的常规层&a…

【RabbitMQ教程】第六章 —— RabbitMQ - 延迟队列

💧 【 R a b b i t M Q 教程】第六章—— R a b b i t M Q − 延迟队列 \color{#FF1493}{【RabbitMQ教程】第六章 —— RabbitMQ - 延迟队列} 【RabbitMQ教程】第六章——RabbitMQ−延迟队列💧 🌷 仰望天空,妳我亦是行人…

2023年前端面试高频考点HTML5+CSS3

目录 浏览器的渲染过程⭐⭐⭐ CSS 、JS 阻塞 DOM 解析和渲染 回流(重排)和重绘⭐⭐ 选择器 ID选择器、类选择器、标签选择器(按优先级高到低排序)⭐⭐ 特殊符号选择器(>,,~,空格&#xff0…

Stopwatch工具类计时器探究

搬砖的我们 特别是Java开发的童鞋们, 经常需要通过记录开始时间和结束时间,然后通过计算差值,得到时间差,如下面的代码: long start System.currentTimeMillis(); long end System.currentTimeMillis(); System.out.println(…

医疗设备都在用哪些晶振?

医疗设备是指用于医疗诊断、治疗、监测等方面的各种设备。随着科技的不断发展,医疗设备的功能不断增强,精度和稳定性也得到了大幅提升。在这些医疗设备中,晶振是非常重要的元件之一。本文将介绍医疗设备中常用的晶振类型及其特点。 一、晶振…

P20[6-8]编码器接口测速(软)

与外部中断编码器逻辑不同,此处编码器使用的是定时器方法 1.Encoder编码器部分: #include "stm32f10x.h" // Device header void Encoder_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCm…

阿里云弹性公网EIP收费价格表

阿里云弹性公网EIP怎么收费?EIP地域不同价格不同,EIP计费模式分为包年包月和按量付费,弹性公网IP可以按带宽收费也可以按使用流量收费,阿里云百科分享阿里云弹性公网IP不同地域、不同计费模式、按带宽和按使用流量详细收费价格表&…

Java泛型的使用

1.什么是泛型? 所谓泛型,就是允许在定义类、接口时通过 一个标识 表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时&#…
最新文章