---
title: 深度干货！openGauss日志共识框架大揭秘-官方技术文章-鲲鹏社区
description: 本文主要介什么是DCF，DCF能做什么以及如何使用DCF。
keywords: Gauss,深度干货,日志共识框架,大揭秘,官方技术文章,鲲鹏社区,DCF,什么是
url: https://www.hikunpeng.com/developer/techArticles/20230913-2?envFlag=1
section: (其他)
---

# 深度干货！openGauss日志共识框架大揭秘-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20230913-2?envFlag=1
描述: 本文主要介什么是DCF，DCF能做什么以及如何使用DCF。
关键词: Gauss,深度干货,日志共识框架,大揭秘,官方技术文章,鲲鹏社区,DCF,什么是

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

深度干货！openGauss日志共识框架大揭秘

深度干货！openGauss日志共识框架大揭秘

实战经验

发表于 2021/09/29

0

分布式一致性算法是一个分布式系统的基础性问题，所要解决的是一个分布式系统如何就某个值（决议）达成强一致，进而解决系统的高可用问题。Paxos是最重要的分布式一致性算法，很多人都把它作为“分布式一致性协议”的代名词。

虽然Paxos理论已经提出了很多年，使用Paxos及其各变种协议的产品也层出不穷，但是真正工业级的、第三方独立库还是很少见，开源的项目更是少之又少，参考Paxos协议的常见开源产品有Zookeeper、etcd，但是其协议并不能支持一个高吞吐的状态机复制，且没有提供独立的第三方库，可供其他系统快速接入使用。

为此，我们设计并实现了DCF特性，用于支持openGauss涉及到的分布式强一致场景。

## 什么是DCF？

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

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

DCF功能架构图如上图所示主要包括：算法模块、存储模块、通信模块、服务层等。

算法模块：

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

存储模块：

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

通信模块：

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

服务层：

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

## DCF能做什么？

### 1. 支持在线添加、删除节点，在线转让Leader能力

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

### 2. 支持优先级选主和策略化多数派

策略化多数派：经典Paxos 理论中，多数派达成一致后数据就可以提交，而多数派是非特定的，并不能保证某个或某些节点一定能得到完整的数据，在实际应用中，往往是地理位置较近的节点会拥有强一致的数据，而地理位置较远的节点，一直处于非强一致的状态，在发生城市级容灾的时候无法激活为主节点，形同虚设。策略化多数派能力，可以让用户通过动态配置，指定某个或某些节点必须保有强一致的数据，在出现容灾需求的时，可以立即激活为主节点。

优先级选主：用户可以指定各个节点的优先级，DCF严格按照指定的优先级选主，只有在优先级高的节点全部不可用时，才会激活优先级低的节点。

### 3. 支持节点角色多样性

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

### 4. Batch & Pipeline

Batch：DCF支持多级batch操作，主要包括：1）将多个日志合并成单个消息进行；2）将多个日志合并写磁盘；3）将多个日志合并复制。Batch可以有效的降低消息粒度带来的额外损耗，提升吞吐。

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

### 5. 高效流控算法

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

流控算法主要流程：

核心算法流程如下：

（1）DCF主节点周期性采样和计算共识信息：这里的共识信息主要是端到端达成共识的时延、端到端达成共识的日志带宽、系统整体日志回放带宽。

（2）计算控制量：主节点根据本次采样结果和历史结果，得出性能变化趋势，根据历史控制量的值和变化趋势调整本次控制方向和控制步长，朝更优性能方向计算得出新的控制量。

（3）控制周期到达后，更新控制量。

（4）控制量持续作用到业务流量，控制业务流量注入的频率

DCF将持续在数据通讯、多日志流、并行大容量复制等场景中演进，以此为用户提供高效、可靠、易管理的日志多副本复制、备份能力，满足用户对数据库容灾、高可用方面的需求。

## DCF使用

假设集群三个节点，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，默认是的。示例如下：

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

加粗字体内容为示例，可自行替换。每行信息均有注释进行说明。

```
<?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>
```

### 1. 安装完成后查询集群状态

使用gs_ctl查询集群状态

```
# gs_ctl query –D <data_dir>
# gs_ctl query -D /nvme0/gaussdb/cluster/nvme0/dn1
```

其中，dcf_replication_info表示当前节点dcf信息。

role：表示当前节点角色，角色一共有如下几种，LEADER、FOLLOWER、LOGGER、PASSIVE、PRE_CANDICATE、CANDIDATE、UNKNOW。从上图可以看出当前节点是LEADER节点。

term：选举任期。

run_mode：DCF运行模式，当前0表示自动选举模式，2表示自动选举模式。

work_mode:DCF工作模式。

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 --opration=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副本达成一致即可提交。

### 4. 主动switchover操作

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

例如节点备升主操作命令

```
# cm_ctl switchover –n <node_id> -D <data_dir>
```

### 5. 备机重建功能

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

命令示例如下：

```
# gs_ctl build –b full –Z datanode –D <new_node_data_dir>
```

此次开源的DCF 特性是openGauss在分布式领域的又一次探索，也是对开源技术的又一次实质性贡献。

openGauss一直致力于推动数据库技术的深度创新，并加大对数据库基础研究、数据库理论创新的投入，充分开放顶尖的技术能力，与海内外开发者一道推动数据库的产、学、研创新与发展。

相关推荐：

DB4AI：使能数据库原生AI计算，助力数据湖场景业务成功 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles/20230913-1?envFlag=1)

解密openGauss DB4AI框架的内部机理 [了解详情](http://mp.weixin.qq.com/s?__biz=MzIyMDE3ODk1Nw==&mid=2247496108&idx=1&sn=2e2bf19585bbe0366d58ea6fb18e1fa9&chksm=97cd4ecea0bac7d88ef086e8e2d995432226177e0fd28a71374c163bd3dfad30a28de0f06369&scene=21#wechat_redirect)

欢迎访问openGauss官方网站

openGauss开源社区官方网站：

https://opengauss.org/ [了解详情](https://opengauss.org)

openGauss组织仓库：

https://gitcode.com/opengauss [了解详情](https://gitcode.com/opengauss)

openGauss镜像仓库：

https://github.com/opengauss-mirror [了解详情](https://github.com/opengauss-mirror)

本页内容
