MPPDB集群高可用设计

article/2025/9/27 12:55:03

目录

1. 前言

2. 内核端高可用设计

    2.1 GTM高可用

    2.2 CN高可用

    2.3 DN高可用

    2.3.1 主、备、从高可用设计

    2.3.2 数据复制

3. 集群管理端高可用设计

    3.1 CMserver高可用

    3.2 CMagent高可用


1. 前言

MPPDB集群服务组件主要分为内核端和集群管理端,内核端主要包括GTM组件,CN组件和DN组件;集群管理端主要包括CMServer组件和CMagent组件。

2. 内核端高可用设计

    2.1 GTM高可用

在MPPDB中,GTM在集群中只有一个实例,如果故障后,集群将无法使用,因此需要给GTM配置一个备机,主机故障后,备机可以接管服务。
GTM主要负责分发xid和snapshot,由于xid要全局唯一,因此需要持久化到磁盘上,凡是需要持久化磁盘的都需要有备份,那么GTM主机在每将一次xid值写入到gtm.control文件中,就会和备机同步一次,备机写完后,主机再写。
在同步过程中,主机业务线程只需给GTM备机发送一个消息包,GTM备机接收到消息后创建一个服务线程,并将事务xid写入本地文件,回复消息,主机的一次同步便完成。GTM在内存中xid每加2000时会向备机同步一次。
如果GTM主机永久故障,GTM备机升主后,只需要重新初始化一个GTM实例出来然后和主机同步xid即可

    2.2 CN高可用

通常一个集群中会部署多个CN,多个CN互为主备。如果一个CN故障,那么客户端可以使用其他CN。
由于CN只存储元信息数据(即每张用户表数据分布在哪几个DN),因此只有DDL操作时才设计到CN存储数据,DML时CN并不需要写数据。在DDL操作时,接受业务的CN会把该SQL发送到所有其他CN与所有DN,通过两阶段提交来保证各个CN的数据一致性。这里也有一个设计缺陷,即当一个CN故障时,那么集群便无法操作DDL,此时只能手动从集群中删除该CN才能使用。
如果集群中一个CN永久故障,那么需要重新初始化一个CN,然后使用gs_dump从另一个CN到处元数据再导入到该新CN上。

    2.3 DN高可用

由于所有用户表数据通过sharding的方式存储在各个DN主上,各个DN数据完全没有分叉,如果主机故障后,那么数据将丢失,并无法提供服务,因此DN的高可用尤为重要,必须给DN主备配置一个或多个备机。
MPPDB中的DN的高可用主要包含两大块设计,第一:主、备、从高可用设计;第二:数据复制。

    2.3.1 主、备、从高可用设计

主备从中,其中主和备各有一份完整的数据,从备上不存储数据。由于分布式环境,一份数据分片在多个DN上,那么必须要求各个DN主与备必须强同步,如果不是强同步的话,主机故障,备机升主后,备机可能没有主机的部分数据,这样在分布式环境下就会产生有的DN上有数据,有的没有,会造成集群的数据不一致,因此DN的主备必须是强同步,事务提交时,数据必须已经写到备机上才可以提交。
此时就会暴露另外一个问题,即如果集群中有任意一个DN主或DN备故障后,那么集群将无法进行写事务,当集群中DN数据较多时,单节点故障场景在生产环境往往是不可避免的。因此为了解决单节点故障后集群写事务可用时,我们引入了从备这个实例,简单来讲就是备机故障后,数据将发送给从备,仍然保证了数据写两份的原则,事务照样可以提交。如果备机和从备均故障后,那么写事务仍然无法进行。
当主备从正常时,数据只发送给备机,从备空闲:
当备机故障时,数据会发送给从备,保证写事务正常进行;备机故障修复后,继续连接主机追赶故障过程中丢失的数据,并且此时主机数据不再发送给从备,直至备机追赶完主机达到同步状态,那么主机将发送命令,删除从备上所有数据。
当备机在追赶主机的时候,主机故障,那么会触发备机Failover,备机连接从备,接收数据,接收完成后,备机升主,数据同步给从备。
设计反思:
主备从当时设计的时候主要考虑的事避免数据的3份冗余,因为硬件层面已经做了RAID,软件层面再3份冗余,存储空间利用率很低,当时跟N9000配合,N9000就是卖存储的,所以提了这样一个方案。
实际上,从备,再进一步演化,可以变成oracle的far sync,oracle的far sync只接受日志不redo
Oracle far sync材料:
http://www.oracle.com/technetwork/database/availability/farsync-2267608.pdf
http://www.oracle.com/technetwork/database/availability/8395-data-guard-far-sync-1967244.pdf
另外,在TP里面,数据量没那么大,对可用性要求更高,从备就显得有点鸡肋了。所以在TP V1R5的设计里面,彻底去掉了从备。至少是1主2备。

    2.3.2 数据复制

