openGauss学习笔记-56 openGauss 高级特性-DCF

2023-11-15

openGauss学习笔记-56 openGauss 高级特性-DCF

DCF全称是Distributed Consensus Framework,即分布式一致性共识框架。DCF实现了Paxos、Raft等解决分布式一致性问题典型算法。使用DCF可以提供日志复制、集群高可用等能力。DCF提供了自选主能力,支持少数派强起能力,日志复制支持动态流量调整。同时也提供了基于Paxos多种角色节点类型,并能进行调整。

DCF是一款高性能、高度成熟可靠、易扩展、易使用的独立基础库,其他系统通过接口与DCF简单对接,就能够轻松拥有Paxos算法赋予的强一致、高可用、自动容灾等能力。

56.1 架构介绍

DCF功能架构如图1所示,主要包括:功能模块、存储模块、通信模块、服务层等。

图 1 DCF功能架构图
image-20230524184717327

  • 算法模块:

    算法模块是基于multi-paxos协议实现,同时结合自身业务场景、及高性能和生态的需求,DCF做了很多功能扩展和性能优化,使其相对于基础的multi-paxos,功能变的更加丰富,在多种部署场景下性能都有明显的提升。其主要包括:Leader选举模块,日志复制模块,元数据模块,以及集群管理模块等。

  • 存储模块:

    出于特定业务场景和极致高性能考虑,DCF将日志存储单独抽取出一套公共接口,并实现了一个默认的高性能存储模块。有特定场景或极致高性能及成本需求的用户,可以结合已有的存储系统,对接DCF的日志存储接口来实现其特定需求,这也是DCF作为第三方独立库的优势之一。

  • 通信模块:

    通信模块主要是基于MEC实现(Message Exchange Component),提供整个DCF组件实例间通信能力,以及异步事件处理框架。主要功能有:可扩展的多种通信协议,单播、广播、环回的发送接口,消息异步处理的框架,支持多channel机制和多优先级队列,支持压缩和批量发送等。

  • 服务层:

    服务层是驱动整个DCF运行的基础,提供程序运行所需要的各种基础服务。例如:锁、任务异步调度、线程池服务、定时器能力等。

56.2 功能介绍

  • 支持在线添加、删除节点,在线转让Leader能力

    DCF在标准的multi-paxos基础上,支持在线添加、删除节点,支持在线将leader能力转让给其他节点。这更适合广泛业务场景,构建开发的生态。

  • 支持优先级选主和策略化多数派

    • **策略化多数派:**经典Paxos 理论中,多数派达成一致后数据就可以提交,而多数派是非特定的,并不能保证某个或某些节点一定能得到完整的数据。在实际应用中,往往是地理位置较近的节点会拥有强一致的数据,而地理位置较远的节点,一直处于非强一致的状态,在发生城市级容灾的时候无法激活为主节点,形同虚设。策略化多数派能力,可以让用户通过动态配置,指定某个或某些节点必须保有强一致的数据,在出现容灾需求的时,可以立即激活为主节点。
    • **优先级选主:**用户可以指定各个节点的优先级。DCF严格按照指定的优先级选主,只有在优先级高的节点全部不可用时,才会激活优先级低的节点。
  • 支持节点角色多样性

    DCF除了可以提供经典的Leader、Follow、Candidate角色外,还可以提供定制化的角色。例如Passive角色(有日志,有数据,没有被选举权,不参与多数派投票),log角色(有日志,没有数据,没有被选举权,参与多数派投票)。有了这些节点角色的支持,DCF可以支持节点同步、同异步混合部署等多集群部署方式。

  • Batch & Pipeline

    • **Batch:**DCF支持多级batch操作,主要包括:

      • 将多个日志合并成单个消息进行发送。
      • 将多个日志合并写磁盘。
      • 将多个日志合并复制。

      Batch可以有效的降低消息粒度带来的额外损耗,提升吞吐。

    • **Pipeline:**是指在上一个消息返回结果以前,并发的发送下一个消息到对应节点的机制,通过提高并发发送消息数量(Pipeline数量),可以有效的降低并发单请求延迟,提升性能;DCF在日志持久化、网络发送、日志复制等多个阶段采用纯异步方式,将Pipeline性能发挥至极致。

  • 高效流控算法

    Batching、Pipelining虽然能够提升系统整体吞吐量和性能,但是过大Batch也容易造成单请求时延过大,导致并发请求数过高,继而影响吞吐和请求时延,为此DCF设计实现了一套高效自适应的流控算法,自动探测网络带宽、网络发送时延、请求并发量等参数,并适时调整Batch和Pipeline参数,控制业务流量的注入。

    流控算法主要流程如图2所示:

    图 2 流控算法流程
    image-20230524184758832

    核心算法流程如下:

    1. DCF主节点周期性采样和计算共识信息:这里的共识信息主要是端到端达成共识的时延、端到端达成共识的日志带宽、系统整体日志回放带宽。
    2. 计算控制量:主节点根据本次采样结果和历史结果,得出性能变化趋势,根据历史控制量的值和变化趋势调整本次控制方向和控制步长,朝更优性能方向计算得出新的控制量。
    3. 控制周期到达后,更新控制量。
    4. 控制量持续作用到业务流量,控制业务流量注入的频率。

