Hmily容器化部署:Docker Compose一键启动方案

Hmily容器化部署:Docker Compose一键启动方案

【免费下载链接】hmily Distributed transaction solutions 【免费下载链接】hmily 项目地址: https://gitcode.com/gh_mirrors/hm/hmily

分布式事务部署的终极痛点解决方案

你是否还在为Hmily分布式事务框架的部署而头疼?面对复杂的微服务架构、繁琐的配置步骤和容器间网络通信难题,即使是资深开发者也常常耗费数小时甚至数天才能完成环境搭建。本文将为你提供一套Docker Compose一键启动方案,彻底解决这些痛点,让你在10分钟内完成Hmily分布式事务环境的部署与验证。

读完本文后,你将获得:

  • 一套完整的Hmily容器化部署架构设计
  • Docker Compose配置文件与环境变量优化方案
  • 支持TCC/TAC/XA三种模式的多容器协调策略
  • 分布式事务场景的自动化测试与监控方法
  • 生产环境部署的性能调优与高可用保障

Hmily容器化架构设计

整体架构概览

Hmily作为金融级分布式事务解决方案,其容器化部署需要考虑服务解耦、状态管理和网络通信三大核心问题。以下是基于Docker Compose的多容器架构设计:

mermaid

容器组件说明

容器名称镜像来源核心功能资源需求依赖服务
hmily-order自定义构建订单服务,实现分布式事务发起2核4GMySQL, Redis, Eureka
hmily-account自定义构建账户服务,处理资金扣减1核2GMySQL, ZooKeeper
hmily-inventory自定义构建库存服务,处理商品库存管理1核2GMySQL, ZooKeeper
hmily-eureka官方镜像服务注册与发现1核1G-
mysql官方镜像业务数据与事务日志存储2核4G-
redis官方镜像分布式锁与缓存1核2G-
zookeeper官方镜像Dubbo服务注册中心1核2G-
etcd官方镜像配置中心1核2G-
prometheus官方镜像监控指标收集2核4G-
grafana官方镜像监控数据可视化1核2GPrometheus

环境准备与依赖检查

系统要求

部署Hmily容器化环境前,请确保你的系统满足以下要求:

  • Docker Engine 20.10.0+
  • Docker Compose 2.0.0+
  • 至少8GB可用内存
  • 20GB可用磁盘空间
  • 网络连接通畅(需拉取基础镜像)

依赖检查脚本

创建以下脚本检查系统环境是否满足要求:

#!/bin/bash
set -e

# 检查Docker是否安装
if ! command -v docker &> /dev/null; then
    echo "错误: Docker未安装,请先安装Docker"
    exit 1
fi

# 检查Docker Compose是否安装
if ! command -v docker-compose &> /dev/null; then
    echo "错误: Docker Compose未安装,请先安装Docker Compose"
    exit 1
fi

# 检查Docker版本
DOCKER_VERSION=$(docker --version | awk '{print $3}' | cut -d',' -f1)
if ! echo "$DOCKER_VERSION" | grep -qE '^20\.10\.'; then
    echo "警告: Docker版本建议20.10.0+,当前版本为$DOCKER_VERSION"
fi

# 检查内存
MEMORY_AVAILABLE=$(free -g | awk '/Mem:/{print $2}')
if [ "$MEMORY_AVAILABLE" -lt 8 ]; then
    echo "错误: 系统内存不足,至少需要8GB内存"
    exit 1
fi

# 检查磁盘空间
DISK_AVAILABLE=$(df -P . | awk 'NR==2{print $4}')
if [ "$DISK_AVAILABLE" -lt 20000000 ]; then
    echo "错误: 当前目录所在磁盘空间不足,至少需要20GB可用空间"
    exit 1
fi

echo "环境检查通过,可以开始部署Hmily容器化环境"

将以上脚本保存为check_env.sh,执行chmod +x check_env.sh && ./check_env.sh进行环境检查。

Docker Compose配置实现

项目目录结构

首先创建以下目录结构存放配置文件:

hmily-docker/
├── docker-compose.yml           # 主编排文件
├── .env                         # 环境变量配置
├── config/                      # 应用配置文件
│   ├── hmily.yml                # Hmily核心配置
│   ├── order.yml                # 订单服务配置
│   ├── account.yml              # 账户服务配置
│   └── inventory.yml            # 库存服务配置
├── sql/                         # 数据库初始化脚本
│   └── init.sql                 # 表结构与测试数据
├── docker/                      # 自定义Dockerfile
│   ├── order/
│   ├── account/
│   └── inventory/
└── prometheus/                  # 监控配置
    └── prometheus.yml

核心配置文件

docker-compose.yml
version: '3.8'

services:
  # 基础设施服务
  mysql:
    image: mysql:8.0.28
    container_name: hmily-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${HMILY_DB_NAME}
      MYSQL_USER: ${HMILY_DB_USER}
      MYSQL_PASSWORD: ${HMILY_DB_PASSWORD}
    ports:
      - "3306:3306"
    volumes:
      - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql
      - mysql-data:/var/lib/mysql
    networks:
      - hmily-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u${HMILY_DB_USER}", "-p${HMILY_DB_PASSWORD}"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:6.2.6
    container_name: hmily-redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    networks:
      - hmily-network
    command: redis-server --requirepass ${REDIS_PASSWORD}
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  zookeeper:
    image: zookeeper:3.7.0
    container_name: hmily-zookeeper
    restart: always
    ports:
      - "2181:2181"
    volumes:
      - zookeeper-data:/data
      - zookeeper-datalog:/datalog
    networks:
      - hmily-network
    healthcheck:
      test: ["CMD", "zkServer.sh", "status"]
      interval: 10s
      timeout: 5s
      retries: 5

  etcd:
    image: bitnami/etcd:3.5.4
    container_name: hmily-etcd
    restart: always
    environment:
      ALLOW_NONE_AUTHENTICATION: "yes"
      ETCD_ADVERTISE_CLIENT_URLS: http://etcd:2379
    ports:
      - "2379:2379"
    volumes:
      - etcd-data:/bitnami/etcd
    networks:
      - hmily-network
    healthcheck:
      test: ["CMD", "etcdctl", "endpoint", "health"]
      interval: 10s
      timeout: 5s
      retries: 5

  eureka:
    image: springcloud/eureka:2.2.6.RELEASE
    container_name: hmily-eureka
    restart: always
    ports:
      - "8761:8761"
    environment:
      EUREKA_CLIENT_REGISTER_WITH_EUREKA: "false"
      EUREKA_CLIENT_FETCH_REGISTRY: "false"
      EUREKA_SERVER_ENABLE_SELF_PRESERVATION: "false"
    networks:
      - hmily-network
    healthcheck:
      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8761/actuator/health"]
      interval: 10s
      timeout: 5s
      retries: 5

  # 应用服务
  order-service:
    build: ./docker/order
    container_name: hmily-order
    restart: always
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy
      eureka:
        condition: service_healthy
      etcd:
        condition: service_healthy
    environment:
      SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}
      HMILY_REGISTRY_TYPE: ${HMILY_REGISTRY_TYPE}
      HMILY_CONFIG_TYPE: ${HMILY_CONFIG_TYPE}
    ports:
      - "8080:8080"
    volumes:
      - ./config:/app/config
    networks:
      - hmily-network
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:8080/actuator/health"]
      interval: 10s
      timeout: 5s
      retries: 5

  account-service:
    build: ./docker/account
    container_name: hmily-account
    restart: always
    depends_on:
      mysql:
        condition: service_healthy
      zookeeper:
        condition: service_healthy
      etcd:
        condition: service_healthy
    environment:
      SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}
      HMILY_REGISTRY_TYPE: ${HMILY_REGISTRY_TYPE}
      HMILY_CONFIG_TYPE: ${HMILY_CONFIG_TYPE}
    ports:
      - "8081:8080"
    volumes:
      - ./config:/app/config
    networks:
      - hmily-network
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:8080/actuator/health"]
      interval: 10s
      timeout: 5s
      retries: 5

  inventory-service:
    build: ./docker/inventory
    container_name: hmily-inventory
    restart: always
    depends_on:
      mysql:
        condition: service_healthy
      zookeeper:
        condition: service_healthy
      etcd:
        condition: service_healthy
    environment:
      SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}
      HMILY_REGISTRY_TYPE: ${HMILY_REGISTRY_TYPE}
      HMILY_CONFIG_TYPE: ${HMILY_CONFIG_TYPE}
    ports:
      - "8082:8080"
    volumes:
      - ./config:/app/config
    networks:
      - hmily-network
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:8080/actuator/health"]
      interval: 10s
      timeout: 5s
      retries: 5

  # 监控服务
  prometheus:
    image: prom/prometheus:v2.35.0
    container_name: hmily-prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    networks:
      - hmily-network

  grafana:
    image: grafana/grafana:8.4.6
    container_name: hmily-grafana
    restart: always
    depends_on:
      - prometheus
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
    networks:
      - hmily-network

