Apache Seata Raft模式配置中心

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。

Apache Seata Raft模式配置中心


title: Seata Raft模式配置中心
author: 蒋奕晨-清华大学,Seata 开源之夏学生参与者
description: 在本文中,我将分享基于Raft和RocksDB设计的Seata配置中心和使用方式。
date: 2024/09/19
keywords: [seata,分布式事务,配置中心,Raft,RocksDB]

1. 项目背景

目前seata支持丰富的第三方配置中心,但是考虑使用的便捷性同时为了降低使用seata的门槛,在seata-server利用现有的sofa-jraft+rocksdb构建一个配置中心功能,seata-client直接与seata-server通信,获取seata相关的配置,不需要再去第三方配置中心读取,实现配置中心自闭环。

2. 设计说明

2.1 配置中心

在现有的第三方配置中心实现中,Client端和Server端对于配置中心是解耦的,Client端和Server端直接通过Configuration实例获取配置项,且Configuration对于Client端和Server端的初始化行为是一致的,都是先连接到配置中心中间件然后获取配置,以及添加监听器等。
在这里插入图片描述

当使用Raft的实现配置中心后,由于所有的配置项信息是保存在Server端的,因此初始化Configuration实例时对于Client端和Server端的行为是不一致的。

此外为保证和原来配置中心的逻辑相同,Client端和Server端获取配置项依旧统一从RaftConfiguration实例中获取,不直接和RocksDB进行交互。

在这里插入图片描述

在这里插入图片描述

RaftConfiguration分为Server端和Client端,按照启动环境返回不同配置实例。

public class RaftConfigurationProvider implements ConfigurationProvider {@Overridepublic Configuration provide() {String applicationType = System.getProperty(APPLICATION_TYPE_KEY);if (APPLICATION_TYPE_SERVER.equals(applicationType)){return RaftConfigurationServer.getInstance();}else{return RaftConfigurationClient.getInstance();}}
}@SpringBootApplication(scanBasePackages = {"org.apache.seata"})
public class ServerApplication {public static void main(String[] args) throws IOException {System.setProperty(APPLICATION_TYPE_KEY, APPLICATION_TYPE_SERVER);// run the spring-boot applicationSpringApplication.run(ServerApplication.class, args);}
}

2.2 配置存储模块

在这里插入图片描述

抽象设计

为了未来支持和拓展更多的KV内存键值对数据库(如LevelDB,Caffeine),现抽象一个ConfigStoreManager接口以及抽象类AbstractConfigStoreManager,提供如下公共方法:

  • Get:获取指定namespace,dataId中名为key的单一配置项
  • GetAll:获取指定namespace,dataId中全部配置项
  • Put:新增/修改指定namespace,dataId中某一配置项<key,value>
  • Delete:删除指定namespace,dataId中名为key的配置项
  • DeleteAll:删除指定namespace,dataId中全部配置项
  • Clear:清空所有配置
  • GetAllNamespaces:获取所有命名空间
  • GetAllDataIds:获取指定namespace下的所有配置dataIds

ConfigStoreManagerFactory、ConfigStoreManagerProvider.java:使用SPI机制实现的配置存储工厂类和提供者。

配置监听

Server端和Client端配置中心需要监听配置项的变化。

在Server端,由于配置本身存储在Server端,我们直接拦截配置变更的方法即可。我们在抽象接口中定义了addConfigListenerremoveConfigListener方法用户添加和删除配置监听器。监听的逻辑由具体的实现类负责。

RocksDBConfigStoreManager中,定义了notifyConfigChange方法来触发监听,当调用写相关操作时(如Put、Delete)触发该方法来通知配置的变更。从而触发回调事件通知Server端配置中心。

在Client端,我们定义了配置版本号长连接机制来实现配置的监听。具体的Client端在启动时,与Server建立长连接并定期刷新该连接。Server端内部维护一个watchMap存放所有客户端的监听信息。每当Raft状态机执行配置更新的操作会发送一个ApplicationEvent事件,该事件被ClusterConfigWatcherManager监听,从而通知watchMap中所有客户端配置变更。此外使用了配置版本号来优化实现,在建立长连接时,客户端需要传入版本号,当版本号低于Server端对应配置的版本号时直接返回最新配置。反之,若Server端配置版本号低于本地,则Client端认为该Server的配置已经过期(可能宕机或集群发生脑裂)会重试请求集群中其他的节点。

多租户方案

在Seata-Server端存放配置时,需要实现多租户的配置隔离,要求不同租户间的配置是相互独立、物理/逻辑上是隔离的。

首先调研了业内使用RocksDB的开源项目的实现,总结如下。