在PG单机时,主备数据同步通过XLOG事务日志同步。在大量写事务场景下,会产生大量的XLOG日志,主机需要先将XLOG下盘,然后日志同步进程读取XLOG发送给备机,备机收到XLOG日志后下盘,然后恢复进程读取日志进行REDO。这个过程主备一共有两次写IO和两次读IO请求。
在OLAP场景中,普遍数据量都很大,并且很多场景往往只需要查询某张表中的某一列数据,这样通常采用列式存储格式。不仅有利于性能提升,并且按列存储,数据格式一样,非常利于压缩,节省存储空间。由于按列存储时,如果再按行存储方式去导入一行记录一条日志,那么性能将非常慢,如果没有日志,将无法实现主备同步目的,因此需要探求一种新的数据同步方式。
基于上面两方面考虑,我们设计了数据复制通道,即数据导入到DN后,组成一个个最小存储单元(行存按页面大小8K为单位,列存按CU大小8K为单位),然后发送给备机,备机接收到后,将数据写盘,并回复主机写盘数据逻辑位置(主机发送时,给每个数据单元设置一个uint64位单调递增的偏移位置,类似于XLOG中的LSN),主机在事务提交前,如果该事务要求写盘数据已经传输给备机,那么即可提交。
主要设计框架:
主备复制过程中,XLOG复制和数据复制并行传输,备机接收后,并行写盘,对于日志恢复drop table 或truncate table文件类操作时,两者通过表级锁来控制并发。
日志复制:主机记录XLOG后,会定期写到磁盘上,WalSend线程会读取磁盘上的日志,通过TCP网络发送给备机WalReceiver线程,该线程接收后会写到一个内存队列中,WalRecWriter线程定时从队列中取出来写盘,并更新备机写盘LSN,WalReceiver线程回复主机消息时把该值发送给主机。恢复日志线程定期读取磁盘上XLOG对日志进行REDO。
数据复制:数据复制只有在行存批量导入数据和列存导入数据时触发,数据导入后,存储层将多个数据tuple组成一个个数据最小存储单元,并将其发到发送队列中,DataSend线程将从发送队列中取数据通过TCP网络发送给备机DataReceiver线程,该线程接收数据后会写到一个内存队列中,由DataRecWriter回复主机消息时将该值发送给主机。数据复制过程中数据直接由DataRecWriter写盘,不需要恢复日志线程去恢复数据

3. 集群管理端高可用设计

    3.1 CMserver高可用

CMServer在集群中只有一个,如果主机故障后,需要备机来接管服务,因此它和GTM类似,需要配置一个备机,避免单节点故障。
CMserver上存储了当前集群状态信息(实例主备状态),这些信息需要实时同步给备机,避免主机故障后,备机无法精确仲裁。CMserver主机与备机有常驻的心跳线程,集群状态信息通过该线程同步。
由于集群状态信息比较简单,如果CMserver备机永久故障后,只需要重新初始化一个备机出来,连接主机同步信息即可。

    3.2 CMagent高可用

CMagent负载收集本地物理机中内核端各个组件的状态信息,并上报给CMserver,由于CMagent制管理本地物理机,如果单节点故障(如断电,机器故障)后,该物理机上实例均故障,无法管理,因此也不需要备机。且CMagent本地并不存储任何信息,是一个无状态组件,进程故障后,可以立刻拉起。

http://chatgpt.dhexx.cn/article/m9YTCmlT.shtml

相关文章

java JButton计算器布局

java JFrame大体框架 this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //窗体退出关闭程序 this.frame.setVisible(true); //该框架显示 this.frame new JFrame(“簡易計算器”); // 该面板的名字 this.frame.setLocation(100,100); //最初该面板定位 this.frame.…

java jbutton 省略号_JButton显示省略号

