Kubernetes에서 Seata 고가용성 배포 및 구성

1. Seata 데이터베이스 초기화

curl -o mysql.sql https://raw.githubusercontent.com/apache/incubator-seata/1.3.0/script/server/db/mysql.sql
mysql -h rm-uf6ivpxt4j5rrpqal.mysql.rds.aliyuncs.com -uroot -p

CREATE DATABASE IF NOT EXISTS seata_config DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
USE seata_config;
SOURCE /root/mysql.sql;

CREATE USER 'seata_user'@'%' IDENTIFIED BY 'MXl#GX8hw0wEv!ID';
GRANT ALL PRIVILEGES ON seata_config.* TO 'seata_user'@'%';
FLUSH PRIVILEGES;
EXIT;

2. Seata 서버 배포 및 설정

wget https://github.com/apache/incubator-seata/releases/download/v1.3.0/seata-server-1.3.0.tar.gz
tar -xzf seata-server-1.3.0.tar.gz -C /usr/local/
cd /usr/local/seata/conf/

cp registry.conf registry.conf.bak
cp file.conf.example file.conf

vim file.conf
store {
  mode = "db"

  db {
    datasource = "druid"
    dbType = "mysql"
    driverClassName = "com.mysql.cj.jdbc.Driver"
    url = "jdbc:mysql://rm-xxxxxxxxxx.mysql.rds.aliyuncs.com:3306/seata_config?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true"
    user = "seata_user"
    password = "Mxxxxxxxx!ID"
    minConn = 10
    maxConn = 50
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 200
    maxWait = 5000
  }
}

vim registry.conf
registry {
  type = "nacos"

  nacos {
    application = "seata-server"
    serverAddr = "192.168.102.8:8848"
    group = "SEATA_GROUP"
    namespace = "seata"
    cluster = "default"
    username = "nacos"
    password = "eMxxxxxxxxxJ"
  }
}

config {
  type = "nacos"

  nacos {
    serverAddr = "192.168.102.8:8848"
    namespace = "seata"
    group = "SEATA_GROUP"
    username = "nacos"
    password = "eM63S9V1QeXgLeRJ"
  }
}

3. Nacos 구성 설정 추가

git clone https://github.com/apache/incubator-seata.git -b 1.3.0
cd incubator-seata-1.3.0/script

# Nacos 콘솔에서 새 네임스페이스 생성
# 이름: seata, ID: seata, 설명: seata

unzip -q incubator-seata-1.3.0.zip
cd script/config-center

# config.txt 파일 생성 및 편집 (주석 제거)
> config.txt
vim config.txt

service.vgroupMapping.tx-group=default
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://rm-xxxxxxx.mysql.rds.aliyuncs.com:3306/seata_config?useUnicode=true&rewriteBatchedStatements=true&serverTimezone=GMT%2B8
store.db.user=seata_user
store.db.password=xxxx
store.db.minConn=10
store.db.maxConn=100
store.db.queryLimit=100
store.db.maxWait=5000
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.lockTable=lock_table
metrics.enabled=true
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

# Nacos에 구성 적용
sh nacos/nacos-config.sh -h 192.168.102.8 -p 8848 -g SEATA_GROUP -t seata -u nacos -w eM63S9V1QeXgLeRJ

4. systemd 서비스로 Seata 관리 구성

vim /etc/systemd/system/seata.service
[Unit]
Description=Seata Server Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/seata/bin/seata-server.sh -p 8091 -n 1
Restart=always

[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl start seata.service
systemctl status seata.service
systemctl enable seata.service

5. 클러스터 배포 및 검증

scp -r /usr/local/seata/ 192.168.200.102:/usr/local/
scp -r /usr/local/seata/ 192.168.200.103:/usr/local/
scp /etc/systemd/system/seata.service 192.168.200.103:/etc/systemd/system/
scp /etc/systemd/system/seata.service 192.168.200.102:/etc/systemd/system/

# 각 노드의 -n 값은 고유하게 설정 필요 (예: 1, 2 등)

6. 모니터링 통합 설정

# file.conf에 다음 항목 추가
metrics {
  enabled = true
  registryType = "compact"
  exporterList = "prometheus"
  exporterPrometheusPort = 9898
}

# Seata 1.5.0 이상에서는 application.yaml 사용 가능
seata:
  metrics:
    enabled: true
    registryType: compact
    exporterList: prometheus
    exporterPrometheusPort: 9898

# Nacos 구성 중앙에서 설정 시
# 네임스페이스: seata, dataId: metrics, group: SEATA_GROUP, 타입: Text
metrics.enabled=true
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

7. 주의사항 및 필수 절차

AT 모드 사용 시, 각 애플리케이션 데이터베이스에 아래 테이블 생성 필요:

CREATE TABLE IF NOT EXISTS `undo_log` (
   `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 'increment id',
   `branch_id` BIGINT(20) NOT NULL COMMENT 'branch transaction id',
   `xid` VARCHAR(100) NOT NULL COMMENT 'global transaction id',
   `context` VARCHAR(128) NOT NULL COMMENT 'undo_log context',
   `rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',
   `log_status` INT(11) NOT NULL COMMENT '0:normal, 1:defense',
   `log_created` DATETIME NOT NULL COMMENT 'create time',
   `log_modified` DATETIME NOT NULL COMMENT 'modify time',
   PRIMARY KEY (`id`),
   UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='AT mode undo table';

태그: seata kubernetes nacos MySQL distributed-tracing

6월 22일 21:56에 게시됨