56.3 使用示例

假设集群三个节点,ip分别为,192.168.0.11,192.168.0.12,192.168.0.13。node id分别为1,2,3;节点角色分别为LEADER,FOLLOWER,FOLLOWER。

使用DCF组件能力需要在使用OM安装部署阶段,在配置文件中,开启开关enable_dcf的值为on(默认是关闭的),并配置DCF config配置信息。

在script/gspylib/etc/conf/centralized/cluster_config_template_HA.xml获取XML文件模板。

每行信息均有注释进行说明。加粗字体内容为DCF相关内容。示例如下:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
  <!-- 整体信息 -->
  <CLUSTER>
  <!-- 数据库名称 -->
    <PARAM name="clusterName" value="Sample1" />
  <!-- 数据库节点名称(hostname) -->
    <PARAM name="nodeNames" value="node1,node2,node3" />
  <!-- 节点IP,与nodeNames一一对应 -->
    <PARAM name="backIp1s" value="192.168.0.11,192.168.0.12,192.168.0.13"/>
  <!-- 数据库安装目录-->
    <PARAM name="gaussdbAppPath" value="/opt/huawei/newsql/app" />
  <!-- 日志目录-->
    <PARAM name="gaussdbLogPath" value="/opt/huawei/logs/gaussdb" />
  <!-- 临时文件目录-->
    <PARAM name="tmpMppdbPath" value="/opt/huawei/logs/temp" />
  <!--数据库工具目录-->
    <PARAM name="gaussdbToolPath" value="/opt/huawei/tools" />
  <!-- 集群数据库类型,此处示例为非分布式,即集中式类型-->
    <PARAM name="clusterType" value="single-inst"/>
  <!-- 是否开启DCF模式, 开启:on,关闭:off -->
    <PARAM name="enable_dcf" value="on/off"/>
  <!-- DCF config配置信息 -->
    <PARAM name="dcf_config" value="[{&quot;stream_id&quot;:1,&quot;node_id&quot;:1,&quot;ip&quot;:&quot;192.168.0.11&quot;,&quot;port&quot;:17783,&quot;role&quot;:&quot;LEADER&quot;},{&quot;stream_id&quot;:1,&quot;node_id&quot;:2,&quot;ip&quot;:&quot;192.168.0.12&quot;,&quot;port&quot;:17783,&quot;role&quot;:&quot;FOLLOWER&quot;},{&quot;stream_id&quot;:1,&quot;node_id&quot;:3,&quot;ip&quot;:&quot;192.168.0.13&quot;,&quot;port&quot;:17783,&quot;role&quot;:&quot;FOLLOWER&quot;}]"/> 
  </CLUSTER>