我正在尝试使用Swing库在Java中设置GUI。我创建了一个自定义按钮类,它具有自定义初始化程序,使事情变得更容易。它在下面: public class JTButton extends JButton { char type; public JTButton(String title, ActionListener listener, cha…

java jbutton_Java JButton按钮使用

/** *JButton按钮按键 * */ package com.swing; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; class jbutton extends JFrame{ private JButton btn1,btn2,btn3,btn4,btn5; public static void main(String[] args){ jbutton jbnew …

JButton

JButton():设置一个没有文本图案的按钮 JButton(String text):创建一个带文本的按钮 getContentPane().add(组件) package apiapi;import javax.swing.*;public class api {public static void main(String[] args) {JFrame framenew JFrame();frame.setTitle(&q…

java按钮组件(JButton、JCheckBox)

按钮在Swing中是比较常见的组件,用于触发特定动作,Swing中提供多种按钮组件,如按钮、单选按钮、复选框等,这些按钮都是从AbstractButton类中继承而来的,下面将讲解这些按钮的应用。 1.JButton按钮组件 Swing中的按钮…

JButton部分常用的方法

本篇文章将会教会大家JButton常用的使用方法 JButton是Swing的组件所以需要导入包 import javax.swing.*;1创建JButton //创建JButton JButton jButton new JButton(); //将JButton添加到面板里 jPanel.add(jButton);2设置JButton大小以及坐标 //设置JButton大小 jButton.…

07.JavaSwing(常用基础组件——JButton类)

一、概述 JButton组件是最简单的按钮组件,在按下和释放2个状态之间进行切换,可以通过捕捉按下并释放的动作执行一些操作,从而完成和用户之间的交互。 二、构造函数 JButton();//创建不带有设置文本或图标的按钮。 JButton(Icon icon);//创建…

【CSS】使HTML页面表格中文字水平且垂直居中的方法(易错)

问题出现 因为是td直接写的文字,并不是套了标签才写,水平居中很清楚就是text-aline: center; 但是垂直居中始终没有得到很好地解决,查找了网上的样式是vertical-align: middle; 试了一下没有效果,很苦恼。 解决办法 …

css水平垂直居中方式总结

这里写目录标题 1. text-align: center;文字水平居中;margin: 0 auto;自身水平居中2. 绝对定位margin(元素需要固定宽高)3. 绝对定位 transform: translate(-50%,-50%);4. 绝对定位margin: auto;5.父元素设置display: flex;justify-content: …

CSS水平垂直居中的几种实现方式

水平垂直居中 1.利用 position:absolute2. 利用margin:auto3. 利用弹性盒子4. 利用水平对齐和行高5. 最简便的方法 1.利用 position:absolute <div class"father"><div class"son"></div> </div>当已知元素宽度和高度时&#xff…

div+css实现水平/垂直/水平垂直居中超详解

目录 一、水平居中1.块级元素水平居中方法一:设置margin:0 auto方法二:设置flex布局方法三:设置css3的transform 2.行内元素水平居中行内元素在块级元素中水平居中方法一&#xff1a;将外层块级元素设置为text-align&#xff1a;center方法二&#xff1a;将行内元素设置为块级元…

16种CSS水平垂直居中方法

16种css水平垂直居中方法以及应用&#xff08;文字、图片&#xff09; 一、垂直居中 1、行内元素 基本思想&#xff1a;单行文本子元素line-height 值为父元素 height 值 .parent {height: 200px; }.son {line-height: 200px; }2、块级元素 2.1行内块级元素 基本思想&…

【CSS】CSS实现水平垂直居中

元素水平垂直居中的场景很常见&#xff0c;常用的方法如下&#xff1a; &#xff08;以下方法在chorme测试可行&#xff09; 一、文本垂直居中 <div class"test">这是一段文字</div>.test {width: 200px;height: 200px;background: orange;text-align:…

CSS实现水平垂直居中

方法1&#xff1a;position transform 先设置一个父元素和一个子元素 <div class"father"><div class"child"></div> </div> 给父元素添加相对定位 .father {position: relative; /* 省略部分代码 */ } 给子元素添加绝对定位…

css grid布局实现水平垂直居中 文字水平垂直居中

原来一直使用flex布局来实现水平垂直居中&#xff0c;今天才知道还有grid也是很好用的&#xff0c;参考阮一峰大神的博客&#xff0c;简单记录一下学习&#xff1b; <div class"container"> <div class"item">1</div><…

html css实现文本水平垂直居中显示

这几天在工作中遇到了一个小问题&#xff1a;文本内容怎么能在div里水平垂直居中显示呢&#xff1f;同时群里的小伙伴恰巧也有提问这个问题的&#xff0c;所以我就总结了一下我知道的方法。 一、利用行高(line-height)和vertical-align配合实现 具体做法如下&#xff1a; ht…

CSS 布局 - 水平 垂直对齐

CSS 布局 - 水平 & 垂直对齐 那么怎样设置居中对齐呢? 我们可以用margin: auto来设置水平居中对其元素。auto可以防止 元素的宽高溢出&#xff0c;而且也可以平均分配两边的空白。 举例说明: .center {padding: 23px;border: 5px solid red;width: 41%;margin: auto; }那…

CSS如何实现水平垂直居中?4种工作中非常常用的方法

*CSS如何实现水平垂直居中&#xff1f; ** 1.用定位中的 “子绝父相” 来做 [核心代码是给子盒子添加的margin-top、margin-left 分别等于自身的高度、宽度的负的 一半] PS&#xff1a;缺点&#xff1a;需要提前知道元素的尺寸。如果不知道元素尺寸&#xff0c;这个时候就需要…

CSS实现元素水平垂直居中的各种方法

关于 CSS 如何将元素进行水平垂直居中的几种常用方法 前言 在设计网页页面的过程中&#xff0c;总会有将元素或者文字进行水平或者垂直居中的要求&#xff0c;各种CSS样式调整&#xff0c;搞的头都大了。这里将会介绍 CSS 中几种常用到的水平垂直居中的方法&#xff0c;希望能够…

CSS水平垂直居中常见方法总结(转)

文章目录 一、简介二、元素水平居中三、元素水平垂直居中3.1 position 元素已知宽度3.2 position transform 元素未知宽度3.3 flex布局3.4 table-cell布局 一、简介 说明&#xff1a;本篇文章只是总结一些方法&#xff0c;例子用到的各个元素属性不做解释&#xff0c;详情请看…