分布式事务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 所需要的表
https://github.com/seata/seata/tree/1.4.2/script/server/db
????????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 = InnoDBDEFAULT 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 = InnoDBDEFAULT 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 = InnoDBDEFAULT 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_DIRCOPY 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.gzADD 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镜像的制作与部署的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 如何设计一个短URL地址系统
- 下一篇: 分布式事务Seata原理
