在现代分布式系统中,保证数据一致性和事务的原子性是非常重要的。Seata 是一种开源的分布式事务解决方案,为分布式系统中的事务管理提供了可靠的支持。通过 Docker,我们可以轻松地部署和管理 Seata,从而简化了部署流程。本篇博客将介绍如何使用 Docker 安装 Seata,并进行简单的配置。
1、使用docker拉取seata镜像
docker pull seataio/seata-server:2.0.0
2、启动seata-server实例
docker run --name seata-server -p 8091:8091 -p 7091:7091 seataio/seata-server:2.0.0
3、使用自定义配置文件
自定义配置文件需要通过挂载文件的方式实现,将宿主机上的 application.yml
挂载到容器中相应的目录。
首先通过以下命令将docker中的配置文件导出的宿主机上。
docker cp 容器id:seata-server/resources /mnt/docker_data/seata
然后通过映射文件启动docker实例。
docker run -d --name seata-server -p 8091:8091 -p 7091:7091 -v /mnt/docker_data/seata/resources:/seata-server/resources seataio/seata-server:2.0.0
其中/mnt/docker_data/seata/resources为宿主机的文件地址;/seata-server/resources为docker容器实例的文件地址;
4、使用nacos注册中心
修改application.yml,使seata注册到nacos服务中心。
seata:registry:# support: nacos, eureka, redis, zk, consul, etcd3, sofa# type: filetype: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace:cluster: defaultusername:password:context-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:
5、使用db存储
修改application.yml,使seata的数据保存到数据库中,本例使用mysql数据库。
seata:store:# support: file 、 db 、 redis 、 raft# mode: filemode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata?characterEncoding=utf-8&useSSL=falseuser: seatapassword: seatamin-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000
seata用到的数据库表相关脚本 :
-- -------------------------------- 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(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_status_gmt_modified` (`status` , `gmt_modified`),KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;-- 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 = utf8mb4;-- 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),`status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',`gmt_create` DATETIME,`gmt_modified` DATETIME,PRIMARY KEY (`row_key`),KEY `idx_status` (`status`),KEY `idx_branch_id` (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE IF NOT EXISTS `distributed_lock`
(`lock_key` CHAR(20) NOT NULL,`lock_value` VARCHAR(20) NOT NULL,`expire` BIGINT,primary key (`lock_key`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);