分布式事务seate-server的docker镜像的制作与部署
Posted 张维鹏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式事务seate-server的docker镜像的制作与部署相关的知识,希望对你有一定的参考价值。
Seata 是一款开源的分布式事务解决方案,致力于提供高性能与简单易用的分布式事务服务,为用户提供了 AT、TCC、SAGA 和 XA 几种不同的事务模式。在 Seata 中主要有以下三种角色,其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起,TC 作为 Seata 的 Server 端(下文简称 seata-server)独立部署。而 seata-server 的部署模式支持多种:直接部署,使用 Docker、Docker-Compose、Kubernetes、Helm 等
本文主要介绍如何使用 docker 部署 seata-server,官网操作手册文档地址:https://seata.io/zh-cn/docs/ops/deploy-by-docker.html,使用 docker 好处这里就不多介绍了,由于我电脑是 window 系统,所以需要提前安装 docker desktop for window,安装教程读者请自行搜索
一、准备工作:
1、创建 seata-server 所需要的表
TC 运行需要将事务信息保存在数据库,因此需要创建一些表,找到 seata-1.4.2 源码的 script\\server\\db 这个目录,将会看到以下SQL文件:
以 mysql 数据库为例,创建数据库 seata,并执行 mysql.sql 文件中的sql语句:
CREATE TABLE IF NOT EXISTS `global_table`
(
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`status` TINYINT NOT NULL,
`application_id` VARCHAR(32),
`transaction_service_group` VARCHAR(32),
`transaction_name` VARCHAR(128),
`timeout` INT,
`begin_time` BIGINT,
`application_data` VARCHAR(2000),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`xid`),
KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
`branch_id` BIGINT NOT NULL,
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`resource_group_id` VARCHAR(32),
`resource_id` VARCHAR(256),
`branch_type` VARCHAR(8),
`status` TINYINT,
`client_id` VARCHAR(64),
`application_data` VARCHAR(2000),
`gmt_create` DATETIME(6),
`gmt_modified` DATETIME(6),
PRIMARY KEY (`branch_id`),
KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
`row_key` VARCHAR(128) NOT NULL,
`xid` VARCHAR(128),
`transaction_id` BIGINT,
`branch_id` BIGINT NOT NULL,
`resource_id` VARCHAR(256),
`table_name` VARCHAR(32),
`pk` VARCHAR(36),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
创建的三张表如下图:
- global_table:全局事务表,每当有一个全局事务发起后,就会在该表中记录全局事务的ID
- branch_table:分支事务表,记录每一个分支事务的ID,分支事务操作的哪个数据库等信息
- lock_table:全局锁
2、下载 seata-server:
seata-server 下载地址:Releases · seata/seata · GitHub
3、构建项目:
本地解压 seata-server-1.4.2.tar.gz 压缩包,并取出 conf/file.conf 和 conf/registry.conf 用于配置运行时的相关参数,最后创建制作镜像所需的 Dockerfile 文件,最终文件目录结构如下:
4、修改 seata-server 的注册中心和配置中心:
在 registry.conf 文件中可以配置 TC的注册中心和配置中心,默认的注册中心是 file 形式,实际使用中肯定不能使用,这里我们改成Nacos形式;同样 Seate 的 TC 的配置中心默认也是使用 file 形式,需要修改为 nacos 作为配置中心:
registry
type = "nacos"
nacos
application = "seata-server"
serverAddr = "localhost:8848"
namespace = "XXXXXXXXXX"
cluster = "default"
username = "nacos"
password = "nacos"
config
type = "nacos"
nacos
serverAddr = "localhost:8848"
namespace = "XXXXXXXXXX"
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
需要改动的地方如下:
- type:改成nacos,表示使用nacos作为注册中心或者配置中心
- application:服务的名称
- serverAddr:nacos的地址
- group:分组
- namespace:命名空间
- username:用户名
- password:密码
上述配置修改好之后,在TC启动的时候将会自动读取 nacos 的配置
5、导入 seata Server 配置:
建议将 seata 项目下载到本地并阅读 https://github.com/seata/seata/tree/1.4.2/script/config-center 路径下的README.md内容
在上面我们已经配置好 seata TC 的配置中心,那么 TC 需要存储到 Nacos 的配置都有哪些,如何推送过去呢?在 https://github.com/seata/seata/tree/1.4.2/script/config-center 中有一个 confIg.txt 文件,其中就是 TC 需要的全部配置,而 https://github.com/seata/seata/tree/1.4.2/script/config-center/nacos 中有一个 nacos-config.sh 脚本能够将 config.txt 中的全部配置自动推送到nacos中。
我们先启动nacos服务,然后在 nacos-config.sh 目录下执行下面命令,将 config.txt 中的配置信息推送到 nacos 中:
# -h 代表nacos服务的IP;-p 代表nacos的端口号;-g 分组信息;-t 命名空间ID;-u 用户名,-p 密码
$ sh nacos-config.sh -h 127.0.0.1 -p 8080 -g SEATA_GROUP -t 7a7581ef-433d-46f3-93f9-5fdc18239c65 -u nacos -w nacos
命令执行成功后,就可以在nacos中看到如下配置:
6、修改TC的事务信息存储方式:
seata 的 TC 端的事务信息存储模式(store.mode)现有file、db、redis三种,file模式无需改动,直接启动即可,下面专门讲下db和redis启动步骤。
注: file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件 root.data,性能较高;
(1)以DB模式存储:
db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;上一节的内容已经将所有的配置信息都推送到了Nacos中,TC启动时会从Nacos中读取,因此我们修改也需要在Nacos中修改。需要修改的配置如下:
## 采用db的存储形式
store.mode=db
## druid数据源
store.db.datasource=druid
## mysql数据库
store.db.dbType=mysql
## mysql驱动
store.db.driverClassName=com.mysql.jdbc.Driver
## TC的数据库url
store.db.url=jdbc:mysql://127.0.0.1:3306/seata_server?useUnicode=true
## 用户名
store.db.user=root
## 密码
store.db.password=Nov2014
在nacos中搜索上述的配置,直接修改其中的值,比如修改 store.mode,如下图:
(2)以Redis模式存储:
redis模式 Seata-Server 1.3 及以上版本支持,性能较高,但存在事务信息丢失风险,所以需要提前配置合适当前场景的redis持久化配置,该模式需改动以下配置:
store.mode=redis
store.redis.host=127.0.0.1
store.redis.port=6379
store.redis.password=123456
至此,就完成 seata-server 的所有准备工作了,接下来我们介绍下如果制作 seate 的 docker 镜像
二、seata 镜像的制作与部署:
1、编写 Dockerfile:
FROM openjdk:8
MAINTAINER zhangweipeng
# set environment
ENV SEATA_USER="seata" \\
BASE_DIR="/home/seata" \\
JVM_XMS="1g" \\
JVM_XMX="1g" \\
JVM_XMN="512m" \\
JVM_MS="128m" \\
JVM_MMS="320m" \\
TIME_ZONE="Asia/Shanghai"
ARG SEATA_VERSION=1.4.2
# 设置工作目录
WORKDIR $BASE_DIR
COPY seata-server-$SEATA_VERSION.tar.gz /home
# 设置时间,东八区
RUN set -x \\
&& rm -f /etc/localtime \\
&& ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime \\
&& echo '$TIME_ZONE' > /etc/timezone \\
&& tar -xzvf /home/seata-server-$SEATA_VERSION.tar.gz -C /home/seata \\
&& rm -rf /home/seata-server-$SEATA_VERSION.tar.gz
ADD conf/registry.conf /home/seata/seata/seata-server-$SEATA_VERSION/conf/registry.conf
ADD conf/file.conf /home/seata/seata/seata-server-$SEATA_VERSION/conf/file.conf
#端口
EXPOSE 8091
RUN chmod +x /home/seata/seata/seata-server-$SEATA_VERSION/bin/seata-server.sh
ENTRYPOINT ["/home/seata/seata/seata-server-1.4.2/bin/seata-server.sh" ]
2、构建镜像:
在 Dockerfile 所在目录输入以下命令进行镜像构建:
docker build -t seata-docker .
3、运行镜像:
(1)启动 seata-server
docker run --name seata-docker -p 8091:8091 seata-docker
(2)指定 seata-server的 IP 和端口启动:
docker run --name seata-docker -p 8091:8091 -e SEATA_IP=172.28.190.100 -e SEATA_PORT=8091 seata-docker
以这种方式启动的 seata-server,在注册中心注册的 IP 和 端口就是 SEATA_IP 和 SEATA_PORT 指定的值,除此之外,seata-server 还支持以下环境变量:
- SEATA_IP:可选,指定seata-server启动的IP,该IP用于向注册中心注册时使用
- SEATA_PORT:可选,指定seata-server启动的端口,默认为 8091
- STORE_MODE:可选,指定seata-server的事务日志存储方式,支持 db、file、redis,默认是 file
- SERVER_NODE:可选, 用于指定seata-server节点ID, 如
1
,2
,3
...,默认根据IP生成 - SEATA_ENV:可选,指定 seata-server 运行环境,如 dev、test 等,服务启动时会使用
registry-dev.conf
这样的配置 - SEATA_CONFIG_NAME:可选,指定配置文件位置, 如
file:/root/registry
, 将会加载/root/registry.conf
作为配置文件,如果需要同时指定file.conf
文件,需要将registry.conf
的config.file.name
的值改为类似file:/root/file.conf
:
4、推送到远程仓库:
(1)登录远程仓库:
docker login -u username -p password repo-address.com
(2)镜像打标签:
docker tag 1f86b8e86442(镜像ID) repo-address.com/seata-docker:v1
打标签是因为 docker 的 image 标签默认是 latest,如果是其他版本要进行注明。
(3)推送到远程仓库:
docker push repo-address.com/seata-docker:v1
以上是关于分布式事务seate-server的docker镜像的制作与部署的主要内容,如果未能解决你的问题,请参考以下文章