Apache Seata 高可用部署实践
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。
Apache Seata 高可用部署实践
Seata 高可用部署实践
使用配置中心和数据库来实现 Seata 的高可用,以 Nacos 和 MySQL 为例,将cloud-seata-nacos应用部署到 Kubernetes 集群中
该应用使用 Nacos 作为配置和注册中心,总共有三个服务: order-service, pay-service, storage-service, 其中 order-service 对外提供下单接口,当余额和库存充足时,下单成功,会提交事务,当不足时会抛出异常,下单失败,回滚事务
准备工作
需要准备可用的注册中心、配置中心 Nacos 和 MySQL,通常情况下,注册中心、配置中心和数据库都是已有的,不需要特别配置,在这个实践中,为了简单,只部署单机的注册中心、配置中心和数据库,假设他们是可靠的
- 部署 Nacos
在服务器部署 Nacos,开放 8848 端口,用于 seata-server 注册,服务器地址为 192.168.199.2
docker run --name nacos -p 8848:8848 -e MODE=standalone nacos/nacos-server
- 部署 MySQL
部署一台MySQL 数据库,用于保存事务数据,服务器地址为 192.168.199.2
docker run --name mysql -p 30060:3306-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.17
部署 seata-server
- 创建seata-server需要的表
具体的 SQL 参考 script/server/db,这里使用的是 MySQL 的脚本,数据库名称为 seata
同时,也需要创建 undo_log 表, 可以参考 script/client/at/db/
- 修改seata-server配置
将以下配置添加到 Nacos 配置中心,具体添加方法可以参考 script/config-center
service.vgroupMapping.my_test_tx_group=default
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://192.168.199.2:30060/seata?useUnicode=true
store.db.user=root
store.db.password=123456
部署 seata-server 到 Kubernetes
- seata-server.yaml
需要将 ConfigMap 的注册中心和配置中心地址改成相应的地址
apiVersion: v1
kind: Service
metadata:name: seata-ha-servernamespace: defaultlabels:app.kubernetes.io/name: seata-ha-server
spec:type: ClusterIPports:- port: 8091protocol: TCPname: httpselector:app.kubernetes.io/name: seata-ha-server---apiVersion: apps/v1
kind: StatefulSet
metadata:name: seata-ha-servernamespace: defaultlabels:app.kubernetes.io/name: seata-ha-server
spec:serviceName: seata-ha-serverreplicas: 3selector:matchLabels:app.kubernetes.io/name: seata-ha-servertemplate:metadata:labels:app.kubernetes.io/name: seata-ha-serverspec:containers:- name: seata-ha-serverimage: docker.io/seataio/seata-server:latestimagePullPolicy: IfNotPresentenv:- name: SEATA_CONFIG_NAMEvalue: file:/root/seata-config/registryports:- name: httpcontainerPort: 8091protocol: TCPvolumeMounts:- name: seata-configmountPath: /root/seata-configvolumes:- name: seata-configconfigMap:name: seata-ha-server-config---
apiVersion: v1
kind: ConfigMap
metadata:name: seata-ha-server-config
data:registry.conf: |registry {type = "nacos"nacos {application = "seata-server"serverAddr = "192.168.199.2"}}config {type = "nacos"nacos {serverAddr = "192.168.199.2"group = "SEATA_GROUP"}}
- 部署
kubectl apply -f seata-server.yaml
部署完成后,会有三个 pod
kubectl get pod | grep seata-ha-serverseata-ha-server-645844b8b6-9qh5j 1/1 Running 0 3m14s
seata-ha-server-645844b8b6-pzczs 1/1 Running 0 3m14s
seata-ha-server-645844b8b6-wkpw8 1/1 Running 0 3m14s
待启动完成后,可以在 Nacos 的服务列表中发现三个 seata-server 的实例,至此,已经完成 seata-server 的高可用部署
- 查看服务日志
kubelet logs -f seata-ha-server-645844b8b6-9qh5j
[0.012s][info ][gc] Using Serial
2020-04-15 00:55:09.880 INFO [main]io.seata.server.ParameterParser.init:90 -The server is running in container.
2020-04-15 00:55:10.013 INFO [main]io.seata.config.FileConfiguration.<init>:110 -The configuration file used is file:/root/seata-config/registry.conf
2020-04-15 00:55:12.426 INFO [main]com.alibaba.druid.pool.DruidDataSource.init:947 -{dataSource-1} inited
2020-04-15 00:55:13.127 INFO [main]io.seata.core.rpc.netty.RpcServerBootstrap.start:155 -Server started
其中{dataSource-1}
说明使用了数据库,并正常初始化完成
- 查看注册中心,此时seata-serve 这个服务会有三个实例
部署业务服务
- 创建业务表并初始化数据
具体的业务表可以参考 cloud-seata-nacos/README.md
- 添加 Nacos 配置
在 public 的命名空间下,分别创建 data-id 为 order-service.properties
, pay-service.properties
, storage-service.properties
的配置,内容相同,需要修改数据库的地址、用户名和密码
# MySQL
spring.datasource.url=jdbc:mysql://192.168.199.2:30060/seata?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Seata
spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group
- 部署服务
通过 application.yaml 配置文件部署服务,需要注意的是修改 ConfigMap 的 NACOS_ADDR
为自己的 Nacos 地址
apiVersion: v1
kind: Service
metadata:namespace: defaultname: seata-ha-servicelabels:app.kubernetes.io/name: seata-ha-service
spec:type: NodePortports:- port: 8081nodePort: 30081protocol: TCPname: httpselector:app.kubernetes.io/name: seata-ha-service---
apiVersion: v1
kind: ConfigMap
metadata:name: seata-ha-service-config
data:NACOS_ADDR: 192.168.199.2:8848---
apiVersion: v1
kind: ServiceAccount
metadata:name: seata-ha-accountnamespace: default---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:name: seata-ha-account
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:- kind: ServiceAccountname: seata-ha-accountnamespace: default---
apiVersion: apps/v1
kind: Deployment
metadata:namespace: defaultname: seata-ha-servicelabels:app.kubernetes.io/name: seata-ha-service
spec:replicas: 1selector:matchLabels:app.kubernetes.io/name: seata-ha-servicetemplate:metadata:labels:app.kubernetes.io/name: seata-ha-servicespec:serviceAccountName: seata-ha-accountcontainers:- name: seata-ha-order-serviceimage: "registry.cn-qingdao.aliyuncs.com/hellowoodes/seata-ha-order-service:1.1"imagePullPolicy: IfNotPresentenv:- name: NACOS_ADDRvalueFrom:configMapKeyRef:key: NACOS_ADDRname: seata-ha-service-configports:- name: httpcontainerPort: 8081protocol: TCP- name: seata-ha-pay-serviceimage: "registry.cn-qingdao.aliyuncs.com/hellowoodes/seata-ha-pay-service:1.1"imagePullPolicy: IfNotPresentenv:- name: NACOS_ADDRvalueFrom:configMapKeyRef:key: NACOS_ADDRname: seata-ha-service-configports:- name: httpcontainerPort: 8082protocol: TCP- name: seata-ha-storage-serviceimage: "registry.cn-qingdao.aliyuncs.com/hellowoodes/seata-ha-storage-service:1.1"imagePullPolicy: IfNotPresentenv:- name: NACOS_ADDRvalueFrom:configMapKeyRef:key: NACOS_ADDRname: seata-ha-service-configports:- name: httpcontainerPort: 8083protocol: TCP
通过以下命令,将应用部署到集群中
kubectl apply -f application.yaml
然后查看创建的 pod,seata-ha-service 这个服务下有三个 pod
kubectl get pod | grep seata-ha-serviceseata-ha-service-7dbdc6894b-5r8q4 3/3 Running 0 12m
待应用启动后,在 Nacos 的服务列表中,会有相应的服务
此时查看服务的日志,会看到服务向每一个 TC 都注册了
kubectl logs -f seata-ha-service-7dbdc6894b-5r8q4 seata-ha-order-service
查看任意的 TC 日志,会发现每一个服务都向 TC 注册了
kubelet logs -f seata-ha-server-645844b8b6-9qh5j
测试
测试成功场景
调用下单接口,将 price 设置为 1,因为初始化的余额为 10,可以下单成功
curl -X POST \http://192.168.199.2:30081/order/placeOrder \-H 'Content-Type: application/json' \-d '{"userId": 1,"productId": 1,"price": 1
}'
此时返回结果为:
{"success":true,"message":null,"data":null}
查看TC 的日志,事务成功提交:
查看 order-service 服务日志
测试失败场景
设置 price 为 100,此时余额不足,会下单失败抛出异常,事务会回滚
curl -X POST \http://192.168.199.2:30081/order/placeOrder \-H 'Content-Type: application/json' \-d '{"userId": 1,"productId": 1,"price": 100
}'
查看 TC 的日志:
查看服务的日志 :
多次调用查看服务日志,发现会随机的向其中某台TC发起事务注册,当扩容或缩容后,有相应的 TC 参与或退出,证明高可用部署生效
相关文章:

Apache Seata 高可用部署实践
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata 高可用部署实践 Seata 高可用部署实践 使用配置中心和数据库来实现 Seata 的高…...

nginx配置尝试
from fastapi import FastAPI, File, UploadFile, HTTPException from fastapi.responses import JSONResponse, FileResponse, HTMLResponse import logging import os from datetime import datetime import uvicorn# 初始化日志 logging.basicConfig(filenamefile_server.lo…...

SAR目标检测
Multi-Stage with Filter Augmentation 多阶段滤波器增强(MSFA) 对SAR合成孔径雷达目标检测性能的改善 MSFA ON SAR 传统方法: 预训练:传统方法开始于在通用数据集上预训练一个基础模型。 微调:这个预训练的模型会被微调以适应特定的SAR图像,试图缩小域间的差距 …...

创新配置,秒级采集,火爆短视频评论抓取
快速采集评论数据的好处 快速采集评论数据是在当今数字信息时代的市场趋势分析和用户反馈分析中至关重要的环节。通过准确获取并分析大量用户评论,您将能够更好地了解消费者的需求、情感和偏好。集蜂云采集平台提供了一种简单配置的方法,使您能够快速采…...

STL—容器—string类【对其结构和使用的了解】【对oj相关练习的训练】
STL—容器—string类 其实string类准确来说并不是容器,因为他出现的时间比STL要早,但是也可以说是容器吧。 1.为什么要学习string类? 1.1C语言当中的字符串 C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作…...

