Greenplum 6新特性: 在线扩容工具GPexpand剖析
Greenplum 6新特性: 在线扩容工具GPexpand剖析 杜佳伦 (jdu@pivotal.io) 大纲 • Greenplum 集群部署 • GPExpand简介与具体用法 • Greenplum 6中GPExpand的改进与实现 Greenplum 集群部署 Greenplum 集群部署 • gp_segment_configuration 字段名 描述 dbid 复制表 numsegments 表分布在多少个节点上 diskkey 分布列的序号 distclass 分布列的操作类 GPExpand简介与具体用法 • GPExpand是Greenplum的扩容工具,可以为集群增加新的节 点来支持更大容量的存储和更高的计算能力。 • 随着Greenplum一起安装发布,在$GPHOME/bin下面,和其 他辅助工具,如gpstart,gpstop,gpa postgres下创建gpexpand schema(-D参数已经取消) – gpexpand schema下面会创建几张表 ▪ status —扩容状态 ▪ status_detail —将所有需要扩容的表都存到这个表里 ▪ expansion_progress —记录扩容时的状态 GPExpand简介与具体用法 • 数据重分布 – GPExpand – 会遍历postgres数据库下面gpexpand0 码力 | 37 页 | 1.12 MB | 1 年前3Greenplum Database 管理员指南 6.2.1
.................. - 334 - 第十六章:扩容 ...................................................................................................................... - 336 - 扩容概述................................ ....................... - 337 - GP 数据库扩容规划 ........................................................................................................ - 341 - 扩容准备工作检查清单 ............................... ......................................................................................... - 354 - 扩容配置文件的格式 ...........................................................................................0 码力 | 416 页 | 6.08 MB | 1 年前3Hello 算法 1.1.0 Go版
Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。 Q:原码转补码的方法是“先取反后加 1”,那么补码转原码应该是逆运算“先减 1 后取反”,而补码转原码也 一样可以通过“先取反后加 1”得到,这是为什么呢? [5]int // 在 Go 中,指定长度时([5]int)为数组,不指定长度时([]int)为切片 // 由于 Go 的数组被设计为在编译期确定长度,因此只能使用常量来指定长度 // 为了方便实现扩容 extend() 方法,以下将切片(Slice)看作数组(Array) nums := []int{1, 3, 2, 5, 4} 2. 访问元素 数组元素被存储在连续的内存空间中,这意味着计 nums[i] == target { index = i break } } return } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 383 页 | 18.48 MB | 1 年前3Hello 算法 1.1.0 JavaScript版
Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。 Q:原码转补码的方法是“先取反后加 1”,那么补码转原码应该是逆运算“先减 1 后取反”,而补码转原码也 一样可以通过“先取反后加 1”得到,这是为什么呢? { if (nums[i] === target) return i; } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。 ‧ 长度不可变:数组在初始化后长度就固定了,扩容数组需要将所有数据复制到新数组,开销很大。 ‧ 空间浪费:如果数组分配的大小超过实际所需,那么多余的空间就被浪费了。 4.1.3 数组典型应用 数组是一种基础且常见的数据结构,既频繁应用在各类0 码力 | 379 页 | 18.46 MB | 1 年前3Hello 算法 1.1.0 TypeScript版
Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。 Q:原码转补码的方法是“先取反后加 1”,那么补码转原码应该是逆运算“先减 1 后取反”,而补码转原码也 一样可以通过“先取反后加 1”得到,这是为什么呢? (nums[i] === target) { return i; } } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。 ‧ 长度不可变:数组在初始化后长度就固定了,扩容数组需要将所有数据复制到新数组,开销很大。 ‧ 空间浪费:如果数组分配的大小超过实际所需,那么多余的空间就被浪费了。 4.1.3 数组典型应用 数组是一种基础且常见的数据结构,既频繁应用在各类0 码力 | 383 页 | 18.49 MB | 1 年前3Hello 算法 1.2.0 简体中文 JavaScript 版
Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。 Q:原码转补码的方法是“先取反后加 1”,那么补码转原码应该是逆运算“先减 1 后取反”,而补码转原码也 一样可以通过“先取反后加 1”得到,这是为什么呢? { if (nums[i] === target) return i; } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。 ‧ 长度不可变:数组在初始化后长度就固定了,扩容数组需要将所有数据复制到新数组,开销很大。 ‧ 空间浪费:如果数组分配的大小超过实际所需,那么多余的空间就被浪费了。 4.1.3 数组典型应用 数组是一种基础且常见的数据结构,既频繁应用在各类0 码力 | 379 页 | 18.47 MB | 10 月前3Hello 算法 1.0.0 Golang版
Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。 66 第 4 章 数组与链表 � 数据结构的世界如同一堵厚实的砖墙。 数组的砖块整齐排列,逐个紧贴。链表的砖块分散各处,连接的藤蔓自由地穿梭于砖缝之间。 [5]int // 在 Go 中,指定长度时([5]int)为数组,不指定长度时([]int)为切片 // 由于 Go 的数组被设计为在编译期确定长度,因此只能使用常量来指定长度 // 为了方便实现扩容 extend() 方法,以下将切片(Slice)看作数组(Array) nums := []int{1, 3, 2, 5, 4} 2. 访问元素 数组元素被存储在连续的内存空间中,这意味着计 nums[i] == target { index = i break } } return } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 382 页 | 17.60 MB | 1 年前3Hello 算法 1.0.0 JavaScript版
Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。 65 第 4 章 数组与链表 � 数据结构的世界如同一堵厚实的砖墙。 数组的砖块整齐排列,逐个紧贴。链表的砖块分散各处,连接的藤蔓自由地穿梭于砖缝之间。 { if (nums[i] === target) return i; } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。 ‧ 长度不可变:数组在初始化后长度就固定了,扩容数组需要将所有数据复制到新数组,开销很大。 ‧ 空间浪费:如果数组分配的大小超过实际所需,那么多余的空间就被浪费了。 4.1.3 数组典型应用 数组是一种基础且常见的数据结构,既频繁应用在各类0 码力 | 376 页 | 17.57 MB | 1 年前3Hello 算法 1.0.0 C语言版
Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。 67 第 4 章 数组与链表 � 数据结构的世界如同一堵厚实的砖墙。 数组的砖块整齐排列,逐个紧贴。链表的砖块分散各处,连接的藤蔓自由地穿梭于砖缝之间。 if (nums[i] == target) return i; } return -1; } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。 ‧ 长度不可变:数组在初始化后长度就固定了,扩容数组需要将所有数据复制到新数组,开销很大。 ‧ 空间浪费:如果数组分配的大小超过实际所需,那么多余的空间就被浪费了。 4.1.3 数组典型应用 数组是一种基础且常见的数据结构,既频繁应用在各类0 码力 | 390 页 | 17.63 MB | 1 年前3Hello 算法 1.0.0b4 Golang版
[5]int // 在 Go 中,指定长度时([5]int)为数组,不指定长度时([]int)为切片 // 由于 Go 的数组被设计为在编译期确定长度,因此只能使用常量来指定长度 // 为了方便实现扩容 extend() 方法,以下将切片(Slice)看作数组(Array) nums := []int{1, 3, 2, 5, 4} 4.1.1. 数组优点 在数组中访问元素非常高效。由于数组元 return } 4. 数组与链表 hello‑algo.com 53 4.1.2. 数组缺点 数组在初始化后长度不可变。由于系统无法保证数组之后的内存空间是可用的,因此数组长度无法扩展。而 若希望扩容数组,则需新建一个数组,然后把原数组元素依次拷贝到新数组,在数组很大的情况下,这是非 常耗时的。 // === File: array.go === /* 扩展数组长度 */ func extend(nums 数据,这使数组长度的选 择变得困难。若长度过小,需要在持续添加数据时频繁扩容数组;若长度过大,则会造成内存空间的浪费。 为解决此问题,出现了一种被称为「动态数组 Dynamic Array」的数据结构,即长度可变的数组,也常被称 为「列表 List」。列表基于数组实现,继承了数组的优点,并且可以在程序运行过程中动态扩容。在列表中, 我们可以自由添加元素,而无需担心超过容量限制。 4.3.10 码力 | 347 页 | 27.40 MB | 1 年前3
共 265 条
- 1
- 2
- 3
- 4
- 5
- 6
- 27