m1系列芯片aarch64架构使用docker-compose安装seata

之前看到 DockerHub 上发布了 m1 芯片 aarch64 架构的 seata 镜像, 所以就尝试的安装了下, 亲测可用:

使用该命令查看正在运行的 seata 容器

docker ps | grep seata

一. docker-compose.yml 命令编写

volumes 命令所指定的宿主机映射地址, 需要根据自己的电脑环境更换

环境变量中的 seata_ip 也可以根据自己的需求更换, 这里用本机演示为例, 定义为 localhost

网络组名称暂不指定, 可以在 yml 文件里补充 network 标签指定网络组名称

java 复制代码
version: "3.1"
services:
  seata-server:
    image: seataio/seata-server:1.8.0-slim
    container_name: seate-server
    
    restart: always

    ports:
      - "7091:7091"
      - "8091:8091"
    environment:
      - STORE_MODE=db
      # 以SEATA_IP作为host注册seata server
      - SEATA_IP=localhost
      - SEATA_PORT=8091

    volumes:
      - "/Users/canxiusi/Documents/docker/seata/log:/root/logs/seata"
      # 使用宿主机的配置文件
      - "/Users/canxiusi/Documents/docker/seata/resources/application.yml:/seata-server/resources/application.yml"
      - "/Users/canxiusi/Documents/docker/seata/resources/logback-spring.xml:/seata-server/resources/logback-spring.xml"
      - "/Users/canxiusi/Documents/docker/seata/bin/seata-setup.sh:/seata-setup.sh"

二. application-yml 配置文件

其实就是一个 springboot 应用的配置文件, 本次只演示简单的使用, 日志/权限相关的配置, 暂时注释掉

2.1 db模式下数据库表配置