  1. JRaft,单RocksDB实例,两个列族,一个用来存Raft条目,一个用来存元信息。
  2. TiKV,两个RocksDB实例,分别为raftDB,kvDB。kvDB中使用了多个列族存放元数据,用户数据,锁数据等。
  3. Pika,为每个数据结构(String,Hash,List,Set,Zset等)创建了一个RocksDB实例,每个RocksDB实例分别用多个列族存储数据,比如Data、Meta

考虑到无法提前知道租户数量(无法在启动时创建指定数量的RocksDB),因此使用单个RocksDB实例,多列族存储。不同租户使用namespace区分,在Rocksdb中通过列族(ColumnFamily)进行逻辑隔离,一个namespace对应一个列族。列族相当于关系型数据库中表的概念。在配置的增删改查时指定namespace操作具体的列族,实现多租户的隔离。此外名为config_version的列族是内置的,用于对现有的配置进行版本号跟踪。
在这里插入图片描述

3. 使用方式

3.0 准备配置文件

首先准备好配置文件,具体可以参考:配置文件示例。
并将配置文件置于Seata server项目资源目录下。

3.1 Server端配置

application.yml 中加入Raft配置中心配置,其余配置参考

config:# support: nacos, consul, apollo, zk, etcd3, rafttype: raftraft:db:type: rocksdb # db类型,目前只支持rocksdbdir: configStore  # db文件存储目录destroy-on-shutdown: false #应用关闭时是否清除db文件, 默认falsenamespace: 'default' # 命名空间dataId: 'seata.properties' # 配置文件idfile:name: 'file' # 初始配置文件名server:raft:group: default #此值代表该raft集群的group,client的事务分组对应的值要与之对应server-addr: 192.168.241.1:9091, 192.168.241.2:9091 ,192.168.241.3:9091 # 其他Raft节点的ip和端口,端口为该节点的netty端口+1000,默认netty端口为8091snapshot-interval: 600 # 600秒做一次数据的快照,以便raftlog的快速滚动,但是每次做快照如果内存中事务数据过多会导致每600秒产生一次业务rt的抖动,但是对于故障恢复比较友好,重启节点较快,可以调整为30分钟,1小时都行,具体按业务来,可以自行压测看看是否有抖动,在rt抖动和故障恢复中自行找个平衡点apply-batch: 32 # 最多批量32次动作做一次提交raftlogmax-append-bufferSize: 262144 #日志存储缓冲区最大大小,默认256Kmax-replicator-inflight-msgs: 256 #在启用 pipeline 请求情况下,最大 in-flight 请求数,默认256disruptor-buffer-size: 16384 #内部 disruptor buffer 大小,如果是写入吞吐量较高场景,需要适当调高该值,默认 16384election-timeout-ms: 1000 #超过多久没有leader的心跳开始重选举reporter-enabled: false # raft自身的监控是否开启reporter-initial-delay: 60 # 监控的区间间隔serialization: jackson # 序列化方式,不要改动compressor: none # raftlog的压缩方式,如gzip,zstd等sync: true # raft日志的刷盘方式,默认是同步刷盘

在Seata-Server下,需要一个初始配置文件作为Server端的配置文件(也就是上一步所述的配置文件),file.name配置项需要和该文件名保持一致。在Server初次启动时,会将该配置文件作为Raft配置中心的初始配置。目前支持的文件类型有:conf、yaml、properties、txt。

注意:Raft集群内节点的初始配置文件需要保持一致。

3.2 控制台配置管理界面

当Server端使用Raft模式的配置中心后,可通过在Seata Console中内置的配置管理页面,进行配置中心的管理。用户可以通过在该页面对存储于Seata-Server集群的配置进行增删改查,注意该操作是对于集群生效的,因此可以在集群中的任意节点进行修改,所有操作会通过Raft在集群内进行同步。

注意:该配置管理页面仅在配置中心为Raft模式下开启,对其他类型的配置中心不开放。

3.2.1 配置隔离

Raft配置中心提供了namespace命名空间的机制来实现多租户的配置隔离。不同namespace下的配置通过底层存储机制实现逻辑隔离。在同一namespace下可以有多套配置文件,不同的配置文件用dataId进行区分。一套配置以namespacedataId来唯一标识。

例如:

  • namespace=default(默认),dataId=seata.properties(默认)

  • namespace=dev,dataId=seata-server.properties,dataId=seata-client.yaml

