本文提供kubernetes中部署seata部署方式,采用存储模式为db。其他部署方式请参考官方文档

什么是Seata?

Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

原理

注册在nacos上微服务和seata服务端,通过nacos互访;

  • 1、seata配置文件中保存了nacos地址,nacos中保存了seata的配置信息(包括数据库地址,用户名,密码等)
  • 2、启动seata后,seata注册到nacos配置中心。
  • 3、spring cloud微服务项目通过nacos注册中心找到seata服务,把事务数据保存到seata在nacos配置中心中指定的数据库中。

服务器操作

一、预备工作

确保后台已经启动 Nacos 服务。如果您尚且不熟悉 Nacos 的基本使用的话,可先行参考 Nacos 快速入门。建议使用 Nacos 1.2.0 及以上的版本

获取server安装包
https://github.com/seata/seata/releases
获取数据库脚本
https://github.com/seata/seata/tree/develop/script/server/db

二、导入数据库配置

我们需要创建一个库,并导入第一步中的数据库脚本。

三、修改server配置

Server端存储模式(store.mode)现有file、db、redis三种(后续将引入raft,mongodb),file模式无需改动,直接启动即可,下面专门讲下db启动步骤。

注: file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;
db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;
redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置

1、nacos配置中心导入脚本

下载nacos-config.sh执行脚本放置于conf文件夹内;

2、config.txt配置信息

(包含server和client,原名nacos-config.txt)为通用参数文件
下载config.txt放置于seata软件包根目录、修改store.db.url 、store.db.user、store.db.password 数据库相关的配置信息
image.png

注意: 如果我们后面准备在服务器上启动seata服务端,这里只需要修改conf文件夹下面的file.conf(修改mode字段和数据库相关配置)和registry.conf(type字段和nacos相关配置)即可。

3、修改registry.conf和file.conf 【可选操作】

image.png
image.png

四、nacos创建seata命名空间

打开Nacos控制台,建议新建一个命名空间,因为config.txt中配置信息太多太乱。
image.png

五、上传配置至Nacos配置中心

参考https://github.com/seata/seata/tree/develop/script/config-center 的config.txt并修改(我们在第三步已经修改过了),之后运行仓库中提供的nacos脚本,将信息提交到nacos控制台,如果有需要更改,可直接通过控制台更改。

  1. 执行命令:
  2. bash seata/conf/nacos-config.sh -h nacos-****.top -p 80 -g SEATA_GROUP -t 3a05*******e8457

-h: nacos服务端IP或域名 -p: nacos服务端端口 -g: 分组信息 -t: nacos的命名空间ID -u: nacos登录名 -w: nacos登录密码

导入配置完毕后,检查nacos中配置导入信息
image.png
上面我们在服务器上执行了导入seata配置信息,接下来需要在kubernetes集群中启动一个seata服务端

kubernetes集群操作

在k8s集群中部署服务,我们需要确定以下几点

1、首先服务是否需要持久化存储? 2、服务是否有确定镜像需求? 3、服务是否有命名空间和副本数量要求? 4、服务是集群内还是集群内访问,对域名的需求?

根据上面几点的考虑,我们seata镜像版本选择1.4.0(特定业务需求);由于我们选择db存储数据,因此无需持久到某个存储介质上;服务无特定命名空间和副本数量要求,可以自定;由于seata也作为一个微服务注册到nacos上,和其他注册到nacos的服务,通过注册中心互访即可,无需域名。

六、修改registry.conf的注册中心配置

需要修改seata连接nacos配置信息

  1. registry {
  2. type = "nacos"
  3. nacos {
  4. application = "seata-server"
  5. serverAddr = "nacos*******.top:80"
  6. group = "SEATA_GROUP"
  7. namespace = ""
  8. cluster = "default"
  9. username = ""
  10. password = ""
  11. }
  12. }
  13. config {
  14. type = "nacos"
  15. nacos {
  16. serverAddr = "nacos******.top:80"
  17. namespace = "3a05*******e8457"
  18. group = "SEATA_GROUP"
  19. username = ""
  20. password = ""
  21. }
  22. }

修改后的配置信息作为ConfigMap挂载到容器内/root/seata-config目录下

七、启动server端

部署文件参考

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: seata-ha-server
  5. namespace: infra
  6. labels:
  7. app.kubernetes.io/name: seata-ha-server
  8. spec:
  9. type: ClusterIP
  10. ports:
  11. - port: 8091
  12. protocol: TCP
  13. name: http
  14. selector:
  15. app.kubernetes.io/name: seata-ha-server
  16. ---
  17. apiVersion: apps/v1
  18. kind: Deployment
  19. metadata:
  20. name: seata-ha-server
  21. namespace: infra
  22. labels:
  23. app.kubernetes.io/name: seata-ha-server
  24. spec:
  25. replicas: 3
  26. selector:
  27. matchLabels:
  28. app.kubernetes.io/name: seata-ha-server
  29. template:
  30. metadata:
  31. labels:
  32. app.kubernetes.io/name: seata-ha-server
  33. spec:
  34. containers:
  35. - name: seata-ha-server
  36. image: docker.io/seataio/seata-server:1.4.0
  37. imagePullPolicy: IfNotPresent
  38. env:
  39. - name: SEATA_CONFIG_NAME
  40. value: file:/root/seata-config/registry
  41. ports:
  42. - name: http
  43. containerPort: 8091
  44. protocol: TCP
  45. volumeMounts:
  46. - name: seata-config
  47. mountPath: /root/seata-config
  48. volumes:
  49. - name: seata-config
  50. configMap:
  51. name: seata-ha-server-config
  52. ---
  53. apiVersion: v1
  54. kind: ConfigMap
  55. metadata:
  56. name: seata-ha-server-config
  57. namespace: infra
  58. data:
  59. registry.conf: |
  60. registry {
  61. type = "nacos"
  62. nacos {
  63. application = "seata-server"
  64. serverAddr = "nacos*******.top:80"
  65. group = "SEATA_GROUP"
  66. namespace = ""
  67. cluster = "default"
  68. username = ""
  69. password = ""
  70. }
  71. }
  72. config {
  73. type = "nacos"
  74. nacos {
  75. serverAddr = "nacos******.top:80"
  76. namespace = "3a059*****be8457"
  77. group = "SEATA_GROUP"
  78. username = ""
  79. password = ""
  80. }
  81. }

1、启动服务

kubectl apply -f  seata-ha-server.yaml

2、检查seata是否注册到nacos

image.png
在nacos web界面,服务管理—>服务列表中,如果发现上面图片内容,说明我们的seata已经成功注册到了nacos。