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">…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...