GreenPlum数据分布机制

简介: GreenPlum数据分布机制

一、介绍


GreenPlumCoodinator/Segment架构,集群通常由一个Coodinator节点和一个standby coodinator节点以及多个segment节点组成,其中数据放置在segment节点上。Coodinator是整个数据库的入口,客户端只会连接到Coodinator上并执行相关查询操作,Standby节点为Coordinator提供高可用支持,Mirrorprimary的备。

 


数据默认使用hash分布。

二、插入时数据是如何分布分发到哪个segment?

1、插入操作时值的由来


我们看下insert语句的执行计划:

 

它没有Motion节点,仅1slice,即root sliceResult节点是将insert的值物化以构建TupleTableSlot进行插入。也就是先物化然后insert

这里主要关注物化的值从哪来。Result节点的执行堆栈为:

    ExecutorRun->standard_ExecutorRun->ExecutePlan->
    ExecProcNode->ExecProcNodeFirst->ExecProcNodeGPDB->
    ExecResult->
      ExecProject->ExecEvalExprSwitchContext->ExecInterpExprStillvalid
      ->ExecInterpExpr
    

    ExecInterpExpr计算物化值步骤:EEOP_CONST;EEOP_ASSIGN_TMP。也就是得到个常量值放到resultslot中。

    通过gdb跟踪每个segment进程,可以了解到这里的常量值就是INSERT语句中VALUES的值。

    此时就可以了解到,SQL语句中VALUES值是直接发送到对于的segment的。

    那么,具体是如何发送的呢?


    2、值的发送


    发送函数由cdbdisp_dispatchX完成。我们来跟踪这个函数,看下是如何分发到指定的segment的。

    了解GP原理的话,我们知道发送前需要先在mastersegment之间建立一个连接,然后将执行计划通过这个连接发送过去。建立连接就是创建Gang,由函数AssignGangs完成。

      AssignGangs
        AssignWriterGangFirst(ds, sliceTable, rootIdx);
          slice->primaryGang = AllocateGang(ds, slice->gangType, slice->segments);
            newGang = cdbgang_createGang(segments, segmentType);
              cdbgang_createGang_async

      最终创建Gang建立连接会调用函数cdbgang_createGang_async。下面我们看下这个函数是如何建立连接的。

      堆栈:

        size = list_length(segments);
        newGangDefinition = buildGangDefinition(segments, segmentType);
        segdbDesc = newGangDefinition->db_descriptors[i];
        ret = build_gpqeid_param(gpqeid, sizeof(gpqeid),
                   segdbDesc->isWriter,
                   segdbDesc->identifier,
                   segdbDesc->segment_database_info->hostSegs,
                   totalSegs * 2);
        cdbconn_doConnectStart(segdbDesc, gpqeid, options, diff_options);//建立连接

        cdbconn_doConnectStart连接时,SegmentDatabaseDescriptor segdbDesc中的segment_database_info::GpSegConfigEntry存有segment的端口及IP等信息,即gp_segment_configuration系统表中内容。基于此信息,可以建立连接。

        那么segdbDesc内容从何而来?

        从上述堆栈,segdbDescGang中的db_descriptors[i],也就是buildGangDefinition函数生成:

          buildGangDefinition(List *segments, SegmentType segmentType)
            foreach_with_count (lc, segments , i){
              contentId = lfirst_int(lc);
              newGangDefinition->db_descriptors[i] =
                cdbcomponent_allocateIdleQE(contentId, segmentType);
            }

          SliceTable.slices[0].segments为入参segments链表,存储着执行该slice的所有segmentcontent idsegdbDesc是根据content id从系统表gp_segment_config来获取。

          到这里可以知道,通过SliceTable中的segment链表得到该slicesegmentcontentInsert仅一个sliceinsert分发到执行该insertsegmentcontent就是该segmentcontent id。通过该content idgp_segment_configuration系统表中得到相关portIP等信息,从而据此在mastersegment之间建立连接。构建链接后,insert语句通过此链接发送到对应的segment


          那么content id又是如何与分布键联系起来呢?


          经过分析,由函数DirectDispatchUpdateContentIdsForInsert来完成映射:


          constvalue为分布键的key值,然后通过cdbhash函数通过系统hash函数将key值进行hash,最终得到hashcode,该值即为content id,放到contentIds链表中。


          三、基础知识

          1、gp_segment_configuration


          dbid

          唯一标识segmentMaster1,然后primary节点按照content递增;接着是mirror按照content递增;最后是standby master

          content

          数据库节点的标识IDsegmentprimarymirror相同。Master节点为-1,数据节点:0-N

          role

          节点当前的角色,primary或者mirrorp:表示primarym:表示mirror

          preferred_role

          节点被定义的角色,primary或者mirror

          mode

          主备同步状态。s:表示已同步;n:表示不同步

          Master总是nstandby master segment总是s,但并不表示他们之间的同步状态,使用gp_stat_replication来看他们之间是否同步

          status

          u:表示正常,d:表示节点失败

          port

          子节点的端口

          hostname

          子节点所在机器的hostname

          address

          子节点所在机器的IP

          datadir

          实例的data目录

          2、Gang、slice与QueryDesc之间关系

          目录
          相关文章
          |
          存储 缓存 NoSQL
          数据库实体与关系模型
          【5月更文挑战第16天】本文介绍了数据库模型和UML关系,UML包括依赖、关联(聚合、组合)、泛化和实现4类关系。UML有13种图,分为结构图、行为图和交互图。数据库的基本数据模型包括外模式(用户视图)、概念模式(全局逻辑结构)和内模式(物理存储)。数据模型三要素是数据结构、操作和约束条件。简单易用的缓存数据模型适用于需求灵活、高性能、大数据量且不要求强一致性的场景。
          371 5
          数据库实体与关系模型
          |
          30天前
          |
          SQL 机器学习/深度学习 人工智能
          从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
          本文系统性地阐述了自然语言转SQL(NL2SQL) 技术如何让非技术背景的业务分析师实现数据自助查询,从而提升数据驱动决策的效率与准确性。
          从“写SQL”到“聊数据”:NL2SQL如何用自然语言解锁数据库?
          |
          2月前
          |
          人工智能 JSON 开发工具
          解决提示词痛点:用AI智能体自动检测矛盾、优化格式的完整方案
          本文介绍了一种基于用户意图的提示词优化系统,利用多智能体架构实现自动化优化,提升少样本学习场景下的提示词质量与模型匹配度。系统通过专用智能体协同工作,识别并修复逻辑矛盾、格式不清及示例不一致等问题,结合Pydantic结构化数据模型与OpenAI评估框架,实现高效、可扩展的提示词优化流程。该方案显著减少了人工干预,增强了系统效率与输出一致性,适用于复杂研究任务与深度AI应用。
          271 0
          解决提示词痛点:用AI智能体自动检测矛盾、优化格式的完整方案
          |
          4月前
          |
          存储 人工智能 API
          RAG-MCP:基于检索增强生成的大模型工具选择优化框架
          RAG-MCP是一种通过检索增强生成技术解决大型语言模型(LLM)工具选择困境的创新框架。它针对提示词膨胀和决策效率低的问题,利用语义检索动态筛选相关工具,显著减少提示词规模并提升准确率。本文深入解析其技术原理,包括外部工具索引构建、查询时检索处理等核心步骤,以及实验评估结果。RAG-MCP不仅优化了LLM的工具使用能力,还为AI代理的发展提供了重要支持,未来可在极端规模检索、多工具工作流等方面进一步探索。
          380 16
          RAG-MCP:基于检索增强生成的大模型工具选择优化框架
          |
          PHP 开发工具 对象存储
          PHP 使用 OSS上传文件
          PHP 使用 OSS上传文件
          5701 0
          |
          缓存 NoSQL Java
          SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
          这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
          SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
          |
          Shell Linux 调度
          cgroup 资源控制介绍
          cgroup 资源控制介绍
          |
          Linux 调度 Docker
          Linux中的cgroup技术
          【8月更文挑战第2天】cgroup (control group) 是 Linux 内核提供的资源管理机制,用于控制进程资源使用。它包含多个子系统,如 CPU、cpuacct、cpuset、memory、blkio、devices、net_cls 和 freezer,分别用于限制 CPU 使用率、统计 CPU 使用、分配 CPU 或内存节点、限制内存使用、限制块设备 I/O、控制设备访问、标记网络数据包和挂起或恢复进程。
          |
          安全 Linux 数据安全/隐私保护
          Linux命令strings详解
          `strings`是Linux工具,用于从二进制文件中提取可打印字符串,常用于文件分析、安全审计和逆向工程。它可以识别至少4个连续可打印字符的序列,并支持多种参数,如`-n`调整最小长度,`-f`显示文件名。示例用法包括`strings /bin/ls`和`strings -n 6 /usr/bin/uptime | grep GLIBC`。注意敏感信息泄露,结合其他命令可增强分析能力。