seata是阿里巴巴的一款开源的分布式事务框架,官方已经支持docker了,但是因为业务的需要,需要自己定制。
制作docker镜像
官方的Dockerfile、下载seata-server-1.1.0
导入seata
需要的sql脚本到mysql,创建seata
数据库
-- 每个业务库中都要创建undo_log表
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
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(64),
`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(96),
`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;
因为运行的脚本seata-server.sh
中一些虚拟机参数是写死的,而且给的很大,需要修改脚本,通过环境变量来获得参数值:
准备工作:
# 解压缩 seata-server-1.1.0.zip
[root@VM_0_16_centos seata]# tree seata
seata
|-- bin
| |-- seata-server.bat
| `-- seata-server.sh
|-- conf
| |-- file.conf
| |-- file.conf.example
| |-- logback.xml
| |-- META-INF
| | `-- services
| | |-- io.seata.core.lock.Locker
| | |-- io.seata.core.store.db.DataSourceGenerator
| | |-- io.seata.server.coordinator.AbstractCore
| | |-- io.seata.server.session.SessionManager
| | `-- io.seata.server.store.TransactionStoreManager
| |-- README.md
| |-- README-zh.md
| `-- registry.conf
|-- lib
| |-- animal-sniffer-annotations-1.17.jar
。。。
vim seata-server.sh
#==================== 修改前
exec "$JAVACMD" $JAVA_OPTS -server -Xmx2048m -Xms2048m -Xmn1024m -Xss512k -XX:SurvivorRatio=10 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=1024m -XX:-OmitStackTraceInFastThrow -XX:-UseAdaptiveSizePolicy -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="$BASEDIR"/logs/java_heapdump.hprof -XX:+DisableExplicitGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -Xloggc:"$BASEDIR"/logs/seata_gc.log -verbose:gc -Dio.netty.leakDetectionLevel=advanced \
-classpath "$CLASSPATH" \
-Dapp.name="seata-server" \
-Dapp.pid="$$" \
-Dapp.repo="$REPO" \
-Dapp.home="$BASEDIR" \
-Dbasedir="$BASEDIR" \
io.seata.server.Server \
"$@"
#==================== 修改后
# -Xmx${JVM_XMX:-2048m} 表示当JVM_XMX为null或者空字符串的时候赋值2048m
exec "$JAVACMD" $JAVA_OPTS -server -Xmx${JVM_XMX:-2048m} -Xms${JVM_XMS:-2048m} -Xmn${JVM_XMN:-1024m} -Xss${JVM_XSS:-512k} -XX:SurvivorRatio=10 -XX:MetaspaceSize=${JVM_MS:-128m} -XX:MaxMetaspaceSize=${JVM_MMS:-256m} -XX:MaxDirectMemorySize=${JVM_MDMS:-1024m} -XX:-OmitStackTraceInFastThrow -XX:-UseAdaptiveSizePolicy -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="$BASEDIR"/logs/java_heapdump.hprof -XX:+DisableExplicitGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -Xloggc:"$BASEDIR"/logs/seata_gc.log -verbose:gc -Dio.netty.leakDetectionLevel=advanced \
-classpath "$CLASSPATH" \
-Dapp.name="seata-server" \
-Dapp.pid="$$" \
-Dapp.repo="$REPO" \
-Dapp.home="$BASEDIR" \
-Dbasedir="$BASEDIR" \
io.seata.server.Server \
"$@"
vim Dockerfile
FROM centos:7
MAINTAINER pader "[email protected]"
RUN set -x \
&& ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo '$TIME_ZONE' > /etc/timezone
# 允许挂载该目录
VOLUME /opt/seata/conf
VOLUME /opt/seata/logs
# 添加jdk
ADD jdk-8u144-linux-x64.tar.gz /opt
ADD seata /opt/seata
# set environment
ENV SEATA_USER="seata" \
BASE_DIR=/opt/seata \
JAVA_HOME="/opt/jdk1.8.0_144" \
JAVA="/opt/jdk1.8.0_144/bin/java" \
TIME_ZONE="Asia/Shanghai" \
SERVER_PORT="8091" \
CLUSTER_NUM=1
# 设置额外参数
ENV JVM_XMX=1024m \
JVM_XMS=1024m \
JVM_XMN=512m \
JVM_XSS=256K \
JVM_MS=64m \
JVM_MMS=128m \
JVM_MDMS=512m
WORKDIR $BASE_DIR
EXPOSE 9411
ENTRYPOINT ["sh", "-c", "/opt/seata/bin/seata-server.sh"]
构建镜像:
docker build -t bart/seata:1.1.0 .
运行:
# 如果需要使用自己的配置文件的话
mkdir -p /home/seata/conf
mkdir -p /home/seata/logs
# 将默认配置文件放到conf中
# file.conf 、 registry.conf 参考官网配置
# https://seata.io/zh-cn/blog/seata-quick-start.html#
# 默认启动
docker run -d \
--name seata01 \
--restart always \
-p 19411:9411 \
bart/seata:1.1.0