...
  1. 安装完成后查询集群状态。

    使用gs_ctl查询集群状态。

    # gs_ctl query –D <data_dir>
    # gs_ctl query -D /nvme0/gaussdb/cluster/nvme0/dn1
    HA state:
           local role                     : Primary   
           static connections             : 2   
           db state                       : Normal 
           detail information             : Normal 
    Paxos replication info:
           paxos write location           : 964/87134528  
           paxos commit location          : 964/87134528  
           local write location           : 964/87134528  
           local flush location           : 964/87134528  
           local replay location          : 964/87134528  
           dcf replication info           : {"stream_id":1,"local_node_id":1,"role":"LEADER","term":3,"run_mode":0,"work_mode":0,"hb_interval":1000,"elc_timeout":3000,"applied_index":14300633605."commit_index":14300633605,"first_index":14300625186,"last_index":14300633605,"cluster_min_apply_idx'14300633605,"leader_id":1,"leader_ip":"172.16.137.38","leader_port":17783,"nodes":[{"node_id":1,"id":"172.16.137.38","port":17783,"role":"LEADER","next_index":14300633606,"match_index":14300633605,"apply_index":14300633605},{"node_id":2,"ip":"172.16.137.40","port":17783,"role":"FOLLOWER","next_index":14300633606,"match_index":14300633605,"apply_index":14300633605},{"node_id":3,"ip":"172.16.137.42","port":17783,"role":"FOLLOWER","next_index":14300633606,"match_index":14300633605,"apply_index":14300633605}}}
    

    其中:

    • dcf_replication_info:表示当前节点dcf信息。
    • role:表示当前节点角色,角色一共有如下几种,LEADER、FOLLOWER、LOGGER、PASSIVE、PRE_CANDICATE、CANDIDATE、UNKNOW。从上图可以看出当前节点是LEADER节点。
    • term:选举任期。
    • run_mode:DCF运行模式,当前0表示自动选举模式,2表示关闭自动选举模式。
    • work_mode:DCF工作模式。0表示多数派模式;1表示少数派模式。
    • hb_interval:DCF节点间心跳间隔时间,单位ms。
    • elc_timeout:DCF选举超时时间,单位ms。
    • applied_index:被应用到状态机的日志位置。
    • commit_index:已被大多数DCF节点保存的日志位置,此commit_index之前日志均已持久化。
    • first_index:DCF节点保存的首条日志位置,此位置会随着DN调用dcf_truncate而向后推进,之前的日志会被清理。
    • last_index:DCF节点保存的最后一条日志位置,此日志位置包含DCF节点存储在内存里但是没有持久化的日志,故而last_index >= commit_index。
    • cluster_min_apply_idx:集群最小已应用的日志位置。
    • leader_id:leader节点ID。
    • leader_ip:leader节点IP。
    • leader_port:leader节点端口,DCF内部使用 。
    • nodes:集群其他节点信息。
  2. 集群规模在线调整。

    若在线增加副本,执行以下一条命令即可。

    # gs_ctl member --operation=add --nodeid=<node_id> --ip=<ip> --port=<port> -D <data_dir>
    

    若需在线降副本,执行下面命令:

    # gs_ctl member --operation=remove --nodeid=<node_id> -D <data_dir>
    

    在集群状态正常的情况下,5分钟就可以完成删除单个副本的任务。

  3. 集群支持少数派强起功能。

    在多数派故障场景下,按正常的Paxos协议无法达成一致,系统无法继续提供服务。为了提供紧急服务能力,需在少数派情况下紧急启动提供服务。

    使用命令如下:

    # cm_ctl setrunmode -n <node_id> -D <data_dir> --xmode=minority --votenum=<num>
    

    在集群3副本的情况下,2副本故障,只需1副本达成一致即可提交。

    加回命令为:

    # cm_ctl setrunmode -n <node_id> -D <data_dir> --xmode=normal --votenum=<num>
    
  4. 主动switchover操作。

    支持一主多备部署模式下切换数据库主备实例,实现AZ间的相互切换。switchover为维护操作,需确保数据库实例状态正常,所有业务结束并无主备追赶后,再进行switchover操作。

    例如节点备升主操作命令:

    # cm_ctl switchover –n <node_id> -D <data_dir>
    
  5. 备机重建功能。

    支持主备模式下全量build能力。实现过程是当主DN收到全量build的请求后,阻塞主DN回收DCF日志,备DN从主DN复制xlog日志和数据文件,在备DN拉起后设置DCF开始复制日志点。

    命令示例如下:

    gs_ctl build -b full -D <new_node_data_dir>
    

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openGauss学习笔记-56 openGauss 高级特性-DCF 的相关文章

  • java ResultSet,使用MAX sql函数

    你好 这就是我想要的 我连接到数据库并检索 UniqueId 列的最大元素 并将其分配给名为 maxID 的整数变量 这是我的方法 int maxID 0 Statement s2 con createStatement s2 execut
  • date_sub 对于 mysql 可以,对于 postgresql 可以

    此查询适用于 mySQL 不适用于 Postgresql select from where id and h gt date sub now INTERVAL 30 MINUTE 错误是 Query failed ERREUR erreu
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • PL/pgSQL SELECT 到数组中

    这是我的函数声明和主体的一部分 CREATE OR REPLACE FUNCTION access update RETURNS void AS DECLARE team ids bigint BEGIN SELECT INTO team
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • T-SQL:用最新的非空值替换 NULL 的最佳方法?

    假设我有这张表 id value 1 5 2 4 3 1 4 NULL 5 NULL 6 14 7 NULL 8 0 9 3 10 NULL 我想编写一个查询来替换任何NULL值与表中最后一个不为空的值在那一栏里 我想要这个结果 id va
  • SQL 2008全文索引填充延迟

    我的经理说 在基础表数据更改后 可能需要一段时间才能更新全文搜索索引 例如 如果我有一张桌子Products有一个柱子Description我更新了该描述 然后我可能需要一些时间才能搜索该新描述 真的吗 这需要多长时间 SQL 2008 对
  • sql查询获取从一月到当月的所有数据,即使没有记录

    我不擅长 sql 所以任何帮助世界都很棒 我有一个 SQL 查询 可以获取从一月到当月注册的记录 我的代码示例 SELECT DatePart YEAR p createStamp as TheYear DatePart MONTH p c
  • st_intersects 与 st_overlaps

    这两个查询有什么区别 select a gid sum length b the geom from polygons as a roads as b where st intersects a the geom b the geom gr
  • 内置函数将每个单词的第一个字母大写

    如果 SQL Server 中已存在此类函数 我不想为此创建自定义函数 输入字符串 This is my string to convert预期输出 This Is My String To Convert SET ANSI NULLS O
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • 如何在 DB2 中创建返回序列值的函数?

    如何在 DB2 中创建一个从序列中获取值并返回该值的函数 应该可以在 select 或 insert 语句中使用该函数 例如 select my func from xxx insert into xxx values my func 基本
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • SQL 更新 - 更新选定的行

    我正在使用 SQL Server 2008 我有一个名为MYTABLE有两列 ID STATUS 我想编写一个存储过程来返回其记录STATUS是 0 但是这个存储过程必须更新STATUS返回行数为 1 如何在单个查询中执行此选择和更新操作
  • 基于多个表的数据更新单个表 SQL Server 2005,2008

    我需要更新表one使用表中的数据two 表一和表二没有任何公共列相关 桌子three与表相关two 例如 表一 reg det 表 reg det id reg id results 101 11 344 表二 临时表 venue resu
  • 如何获取日期时间字段的 UTC?

    我正在使用 MySQL 5 并且正在尝试将日期时间字段转换为 UTC TIMESTAMP 这是我所拥有的 但它不起作用 并且不确定我是否可以做到这一点 但有人可以告诉我我做错了什么吗 谢谢 我已经尝试过这个 SELECT UTC TIMES

随机推荐

  • leetcode 27-移除元素 python

    给定一个数组 nums 和一个值 val 你需要原地移除所有数值等于 val 的元素 返回移除后数组的新长度 不要使用额外的数组空间 你必须在原地修改输入数组并在使用 O 1 额外空间的条件下完成 元素的顺序可以改变 你不需要考虑数组中超出
  • require用法

    现在前端的页面都采用模块化来加载js 避免了js加载的延迟顺序依赖等问题 原理的东西这里不多做解释 我们这节只是介绍一下require的用法 1 首先我们要下载require js文件 2 html引入 这里src是require js的路
  • Netty实时接收数据放入缓存处理简单示例

    因为硬件设备使用的udp协议 传输数据 客户端只顾着发数据 所以大部分操作都在我服务端进行操作 做到数据实时 定义为每秒客户端发送来一次数据 展示 暂定方案为netty redis map netty这块我就不多赘述了 不懂得可以先看net
  • 创建Spring Boot框架项目- maven工程--多种方式

    文章目录 创建Maven工程的方式有很多种 以下简单介绍三种 使用Maven Spring Initializr 2 1选择默认方式 1 gt 默认方式 2 gt 但是有可能加载不出来因为用的国外的网址 3 gt 有时候也会加载出来 4 g
  • TypeError: "x" is not a constructor 无厘头使用 vuex 的坑

    2019 11 25 写 vuex store js 的时候 因为 export default new Vuex store store 给了个小写 所以爆出了一个 vuex a store is not a constructor 的错
  • Python提取ABAQUS结果数据

    背景介绍 调研发现 传统结构设计过程中需要依赖工程师的理论知识和工程经验 针对具体问题提出初步设计方案 后续通过多次的迭代优化 直到满足要求为止 这种传统设计方法不仅工作量大 效率低 企业还需要投入巨量的成本 因此 我们可以通过优化算法 有
  • LLVM系列第十章:控制流语句if-else-phi

    系列文章目录 LLVM系列第一章 编译LLVM源码 LLVM系列第二章 模块Module LLVM系列第三章 函数Function LLVM系列第四章 逻辑代码块Block LLVM系列第五章 全局变量Global Variable LLV
  • jsp&servlet&jdbc&mysql实现简单的增删查改(一)

    1 关于JDBC JDBC Java DataBase Connectivity 是一种用于执行SQL语句的Java API 是Java和数据库之间的一个桥梁 它由一组用Java语言编写的类和接口组成 各种不同类型的数据库都有相应的实现类
  • MathCAD14破解版

    MathCAD14 是美国的PTC公司研发推广的一款老牌的工程计算软件 也可以说是一种交互式数值计算系统 只要输入一个数学公式或者方程组或者矩阵都可以通过该软件直接得出结果 它拥有五个扩展库 求解与优化 数据分析 信号处理 图像处理 和小波
  • 如何写好一份软件开发设计文档

    设计文档 也被称作技术规范和实现手册 描述了你如何去解决一个问题 是确保正确完成工作最有用的工具 其目的是迫使你对设计展开缜密的思考 并收集他人的反馈 进而完善你的想法 同时在软件交付和交接的过程中 能让其他人更通俗易懂的了解之前的设计目的
  • 【Python小技巧】.py .pyd .pyw 都是干什么用文件?想分发时加密py脚本文件?

    文章目录 前言 一 什么是 py 文件 二 什么是 pyd 文件 pyd 文件是用 Python 编程语言编写的 是通过编译 Python 代码生成的 py 和 pyd 文件格式之间的区别 如何创建 pyd 文件 如何使用 pyd文件 三
  • Android USB电源管理

    The USB peripheral detects the lack of 3 consecutive SOF packets as a suspend request from the USB host 1 驱动shutdown顺序 系
  • 黑盒测试方法:边界值分析具体步骤及实例

    边界值分析法也是黑盒测试方法之一 强调测试边界条件 而非等量类划分 其过程是确定输入值的最大值和最小值 然后将测试点置于这些极端值以及它们之间 使用边界值分析法可以揭示程序在处于边界条件时的bug 并能够更有效地完成测试工作 以下是该方法的
  • TypeError: defineConfig is not a function

    场景 当我们在做打包配置的时候 出现如下错误 原因 由于用vue cli直接创建了vue 3的项目 而里面的生态并非都是最新版 vue config js中的代码如下 使用了vue 3的语法 解决 输入 vue upgrade 一路向下 即
  • vue+typescript封装axios,实现取消重复请求

    vue cli3可以直接生成vue typescript项目 然后对axios进行封装 实现拦截多次重复请求 并取消 直接撸代码 也是借鉴网上的 做了修改 在根目录下新建axios tool ts文件 import Vue from vue
  • Matlab_输出成绩等级A、B、C、D、E

    输入一个百分制成绩 要求输出成绩等级A B C D E 其中90 100为A 80 89为B 70 79为C 60 69为D 60以下为E 以下会分别使用if语句和switch语句实现 1 if语句实现如下 c input 请输入成绩 if
  • Timestamp : Unable to compare with value [Binary]kettle插入到Oracle报错

    kettle插入更新到Oracle报错 Timestamp Unable to compare with value Binary Binary can t be converted to a timestamp 如图 原因 一般是前一步如
  • 设计模式(现在只总结了常用的8种)

    一 设计模式的七大原则 1 设计模式的目的 编写软件过程中 程序员面临着来自耦合性 内聚性以及可维护性 可扩展性 重用性 灵活性 等多方面的 挑战 设计模式是为了让程序 软件 具有更好 代码复用性 相同功能的代码只需要写一次 可读性 代码简
  • 指针到底能不能修改其指向的常量字符串?

    http m blog csdn net article details id 11248789 1 指针到底能不能修改其指向的常量字符串 今天做一个字符串右移函数时 直接使用指针来修改字符串常量的值出现了奇怪运行时错误 代码如下 incl
  • openGauss学习笔记-56 openGauss 高级特性-DCF

    文章目录 openGauss学习笔记 56 openGauss 高级特性 DCF 56 1 架构介绍 56 2 功能介绍 56 3 使用示例 openGauss学习笔记 56 openGauss 高级特性 DCF DCF全称是Distrib