  • namespace=prop,dataId=seata-server.properties,dataId=seata-client.txt

在这里插入图片描述

3.2.2 配置上传

在Sever启动时,Server端配置的初始文件会自动上传到配置中心。此外用户还可以通过点击"上传(Upload)"按钮上传配置文件到指定的namespacedataId。
当配置上传到Server端配置中心后,Client端就可以通过namespacedataId来获取具体的配置文件了。
在这里插入图片描述

目前支持上传的配置文件类型有:txt、text、yaml、properties类型。具体的配置文件可参考示例:配置文件示例

3.2.3 配置查询

选择namespacedataId后,可点击"搜索(Search)"按钮查询该配置下的所有配置项信息。

配置以配置项列表的形式呈现,每一行都代表一个配置项,以KeyValue展示。

在这里插入图片描述

3.2.4 配置删除

当不再需要某一套配置时,用户可以删除指定namespacedataId的配置数据。

注意该操作一旦完成,会清空该配置下的所有配置项信息,且无法恢复。请避免删除正在使用中的配置。

在这里插入图片描述

3.2.5 配置修改

在配置项列表中,用户可以对该配置下的某个配置项进行新增修改删除操作。操作成功后Server端和Client端会及时收到配置变更,从而获取到最新的值。

  • 新增:在当前配置下添加配置项

在这里插入图片描述

  • 修改:修改指定配置项的值。

在这里插入图片描述

