目录
一、Seata是什么:
Seata 是一个开源的分布式事务解决方案,旨在为微服务架构提供高性能和简单易用的事务管理。Seata 致力于确保在分布式系统中,即便系统分布在不同的服务和数据库中,也能保持数据的一致性。Seata 的主要功能包括分布式事务的协调和管理。它通过一系列的组件和协议实现了事务的统一处理,主要支持四种事务模式,分别是:AT 模式、TCC 模式、SAGA 模式和 XA 模式。下面详细介绍这四种模式的特点和区别:
-
AT 模式(自动补偿模式):
- AT 模式是 Seata 的默认事务模式,主要用于处理简单的 CRUD 操作。
- 这种模式通过记录数据的前后状态,实现了事务的自动回滚。
- 在执行业务操作时,会将相关的数据更改暂时记录在事务日志中,事务提交时再统一提交这些更改。如果事务失败,则使用这些记录来回滚数据到事务开始前的状态。
-
TCC 模式(Try-Confirm-Cancel):
- TCC 是一种基于补偿的事务模式,涉及三个操作步骤:尝试(Try)、确认(Confirm)和取消(Cancel)。
- 在 Try 阶段,事务尝试执行所有业务操作,并检查是否能够成功。
- 如果所有 Try 操作成功,则进入 Confirm 阶段,正式提交事务。如果任一 Try 操作失败,就进入 Cancel 阶段,执行补偿操作回滚事务。
- 这种模式适用于业务流程复杂、需要明确业务操作的场景。
-
SAGA 模式:
- SAGA 模式通常用于长事务,特别适合于微服务架构中服务间调用频繁的场景。
- SAGA 模式通过定义一系列的局部事务,这些局部事务被按顺序执行。
- 每个局部事务执行完后,都会发布一个事件,这个事件会触发下一个局部事务的执行。如果某个局部事务失败,将会触发一系列的补偿事务来回滚之前已完成的事务。
-
XA 模式:
- XA 模式基于 XA 协议,是一个两阶段提交的分布式事务处理过程。
- 第一阶段是准备阶段,所有参与者都会锁定资源,准备提交事务。
- 第二阶段是提交或回滚阶段,根据第一阶段的结果,决定是提交还是回滚事务。
- XA 模式适用于需要强一致性保证的场景,但由于两阶段提交的性质,它可能会导致资源锁定时间较长,影响系统的响应时间和并发能力。
二、K8s部署Seata用Nacos做注册中心
1、添加nacos相关配置
考虑到seata官方文档比较复杂,我这里简化了一下,通过连接:百度网盘 请输入提取码下载后,直接解压到服务器的某个路径下,进入nacos-seata路径执行:
sh nacos-config-interactive.sh
Please enter the host of nacos.
请输入nacos的host [localhost]:
>>>
Please enter the port of nacos.
请输入nacos的port [8848]:
>>>
Please enter the group of nacos.
请输入nacos的group [SEATA_GROUP]:
>>>
Please enter the tenant of nacos.
请输入nacos的tenant:
>>>
Please enter the username of nacos.
请输入nacos的username:
>>>
Please enter the password of nacos.
请输入nacos的password:
>>>
Are you sure to continue? [y/n]
或者
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 5a3c7d6c-f497-4d68-a71a-2e5e3340b3ca -u username -w password
参数说明:
-h:主机,默认值为localhost。
-p:端口,默认值为8848。
-g:配置分组,默认值为'SEAT_GROUP'。
-t:租户信息,对应Nacos的namespace ID字段,默认值为''。
-u:用户名,nacos 1.2.0+ 进行权限控制,默认值为''。
-w:密码,nacos 1.2.0+ 上进行权限控制,默认值为 ''。
Seata官方教程:incubator-seata/script/config-center at develop · apache/incubator-seata · GitHub
2、创建k8s配置文件
devSeata.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: seata
spec:
replicas: 1
serviceName: "seata-server"
selector:
matchLabels:
app: seata-public
template:
metadata:
labels:
app: seata-public
spec:
nodeName: master01
imagePullSecrets:
- name: registry-pull-secret
containers:
- name: seata-server
image: docker.io/seataio/seata-server:1.4.1
imagePullPolicy: IfNotPresent
#env:
# - name: SEATA_CONFIG_NAME
# value: file:/seata-server/resources/registry.conf
ports:
- containerPort: 8091
volumeMounts:
- name: seata-config
mountPath: /seata-server/resources
volumes:
- name: seata-config
hostPath:
path: <物理机所在目录> #物理机所在目录
type: DirectoryOrCreate
seata-service.yaml
apiVersion: v1
kind: Service
metadata:
name: seata-server
spec:
type: NodePort
ports:
- port: 8091
nodePort: <开放端口号>
name: seata
selector:
app: seata-public
seata-configmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: seata-configmap
data:
registry.conf: |
registry {
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "nacos地址:端口"
group = "SEATA_GROUP"
namespace = ""
cluster = "default"
username = ""
password = ""
}
}
config {
type = "nacos"
nacos {
serverAddr = "nacos地址:端口"
namespace = ""
group = "SEATA_GROUP"
username = ""
password = ""
}
}
然后执行:
#创建配置信息
kubectl create -f seata-configmap.yaml
#创建pod
kubectl apply -f devSeata.yaml
#查看pod列表
kubectl get pod,svc -A -o wide
#这时候就可以看到你刚创建的pod了