讲个SystemVerilog随机约束小坑
正文 记录个在写SystemVerilog随机约束时遇到的一个小坑,如果没有认真去查看随机结果是否符合预期,还真不容易发现。 为了方便讲述,写了如下示例代码。类cl_a里有个随机变量aa,初始值为222。在module top里对类cl_a例化并进行约…...

mysql在windows下的安装
软件安装 配置环境变量 测试...

uniapp 在手机上导出excel
1.创建excelDev.js文件 export default {exportExcel(fileData, documentName excel) {plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, function(fs) {let rootObj fs.rootlet fullPath rootObj.fullPathconsole.log("开始导出数据")// 创建文件夹rootObj…...
收银系统源码-收银台副屏广告
1. 功能描述 门店广告:双屏收银机,副屏广告,主屏和副屏同步,总部可统一控制广告位,也可以给门店开放权限,门店独立上传广告位; 2.适用场景 新店开业、门店周年庆、节假日门店活动宣传&#x…...
【TORCH】torch.normal()中的size参数
在 torch.normal() 函数中,size 参数用于指定生成张量的形状。torch.normal() 函数用于从正态(高斯)分布中生成随机数。函数的基本形式是: torch.normal(mean, std, size)mean:均值,可以是标量或张量。如果…...
【第20章】MyBatis-Plus逻辑删除支持
文章目录 前言一、逻辑删除的工作原理二、支持的数据类型三、使用方法1.配置全局逻辑删除属性2.在实体类中使用 TableLogic 注解 四、常见问题解答1. 如何处理插入操作?2. 删除接口自动填充功能失效怎么办? 五、实战1. 全局配置2. 添加TableLogic3. 自动…...

【IT领域新生必看】 Java编程中的重载(Overloading):初学者轻松掌握的全方位指南
文章目录 引言什么是方法重载(Overloading)?方法重载的基本示例 方法重载的规则1. 参数列表必须不同示例: 2. 返回类型可以相同也可以不同示例: 3. 访问修饰符可以相同也可以不同示例: 4. 可以抛出不同的异…...
python转文本为语音并播放
python转文本为语音并播放 1、导入库 pip install pyttsx3==2.902、流程 1、初始化tts引擎 2、设置音量(0到1之间) 3、设置语速 4、 设置声音对象,voices[0].id代表男生,voices[1].id代表女生 5、转换文本并播放 6、挂起声音引擎3、代码 # -*- coding: utf-8 -*-"…...
解锁高效软件测试:虚拟机助力提升测试流程的秘诀
众所周知,软件测试在软件开发生命周期中至关重要。它确保软件符合要求,没有漏洞,并帮助开发人员优化性能,验证项目功能。 然而,测试可能既耗时又耗费资源,特别是当需要在不同操作系统和配置上测试软件组件…...

创建vue3项目
npm create vuelatest 编译打包生成报告 yarn add rollup-plugin-visualizer vite.config.ts: import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import vueJsx from vitejs/plugin-vue-jsx import vueDevTo…...

中国网络安全审查认证和市场监管大数据中心数据合规官CCRC-DCO
关于CCRC-DCO证书的颁发机构,它是由中国网络安全审查认证与市场监管大数据中心(简称CCRC)负责。 该中心在2006年得到中央机构编制委员会办公室的批准成立,隶属于国家市场监督管理总局,是其直辖的事业单位。 依据《网络…...

Web漏洞扫描工具AppScan与AWVS测评及使用体验
AppScan和AWVS业界知名的Web漏洞扫描工具,你是否也好奇到底哪一个能力更胜一筹呢?接下来跟随博主一探究竟吧。 1. 方案概览 第一步:安装一个用于评测的Web漏洞靶场(本文采用最知名和最广泛使用的靶场,即OWASP Benchma…...

瞰景Smart3D使用体验分享
引言 作为一名建筑设计师,我一直在寻找能够提升工作效率和设计质量的软件工具。瞰景Smart3D(Smart3D)是一款备受推崇的3D建模和设计软件,广泛应用于建筑、工程和施工(AEC)行业。经过一段时间的使用&#x…...
Android系统adb shell dumpsys activity processes
在Android系统中,adb shell dumpsys activity processes 命令是一个非常强大的工具,用于获取当前系统中所有运行进程的详细信息,包括它们的状态、内存使用情况、任务栈等。这对于开发者来说非常有用,尤其是在调试应用、分析系统性…...

vue侦听器watch()
侦听器watch() 侦听器侦听数据变化,我们可以使用watch 选项在每次响应式属性变化时触发一个函数。 <template><h3>侦听器watch</h3><hr> <p>{{nessage}}</p> <button click"exchage">…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...