openGauss学习笔记-56 openGauss 高级特性-DCF
文章目录
- openGauss学习笔记-56 openGauss 高级特性-DCF
- 56.1 架构介绍
- 56.2 功能介绍
- 56.3 使用示例
openGauss学习笔记-56 openGauss 高级特性-DCF
DCF全称是Distributed Consensus Framework,即分布式一致性共识框架。DCF实现了Paxos、Raft等解决分布式一致性问题典型算法。使用DCF可以提供日志复制、集群高可用等能力。DCF提供了自选主能力,支持少数派强起能力,日志复制支持动态流量调整。同时也提供了基于Paxos多种角色节点类型,并能进行调整。
DCF是一款高性能、高度成熟可靠、易扩展、易使用的独立基础库,其他系统通过接口与DCF简单对接,就能够轻松拥有Paxos算法赋予的强一致、高可用、自动容灾等能力。
56.1 架构介绍
DCF功能架构如图1所示,主要包括:功能模块、存储模块、通信模块、服务层等。
图 1 DCF功能架构图

-
算法模块:
算法模块是基于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 流控算法流程

核心算法流程如下:
- DCF主节点周期性采样和计算共识信息:这里的共识信息主要是端到端达成共识的时延、端到端达成共识的日志带宽、系统整体日志回放带宽。
- 计算控制量:主节点根据本次采样结果和历史结果,得出性能变化趋势,根据历史控制量的值和变化趋势调整本次控制方向和控制步长,朝更优性能方向计算得出新的控制量。
- 控制周期到达后,更新控制量。
- 控制量持续作用到业务流量,控制业务流量注入的频率。
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="[{"stream_id":1,"node_id":1,"ip":"192.168.0.11","port":17783,"role":"LEADER"},{"stream_id":1,"node_id":2,"ip":"192.168.0.12","port":17783,"role":"FOLLOWER"},{"stream_id":1,"node_id":3,"ip":"192.168.0.13","port":17783,"role":"FOLLOWER"}]"/> </CLUSTER>
...
-
安装完成后查询集群状态。
使用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:集群其他节点信息。
-
集群规模在线调整。
若在线增加副本,执行以下一条命令即可。
# 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分钟就可以完成删除单个副本的任务。
-
集群支持少数派强起功能。
在多数派故障场景下,按正常的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> -
主动switchover操作。
支持一主多备部署模式下切换数据库主备实例,实现AZ间的相互切换。switchover为维护操作,需确保数据库实例状态正常,所有业务结束并无主备追赶后,再进行switchover操作。
例如节点备升主操作命令:
# cm_ctl switchover –n <node_id> -D <data_dir> -
备机重建功能。
支持主备模式下全量build能力。实现过程是当主DN收到全量build的请求后,阻塞主DN回收DCF日志,备DN从主DN复制xlog日志和数据文件,在备DN拉起后设置DCF开始复制日志点。
命令示例如下:
gs_ctl build -b full -D <new_node_data_dir>
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!

