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…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