  • 删除:删除指定的配置项

在这里插入图片描述

3.3 Client端配置

Client需要添加如下的配置项。其中raft.server-addr需要和Server端Raft集群的IP地址列表一致。

config:type: raft # Raft模式raft:server-addr: 192.168.241.1:7091, 192.168.241.2:7091 ,192.168.241.3:7091 # 配置raft相关元数据的获取地址username: 'seata' # 鉴权password: 'seata' # 鉴权db:namespace: 'default' # 命名空间dataId: 'seata.properties' # 配置文件Id

此外,client需要引入HttpClient依赖,用于通过Http请求向Seata-Server集群获取配置信息

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId>
</dependency>

配置完成后,Client应用启动时就会从raft.server-addr配置的Server中订阅并获取指定namespacedataId的配置,并通过监听机制在配置发生变更时获取获取最新配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/451170.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】HTTP报文详解,HTTPS基于HTTP做了哪些改进?(面试经典题)

HTTP协议基本报文格式 在计算机网络中&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;是应用层的一种协议&#xff0c;用于客户端&#xff08;通常是浏览器&#xff09;和服务器之间的通信。HTTP报文分为请求报文和响应报文&#xff0c;以下是它们的基本格式。 1. H…

【R语言】gadm全球行政区划数据库

我R语言不熟、也不是学GIS的。仅用于记录。 文章目录 一、gadm 数据库简介二、R 语言示例三、sf 包的函数 一、gadm 数据库简介 GADM&#xff08;全称Database of Global Administrative Areas&#xff09;是一个高精度的全球行政区划数据库&#xff0c;它包含了全球所有国家和…

cs木马图形化界面出现问题处理

一个月多月没用cs木马了&#xff0c;发现打开客户端之后显示不出图形化界面&#xff0c;且出现下面这样的报错。 、 最后发现是java版本的问题&#xff0c;kali的java自动更新了。把原来的openjdk11改到了openjdk23。 解决方法&#xff1a; 输入&#xff1a; sudo update-…

vue的动态组件 keep-alive

1. 什么是动态组件 动态组件指的是 动态切换组件的显示与隐藏 2. 如何实现动态组件渲染 vue提供了一个内置的<component>组件&#xff0c;专门用来实现动态组件的渲染。 作用&#xff1a;组件的占位符is的值表示要渲染的组件 示例代码如下&#xff1a; Left.vue的代…

2024版AI大模型转行入门全攻略,零基础入门到精通,收藏这一篇就够了

引言 随着人工智能和大模型&#xff08;如GPT-4、BERT等&#xff09;技术的快速发展&#xff0c;越来越多的专业人士希望转行进入这一领域。大模型开发涉及复杂的技术体系和多样的应用场景&#xff0c;对从业者的知识和能力提出了较高要求。本文将详细解析转行大模型开发所需的…

1.C++经典实例-计算两个数的最大公约数

用户输入两个数字&#xff0c;然后通过程序计算出这两个数字的最大公约数&#xff1a; 最大公约数&#xff08;greatest common divisor&#xff0c;简写为 gcd &#xff1b;或highest common factor&#xff0c;简写为hcf)&#xff0c;指某几个整数共有因子中最大的一个 #in…

RHCE——例行性工作

准备工作 [rootlocalhost ~]# cat /etc/yum.repos.d/aliyun.repo [ali-app] nameali-app baseurlhttps://mirrors.aliyun.com/centos-stream/9-stream/AppStream/x86_64/os/ gpgcheck0[ali-base] nameali-base baseurlhttps://mirrors.aliyun.com/centos-stream/9-stream/Base…

探索YOLO v11:3D人工智能的RGB-D视觉革命

哈喽&#xff0c;各位OAK中国的朋友们! 大家好我是张伯生 今天&#xff0c;我想给大家演示一下最新发布的Yolo V11神经网络 下面我将演示的一个程序是&#xff1a;同时在我们的OAK相机上跑Yolo V11和RGB-D&#xff0c;也就是彩色相机和深度图的一个叠加的一个效果 RGB-D和Yo…

C++标准模板库--vector

vector 介绍 vector&#xff08;向量&#xff09;是一种序列容器&#xff0c;表示为可以改变大小的数组。vector中的元素使用连续的存储位置&#xff0c;这意味着也可以使用指向其元素的常规指针偏移量来访问任意元素&#xff0c;且与数组一样高效。但与数组不同的是&#xff…

网络空间安全之一个WH的超前沿全栈技术深入学习之路(一:渗透测试行业术语扫盲)作者——LJS

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️网络空间安全——全栈前沿技术持续深入学习 专栏跑道二➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️ MYSQL REDIS Advanc…

线性系统性能分析方法3——频率特性分析法(频域分析法)

一种图解的分析方法&#xff0c;不必直接求解系统输出的时域表达式&#xff0c;不需要求解系统的闭环特征根&#xff0c;具有较多的优点。如&#xff1a; ①根据系统的开环频率特性揭示闭环系统的动态性能和稳态性能&#xff0c;得到定性和定量的结论&#xff0c;可以简单迅速…

OpenCV高级图形用户界面(12)用于更改指定窗口的大小函数resizeWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::resizeWindow() 函数用于更改指定窗口的大小。这使得你可以根据需要调整窗口的宽度和高度。 注释 指定的窗口大小是指图像区域的大小。工具栏…

基于Java语言的培训平台+学习平台+在线学习培训系统+教育平台+教育学习系统+课程学习平台

简述 企业培训平台企业考试系统培训平台考试系统企业大学企业视频网站视频学习平台 介绍 企业培训平台支持企业培训考试全流程&#xff0c;在线学习、在线考试&#xff0c;成熟的企业培训考试解决方案&#xff0c;充分满足企业培训需求。 独立部署&#xff0c;仅内部员工登录…

Java 异步编程——常用线程池 ThreadPoolExecutor

文章目录 ThreadPoolExecutor核心参数详解线程池的处理流程线程池中使用的阻塞队列4 种任务拒绝策略4 种不同的线程池线程池的五种状态 Future 接口 ThreadPoolExecutor java.uitl.concurrent.ThreadPoolExecutor 类是线程池中最核心的一个类。 线程池底层示例图&#xff1a;…

代码随想录算法训练营第十六天|513. 找树左下角的值 112. 路径总和 106. 从中序与后序遍历序列构造二叉树

513. 找树左下角的值 题目 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 题目解析---迭代法 层序遍历&#xff0c;然后只需要记录最后一行第一个节点的数值就可…

xtu oj 原根

文章目录 回顾杂思路c 语言代码 回顾 AB III问题 H: 三角数问题 G: 3个数等式 数组下标查询&#xff0c;降低时间复杂度1405 问题 E: 世界杯xtu 数码串xtu oj 神经网络xtu oj 1167 逆序数&#xff08;大数据&#xff09; 杂 有一些题可能是往年的程设的题&#xff0c;现在搬到…

001 Hadoop安装、Spring整合测试

Hadoop安装、整合测试 文章目录 Hadoop安装、整合测试1.简介1.优点2.组成 2.安装1.安装jdk&#xff08;如已安装可跳过&#xff09;2.安装hadoop1.安装2. 修改配置文件core-site.xml3. 修改配置文件hdfs-site.xml4.启动hadoop5.启动yarn6.执行jps查看7.相关端口及配置位置8.访问…

Zilliz获Forrester报告全球第一;OB支持向量能力;Azure发布DiskANN;阿里云PG发布内置分析引擎

重要更新 1. Azure发布PostgreSQL向量索引扩展DiskANN&#xff0c;声称在构建HNSW/IVFFlat索引上&#xff0c;速度、精准度都超越pg_vector&#xff0c;并解决了pg_vector长期存在的偶发性返回错误结果的问题( [1] )。 2. 阿里云RDS PostgreSQL 发布AP加速引擎&#xff08;rds…

修改MYSQL库的默认字符集和校验规则

修改mysql的默认配置文件my.cnf。 vim /etc/my.cnf 如果没有这个文件就可能在这个路径&#xff1a;/etc/mysql/my.cnf 在 [mysqld] 部分下&#xff0c;添加或修改以下设置&#xff1a; character-set-server [要修改的字符集] collation-server [要修改的校验规则] 保存文…

Git客户端使用之命令行

一、git客户端命令行的使用 1、创建本地用户并绑定ssh-key到gitlab #在本地注册用户,这个用户随便创建它就是与git仓库连接的一个用户&#xff0c;不过最好喝git仓库用户一样有利于区分。 git config --global user.name "wenqiang1" git config --global user.ema…