networks:  
  hmily-network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16

volumes:
  mysql-data:
  redis-data:
  zookeeper-data:
  zookeeper-datalog:
  etcd-data:
  prometheus-data:
  grafana-data:
.env环境变量配置
# MySQL配置
MYSQL_ROOT_PASSWORD=hmily@2023
HMILY_DB_NAME=hmily_transaction
HMILY_DB_USER=hmily_user
HMILY_DB_PASSWORD=hmily_pass123

# Redis配置
REDIS_PASSWORD=redis@hmily

# Hmily核心配置
HMILY_REGISTRY_TYPE=zookeeper
HMILY_CONFIG_TYPE=etcd
SPRING_PROFILES_ACTIVE=prod

# 服务端口配置
ORDER_SERVICE_PORT=8080
ACCOUNT_SERVICE_PORT=8081
INVENTORY_SERVICE_PORT=8082
Hmily核心配置 (config/hmily.yml)
hmily:
  service:
    appName: hmily-transaction
    port: 8888
    
  # 事务存储配置
  repository:
    database:
      driverClassName: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://hmily-mysql:3306/hmily?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
      username: ${HMILY_DB_USER}
      password: ${HMILY_DB_PASSWORD}
      pool:
        maxActive: 20
        minIdle: 10
        connectionTimeout: 30000
        idleTimeout: 600000
        
  # 序列化配置
  serializer:
    type: kryo
    
  # 协调配置
  coordinator:
    recoverDelayTime: 60
    retryMax: ${RETRY_MAX:3}
    scheduledDelay: ${SCHEDULED_DELAY:120}
    scheduledThreadMax: ${SCHEDULED_THREAD_MAX:10}
    
  # 日志配置
  log:
    enabled: true
    level: INFO
    
  # 监控配置
  metrics:
    enabled: true
    type: prometheus

应用服务Dockerfile

以订单服务为例,创建自定义Dockerfile:

FROM openjdk:8-jre-slim

WORKDIR /app

# 添加应用JAR包
COPY target/hmily-order-service.jar app.jar

# 添加配置文件
COPY config /app/config

# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# JVM参数优化
ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

EXPOSE 8080

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar --spring.config.location=file:/app/config/"]

数据库初始化脚本

创建sql/init.sql文件,包含Hmily运行所需的表结构和测试数据:

-- 创建事务日志表
CREATE TABLE IF NOT EXISTS hmily_transaction (
  id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  trans_id VARCHAR(64) NOT NULL COMMENT '事务ID',
  status TINYINT NOT NULL COMMENT '事务状态: 0-尝试中,1-确认中,2-已确认,3-取消中,4-已取消',
  app_name VARCHAR(128) NOT NULL COMMENT '应用名称',
  service_name VARCHAR(128) NOT NULL COMMENT '服务名称',
  method_name VARCHAR(128) NOT NULL COMMENT '方法名称',
  create_time DATETIME NOT NULL COMMENT '创建时间',
  update_time DATETIME NOT NULL COMMENT '更新时间',
  PRIMARY KEY (id),
  UNIQUE KEY uk_trans_id (trans_id),
  KEY idx_create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Hmily事务主表';

-- 创建分支事务表
CREATE TABLE IF NOT EXISTS hmily_participant (
  id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  trans_id VARCHAR(64) NOT NULL COMMENT '事务ID',
  branch_id VARCHAR(64) NOT NULL COMMENT '分支事务ID',
  type TINYINT NOT NULL COMMENT '事务类型: 1-TCC,2-TAC,3-XA',
  status TINYINT NOT NULL COMMENT '状态: 0-尝试中,1-确认中,2-已确认,3-取消中,4-已取消',
  confirm_method VARCHAR(255) NOT NULL COMMENT '确认方法',
  cancel_method VARCHAR(255) NOT NULL COMMENT '取消方法',
  create_time DATETIME NOT NULL COMMENT '创建时间',
  update_time DATETIME NOT NULL COMMENT '更新时间',
  PRIMARY KEY (id),
  UNIQUE KEY uk_branch_id (branch_id),
  KEY idx_trans_id (trans_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Hmily分支事务表';

-- 创建业务测试表
CREATE TABLE IF NOT EXISTS account (
  id BIGINT NOT NULL AUTO_INCREMENT,
  user_id VARCHAR(64) NOT NULL COMMENT '用户ID',
  balance DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT '账户余额',
  freeze_amount DECIMAL(18,2) NOT NULL DEFAULT 0.00 COMMENT '冻结金额',
  create_time DATETIME NOT NULL,
  update_time DATETIME NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uk_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='账户表';

CREATE TABLE IF NOT EXISTS inventory (
  id BIGINT NOT NULL AUTO_INCREMENT,
  product_id VARCHAR(64) NOT NULL COMMENT '商品ID',
  total_inventory INT NOT NULL DEFAULT 0 COMMENT '总库存',
  lock_inventory INT NOT NULL DEFAULT 0 COMMENT '锁定库存',
  create_time DATETIME NOT NULL,
  update_time DATETIME NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uk_product_id (product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='库存表';

CREATE TABLE IF NOT EXISTS `order` (
  id BIGINT NOT NULL AUTO_INCREMENT,
  order_no VARCHAR(64) NOT NULL COMMENT '订单号',
  user_id VARCHAR(64) NOT NULL COMMENT '用户ID',
  product_id VARCHAR(64) NOT NULL COMMENT '商品ID',
  amount DECIMAL(18,2) NOT NULL COMMENT '订单金额',
  count INT NOT NULL COMMENT '购买数量',
  status TINYINT NOT NULL COMMENT '订单状态: 0-创建,1-支付中,2-成功,3-失败,4-取消',
  create_time DATETIME NOT NULL,
  update_time DATETIME NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uk_order_no (order_no)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

-- 插入测试数据
INSERT INTO account (user_id, balance, freeze_amount, create_time, update_time) 
VALUES ('user_001', 10000.00, 0.00, NOW(), NOW());

INSERT INTO inventory (product_id, total_inventory, lock_inventory, create_time, update_time)
VALUES ('product_001', 500, 0, NOW(), NOW());

服务构建与启动流程

1. 构建自定义镜像

为每个微服务编写构建脚本build-services.sh

#!/bin/bash
set -e

# 克隆代码仓库
if [ ! -d "hmily-src" ]; then
    git clone https://gitcode.com/gh_mirrors/hm/hmily.git hmily-src
fi

cd hmily-src

# 编译项目
mvn clean package -DskipTests -P docker

# 复制jar包到Docker构建目录
cp hmily-demo/hmily-demo-tcc/hmily-demo-tcc-dubbo/hmily-demo-tcc-dubbo-order/target/*.jar ../docker/order/
cp hmily-demo/hmily-demo-tcc/hmily-demo-tcc-dubbo/hmily-demo-tcc-dubbo-account/target/*.jar ../docker/account/
cp hmily-demo/hmily-demo-tcc/hmily-demo-tcc-dubbo/hmily-demo-tcc-dubbo-inventory/target/*.jar ../docker/inventory/

cd ..

# 构建Docker镜像
docker-compose build

2. 启动服务集群

# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f --tail=100

3. 验证服务可用性

创建服务验证脚本verify-services.sh

#!/bin/bash
set -e

# 检查订单服务
ORDER_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/actuator/health)
if [ "$ORDER_STATUS" -ne 200 ]; then
    echo "订单服务启动失败,HTTP状态码: $ORDER_STATUS"
    exit 1
fi

# 检查账户服务
ACCOUNT_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8081/actuator/health)
if [ "$ACCOUNT_STATUS" -ne 200 ]; then
    echo "账户服务启动失败,HTTP状态码: $ACCOUNT_STATUS"
    exit 1
fi

# 检查库存服务
INVENTORY_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8082/actuator/health)
if [ "$INVENTORY_STATUS" -ne 200 ]; then
    echo "库存服务启动失败,HTTP状态码: $INVENTORY_STATUS"
    exit 1
fi

# 测试分布式事务
TEST_RESULT=$(curl -s "http://localhost:8080/orderPay?count=1&amount=100")
echo "分布式事务测试结果: $TEST_RESULT"

if echo "$TEST_RESULT" | grep -q "success"; then
    echo "Hmily容器化环境部署成功!"
else
    echo "分布式事务测试失败,请检查服务日志"
    exit 1
fi

执行脚本验证服务是否正常工作:chmod +x verify-services.sh && ./verify-services.sh

多模式部署方案

TCC模式配置

TCC模式需要在业务代码中实现Try/Confirm/Cancel三个方法,在Docker环境中只需修改配置文件启用TCC模式:

# config/order.yml
hmily:
  tcc:
    enabled: true
    retryMax: 3
    retryDelay: 1000

TAC模式配置

TAC模式通过解析SQL自动生成回滚语句,配置如下:

# config/account.yml
hmily:
  tac:
    enabled: true
    sqlParse:
      type: shardingsphere
    dbType: mysql

XA模式配置

XA模式依赖数据库对XA协议的支持,配置如下:

# config/inventory.yml
hmily:
  xa:
    enabled: true
    transactionManager: jotm
    recoverDelay: 10000

监控与运维

Prometheus监控配置

创建prometheus/prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'hmily-services'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['hmily-order:8080', 'hmily-account:8080', 'hmily-inventory:8080']

Grafana仪表盘导入

  1. 访问Grafana控制台:http://localhost:3000 (默认账号: admin/admin)
  2. 导入Hmily专用仪表盘JSON(可从项目仓库获取)
  3. 设置Prometheus数据源,地址为:http://hmily-prometheus:9090

性能测试脚本

创建TCC模式性能测试脚本performance-test.sh

#!/bin/bash
# 测试1000笔分布式事务的响应时间与成功率

RESULT_FILE="performance-result-$(date +%Y%m%d%H%M%S).txt"
SUCCESS_COUNT=0
FAIL_COUNT=0
TOTAL_TIME=0

echo "开始性能测试,共1000笔交易..." > $RESULT_FILE
echo "测试时间: $(date)" >> $RESULT_FILE

for i in {1..1000}; do
    START_TIME=$(date +%s%3N)
    RESPONSE=$(curl -s "http://localhost:8080/orderPay?count=1&amount=100")
    END_TIME=$(date +%s%3N)
    DURATION=$((END_TIME - START_TIME))
    TOTAL_TIME=$((TOTAL_TIME + DURATION))
    
    if echo "$RESPONSE" | grep -q "success"; then
        SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
        echo "第$i笔交易成功,耗时: ${DURATION}ms"
    else
        FAIL_COUNT=$((FAIL_COUNT + 1))
        echo "第$i笔交易失败,响应: $RESPONSE" >> $RESULT_FILE
    fi
    
    # 每100笔交易休息1秒,避免系统过载
    if ((i % 100 == 0)); then
        sleep 1
    fi
done

AVG_TIME=$((TOTAL_TIME / 1000))
SUCCESS_RATE=$(echo "scale=2; $SUCCESS_COUNT / 10" | bc)

echo "测试完成: $(date)" >> $RESULT_FILE
echo "总交易数: 1000" >> $RESULT_FILE
echo "成功数: $SUCCESS_COUNT" >> $RESULT_FILE
echo "失败数: $FAIL_COUNT" >> $RESULT_FILE
echo "成功率: ${SUCCESS_RATE}%" >> $RESULT_FILE
echo "总耗时: ${TOTAL_TIME}ms" >> $RESULT_FILE
echo "平均响应时间: ${AVG_TIME}ms" >> $RESULT_FILE

echo "性能测试完成,结果已保存至$RESULT_FILE"

生产环境部署注意事项

容器资源限制

在生产环境中,建议为每个容器添加资源限制,避免资源争抢:

# 在docker-compose.yml的每个service下添加
deploy:
  resources:
    limits:
      cpus: '2'
      memory: 4G
    reservations:
      cpus: '1'
      memory: 2G

数据备份策略

创建数据库备份脚本backup-db.sh

#!/bin/bash
# 每日凌晨3点备份Hmily事务数据库

BACKUP_DIR="/backup/hmily-db"
TIMESTAMP=$(date +%Y%m%d%H%M%S)
FILENAME="hmily-backup-${TIMESTAMP}.sql.gz"

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行备份
docker exec hmily-mysql mysqldump -u$HMILY_DB_USER -p$HMILY_DB_PASSWORD --databases $HMILY_DB_NAME | gzip > $BACKUP_DIR/$FILENAME

# 保留最近30天的备份
find $BACKUP_DIR -name "hmily-backup-*.sql.gz" -type f -mtime +30 -delete

echo "数据库备份完成: $BACKUP_DIR/$FILENAME"

高可用部署方案

对于生产环境,建议采用以下高可用策略:

  1. 多节点部署:每个服务至少部署2个实例,避免单点故障
  2. 数据库主从:配置MySQL主从复制,实现读写分离
  3. 注册中心集群:ZooKeeper/Eureka部署3节点集群
  4. 配置中心高可用:etcd集群部署3节点
  5. 负载均衡:在服务前端添加Nginx负载均衡
  6. 容器编排:生产环境建议使用Kubernetes替代Docker Compose

常见问题解决方案

问题1:事务回滚失败

症状:部分分布式事务在异常情况下无法自动回滚

解决方案

  1. 检查数据库连接池配置,确保有足够连接:
hmily:
  repository:
    database:
      pool:
        maxActive: 50
        minIdle: 20
  1. 调整事务恢复调度参数:
hmily:
  coordinator:
    recoverDelayTime: 30
    scheduledDelay: 60

问题2:性能瓶颈

症状:高并发场景下事务响应时间过长

解决方案

  1. 启用异步日志存储:
hmily:
  repository:
    async: true
  1. 调整JVM参数,增加堆内存:
JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=100"

问题3:服务间通信超时

症状:RPC调用经常超时,导致事务重试

解决方案

  1. 增加RPC超时配置:
dubbo:
  consumer:
    timeout: 3000
  1. 检查网络配置,确保容器间网络通畅:
docker network inspect hmily-network

总结与展望

本文详细介绍了Hmily分布式事务框架的Docker Compose一键部署方案,通过容器化技术解决了传统部署方式中的环境依赖复杂、配置繁琐和一致性难以保证等问题。该方案支持TCC/TAC/XA三种事务模式,提供了完整的监控、测试和运维工具链,可直接用于开发、测试和生产环境。

未来优化方向:

  1. 集成Service Mesh,实现更细粒度的流量控制
  2. 引入混沌工程测试,提升系统容错能力
  3. 开发自动化运维平台,简化多环境管理
  4. 优化事务存储引擎,提升高并发场景下的性能

通过本文提供的方案,你可以快速搭建稳定、高效的分布式事务环境,专注于业务逻辑开发而非基础设施配置。如有任何问题或优化建议,欢迎提交Issue或Pull Request参与项目贡献。

收藏本文,关注项目仓库获取最新部署方案,下期将带来《Hmily与Seata性能对比测试》,敬请期待!

【免费下载链接】hmily Distributed transaction solutions 【免费下载链接】hmily 项目地址: https://gitcode.com/gh_mirrors/hm/hmily

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值