相关文章:
openGauss学习笔记-56 openGauss 高级特性-DCF
文章目录 openGauss学习笔记-56 openGauss 高级特性-DCF56.1 架构介绍56.2 功能介绍56.3 使用示例 openGauss学习笔记-56 openGauss 高级特性-DCF DCF全称是Distributed Consensus Framework,即分布式一致性共识框架。DCF实现了Paxos、Raft等解决分布式一致性问题典…...
Xcode 14 pod init报错
文章目录 1.报错2.解决方法(本人亲测有效) 1.报错 [!] Oh no, an error occurred. Search for existing GitHub issues similar to yours: https://github.com/CocoaPods/CocoaPods/search?q%5BXcodeproj%5DUnknownobjectversion%2856%29.&typeIs…...
飞腾PSPA可信启动--2 数字签名证书
今天继续第二章,数字签名证书的介绍。 此章节录制了讲解视频,可以在B站进行观看:...
微前端:重塑大型项目的前沿技术
引言 随着互联网技术的飞速发展,前端开发已经从简单的页面制作逐渐转变为复杂的应用开发。在这个过程中,传统的前端开发模式已经难以满足大型项目的需求。微前端作为一种新的前端架构模式,应运而生,它旨在解决大型项目中的前端开…...
官方推荐使用的OkHttp4网络请求库全面解析(Android篇)
作者:cofbro 前言 现在谈起网络请求,大家肯定下意识想到的就是 okhttp 或者 retrofit 这样的三方请求库。诚然,现在有越来越多的三方库帮助着我们快速开发,但是对于现在的程序员来说,我们不仅要学会如何去用ÿ…...
Spooling的原理
脱机技术 程序猿先用纸带机把自己的程序数据输入到磁带中,这个输入的过程是由一台专门的外围控制机实现的。之后CPU直接从快速的磁带中读取想要的这些输入数据。输出也类似。 假脱机技术(Spooling技术) 即用软件的方式来模拟脱机技术。要…...
Homebrew 无法安装过时的PHP版本
使用brew安装过时的PHP版本时,提示“Error: php7.4 has been disabled because it is a versioned formula!”错误。 因为过时的PHP版本官方已经不再维护,所以Hombrew将该PHP版本移出了repository,所以安装不了。 解决方案 # 1. 添加tap fo…...
python爬取bilibili,下载视频
一. 内容简介 python爬取bilibili,下载视频 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接:https://pan.baidu.com/s/1WuXTso_iltLlnrLffi1kYQ?pwd1234 三.主要流程 3.1 下载单个视频 代码 import requests impor…...
java八股文面试[多线程]——进程与线程的区别
定义 1、进程:进程是一个具有独立功能的程序关于某个数据集合的以此运行活动。 是系统进行资源分配和调度的独立单位,也是基本的执行单元。是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动。 进程结构…...
SpringBootWeb 登录认证[Cookie + Session + Token + Filter + Interceptor]
目录 1. 登录功能 1.1 需求 1.2 接口文档 1.3 登录 - 思路分析 1.4 功能开发 1.5 测试 2. 登录校验 2.1 问题分析 什么是登录校验? 我们要完成以上登录校验的操作,会涉及到Web开发中的两个技术: 2.2 会话技术 2.2.1 会话技术介绍…...
d3dcompiler_43.dll丢失怎么修复,分享几种修复d3dcompiler_43.dll的方法
不少人可能看到d3dcompiler_43.dll这个文件会感觉到陌生,是的,因为这个文件一般来说是很少丢失的,但是还是会出现d3dcompiler_43.dll丢失的情况的,今天主要是来给大家详细的说说d3dcompiler_43.dll丢失怎么修复的相关方法。 一.分…...
mqtt集群搭建并使用nginx做负载均衡_亲测得结论
mqtt集群搭建 RabbitMQ集群搭建和测试总结_亲测 搭建好RabbitMQ集群,并开启mqtt插件功能,mqtt集群也就搭建好了 nginx配置mqtt负载均衡 #修改rabbitmq1节点ip为1.19的nginx配置 vim /etc/nginx/nginx.confhttp { } #在http外添加如下配置 stream {upstream rabbitmqtt {ser…...
JavaScript—DOM(文档对象模型)
目录 DOM是什么? DOM有什么作用? 一、事件 理解事件 事件怎么写(要做什么就写什么)? 实战演练 1、页面加载完毕以后,打印一句话 2、如果有一个a标签,并给其添加一个点击事件 3、事件默…...
mysql Index
创建索引 方法1 create table 表( col1 int, col2 int, … index | key index_name (列名) 方法2 alter table 表名 ADD index alter table student_table add index index_name(stu_id); 方法3 create index index_name on 表名(列) 删除索引 方式1 alter table xx drop prima…...
八路参考文献:[八一新书]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022.
八路参考文献:[八一新书]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑出版传媒,2022....
Leetcode Top 100 Liked Questions(序号75~104)
75. Sort Colors 题意:红白蓝的颜色排序,使得相同的颜色放在一起,不要用排序 我的思路 哈希 代码 Runtime 4 ms Beats 28.23% Memory 8.3 MB Beats 9.95% class Solution { public:void sortColors(vector<int>& nums) {vector…...
Shell编程之流程控制
目录 if判断 case语句 for循环 while循环 if判断 语法: if [ 条件判断表达式 ] then 程序 elif [ 条件判断表达式 ] then 程序 else 程序 fi 注意: [ 条件判断表达式 ],中括号和条件判断表达式之间必须有空格。if,elif…...
什么是Python爬虫分布式架构,可能遇到哪些问题,如何解决
目录 什么是Python爬虫分布式架构 1. 调度中心(Scheduler): 2. 爬虫节点(Crawler Node): 3. 数据存储(Data Storage): 4. 反爬虫处理(Anti-Scraping&…...
QT下使用ffmpeg+SDL实现音视频播放器,支持录像截图功能,提供源码分享与下载
前言: SDL是音视频播放和渲染的一个开源库,主要利用它进行视频渲染和音频播放。 SDL库下载路径:https://github.com/libsdl-org/SDL/releases/tag/release-2.26.3,我使用的是2.26.3版本,大家可以自行选择该版本或其他版…...
Microsoft Excel整合Python:数据分析的新纪元
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