sql 复制代码
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS `branch_table`;
CREATE TABLE `branch_table` (
  `branch_id` bigint NOT NULL,
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint DEFAULT NULL,
  `resource_group_id` varchar(32) DEFAULT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `branch_type` varchar(8) DEFAULT NULL,
  `status` tinyint DEFAULT NULL,
  `client_id` varchar(64) DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime(6) DEFAULT NULL,
  `gmt_modified` datetime(6) DEFAULT NULL,
  PRIMARY KEY (`branch_id`),
  KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

DROP TABLE IF EXISTS `distributed_lock`;
CREATE TABLE `distributed_lock` (
  `lock_key` char(20) NOT NULL,
  `lock_value` varchar(20) NOT NULL,
  `expire` bigint DEFAULT NULL,
  PRIMARY KEY (`lock_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;


DROP TABLE IF EXISTS `global_table`;
CREATE TABLE `global_table` (
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint DEFAULT NULL,
  `status` tinyint NOT NULL,
  `application_id` varchar(32) DEFAULT NULL,
  `transaction_service_group` varchar(32) DEFAULT NULL,
  `transaction_name` varchar(128) DEFAULT NULL,
  `timeout` int DEFAULT NULL,
  `begin_time` bigint DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`xid`),
  KEY `idx_status_gmt_modified` (`status`,`gmt_modified`),
  KEY `idx_transaction_id` (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

DROP TABLE IF EXISTS `lock_table`;
CREATE TABLE `lock_table` (
  `row_key` varchar(128) NOT NULL,
  `xid` varchar(128) DEFAULT NULL,
  `transaction_id` bigint DEFAULT NULL,
  `branch_id` bigint NOT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `table_name` varchar(32) DEFAULT NULL,
  `pk` varchar(36) DEFAULT NULL,
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`row_key`),
  KEY `idx_status` (`status`),
  KEY `idx_branch_id` (`branch_id`),
  KEY `idx_xid_and_branch_id` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

SET FOREIGN_KEY_CHECKS = 1;

2.2 使用nacos作为配置中心

在 seata 的 application.yml 配置文件中, 指定了 nacos 作为配置中心和注册中心, 请确保 nacos 服务正在运行, 如果没有安装 nacos, 可以参考我的另外一篇博客:

​​​​​​m1系列芯片aarch64架构使用docker-compose安装nacos_docker compose m1-CSDN博客

之后在 nacos 控制台, 创建命名空间, 并在该命名空间下, 创建 seata.properties 配置文件

该配置文件就是 seata 服务启动需要读取的配置文件

以下配置均为 seata 官网默认配置, 根据自己需要调整

java 复制代码
store.mode=db
#-----db-----
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://192.168.64.1:3306/seata
store.db.user=root
store.db.password=root123
# 数据库初始连接数
store.db.minConn=1
# 数据库最大连接数
store.db.maxConn=30
# 获取连接时最大等待时间 默认5000,单位毫秒
store.db.maxWait=5000
# 全局事务表名 默认global_table
store.db.globalTable=global_table
# 分支事务表名 默认branch_table
store.db.branchTable=branch_table
# 全局锁表名 默认lock_table
store.db.lockTable=lock_table
store.db.distributedLockTable=distributed_lock
# 查询全局事务一次的最大条数 默认100
store.db.queryLimit=100


# undo保留天数 默认7天,log_status=1(附录3)和未正常清理的undo
server.undo.logSaveDays=7
# undo清理线程间隔时间 默认86400000,单位毫秒
server.undo.logDeletePeriod=86400000
# 二阶段提交重试超时时长 单位ms,s,m,h,d,对应毫秒,秒,分,小时,天,默认毫秒。默认值-1表示无限重试
# 公式: timeout>=now-globalTransactionBeginTime,true表示超时则不再重试
# 注: 达到超时时间后将不会做任何重试,有数据不一致风险,除非业务自行可校准数据,否者慎用
server.maxCommitRetryTimeout=-1
# 二阶段回滚重试超时时长
server.maxRollbackRetryTimeout=-1
# 二阶段提交未完成状态全局事务重试提交线程间隔时间 默认1000,单位毫秒
server.recovery.committingRetryPeriod=1000
# 二阶段异步提交状态重试提交线程间隔时间 默认1000,单位毫秒
server.recovery.asynCommittingRetryPeriod=1000
# 二阶段回滚状态重试回滚线程间隔时间  默认1000,单位毫秒
server.recovery.rollbackingRetryPeriod=1000
# 超时状态检测重试线程间隔时间 默认1000,单位毫秒,检测出超时将全局事务置入回滚会话管理器
server.recovery.timeoutRetryPeriod=1000
java 复制代码
server:
  port: 7091

spring:
  application:
    name: seata-server

logging:
  # config: /Users/canxiusi/Documents/docker/seata/resources/logback-spring.xml
  file:
    path: /Users/canxiusi/Documents/docker/seata/log

  # kafka 日志输出配置
  # extend:
  #   logstash-appender:
  #     destination: 127.0.0.1:4560
  #   kafka-appender:
  #     bootstrap-servers: 127.0.0.1:9092
  #     topic: logback_to_logstash

console:
  user:
    username: seata
    password: seata

seata:
  # seata配置中心, 使用nacos
  config:
    type: nacos
    nacos:
      # 需要换成, 你本机所在的ip:port
      server-addr: 192.168.64.1:8848
      group: DEFAULT_GROUP
      # 需要换成, 你创建命名空间后, 获取到的那一大串
      namespace: 866f6a85-3650-41f6-b800-1527ed2f8f62
      username: nacos
      password: nacos
      data-id: seata.properties

  # seata注册中心, 使用nacos
  registry:
    type: nacos
    nacos:
      # 指定 seata 服务启动后, 在nacos的服务名称
      application: seata-server
      # 需要换成, 你本机所在的ip:port
      server-addr: 192.168.64.1:8848
      group: DEFAULT_GROUP
      # 需要换成, 你创建命名空间后, 获取到的那一大串
      namespace: 866f6a85-3650-41f6-b800-1527ed2f8f62
      # tc集群名称
      # cluster: default
      username: nacos
      password: nacos


#  server:
#    service-port: 8091 #If not configured, the default is '${server.port} + 1000'

  security:
    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
    tokenValidityInMilliseconds: 1800000
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

三. 启动 seata 服务

3.1 启动命令

java 复制代码
docker compose up

查看日志可以看到 seata 服务已经启动成功

3.2 登录 seata 控制台

3.3 查看 seata 网络组

java 复制代码
docker network ls 
docker inspect 2240fb4a4c42 

可以看到容器的网络模式为桥接, 容器内的 ip 的 172.18.0.2, 并且和 nacos , mysql 不再同一个网络组, 而且彼此网络隔离, 因为不再一个网络组的容器, 其网络隔离是 docker 的默认的行为

可以是用 docker 启动时候为我们分配的 bridge0 所在 ip 通信, 就是上面配置文件的 192.168.64.1

seata 访问 nacos 使用: 192.168.64.1:8848

seata 访问 mysql 使用 : 192.168.64.1:3306

也可以把 nacos, seata, mysql 连接到到同一个网络组(不推荐), 之后他们可以使用 容器内的 ip 或 容器名称进行通信,

sql 复制代码
# 创建一个自定义桥接网络
docker network create --driver bridge seata_custom_network
 
# 连接 MySQL 容器到这个网络
docker network connect seata_custom_network (容器id或容器名)
 
# 连接 Nacos 容器到这个网络
docker network connect seata_custom_network (容器id或容器名)

# 连接 seata 容器到这个网络
docker network connect seata_custom_network (容器id或容器名)

3.4 创建自定义网络组

docker network create --driver bridge seata_custom_network

查看该网络组, 并使用下面的命令, 把 mysql, nacos, seata, 链接到该网络组

java 复制代码
 docker network connect seata_custom_network fb32495ff923
 docker network connect seata_custom_network 52e9e9ff94aa
 docker network connect seata_custom_network 5c2614366917

查看该网络组详细配置, 可以看到该网络组下面有 seata, mysql, nacos 3个服务, 互相可以使用容器id通信, 或 容器内的 ip 通信

3.5 测试网络互通

使用命令进入 seata 容器内部, 之后测试与 mysql, nacos 的通信, 都可以 ping 通

java 复制代码
docker compose exec seata-server /bin/bash
相关推荐
阿伟*rui44 分钟前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
Lary_Rock2 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
XiaoLeisj3 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck3 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei3 小时前
java的类加载机制的学习
java·学习
昌sit!4 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
Yaml45 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
P.H. Infinity5 小时前
【RabbitMQ】03-交换机
分布式·rabbitmq
小小小妮子~5 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616885 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端