前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Seata 番外篇:使用 docker-compose 部署 Seata Server 及 K8S 部署 Seata 高可用

Seata 番外篇:使用 docker-compose 部署 Seata Server 及 K8S 部署 Seata 高可用

作者头像
行百里er
发布2023-09-01 11:27:17
9180
发布2023-09-01 11:27:17
举报
文章被收录于专栏:JavaJourneyJavaJourney

本文没有任何理论知识,纯操作步骤,包含以下内容:

  • 使用 docker-compose 部署 Seata Server 单节点
  • 使用 docker-compose 部署一台主机多个实例的 Seata Server 集群
  • 使用 Kubernetes 部署多主机的 Seata Server 集群

涉及到的软件版本:

软件名称

版本号

Docker

20.10.17

Docker Compose

v2.10.0

Rancher

v2.5.2

Kubernetes

v1.19

Seata

1.4.2

Nacos

2.0.3

MySQL

8.0.29

「Tip:」 本文安装的 Seata Server 是以 Nacos 为注册中心,DB 为数据存储的模式。

按照本文的安装步骤安装,你大概率不会踩坑,因为坑已经被我踩过了:)

Docker 容器和外界网络连通性问题

为了防止 Docker 容器和外界网络无法连通,需要开启 IP 转发功能,步骤如下:

「1,」 Linux系统缺省并没有打开IP转发功能,用如下命令确认IP转发功能的状态:

代码语言:javascript
复制
cat /proc/sys/net/ipv4/ip_forward

「2,」 如果发现该值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开。打开IP转发功能命令:

代码语言:javascript
复制
echo 1 > /proc/sys/net/ipv4/ip_forward

「3,」 使配置生效

代码语言:javascript
复制
sysctl -p /etc/sysctl.conf

「4,」 重启网络 & Docker

代码语言:javascript
复制
systemctl restart network && systemctl restart docker

「Tip:」 如果不开启 ip_forward ,后面使用 Docker 安装 Seata Server 的时候,可能会因为连接不上 Nacos 而启动 Seata 失败。

使用 Docker Compose 部署 Seata Server 单节点

「1,」 在 MySQL 中,创建 seata-server 数据库,并创建表:

代码语言:javascript
复制
-- 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 = InnoDB
  DEFAULT 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 = InnoDB
  DEFAULT 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 = InnoDB
  DEFAULT 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 = InnoDB
  DEFAULT 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);

seata-server数据库

「2,」 在 Nacos 配置中心,创建一个命名空间,名为 distributed-transaction

新建命名空间

命名空间id

命名空间名称没有要求,根据实际情况命名即可。

「3,」 在上一步的命名空间中,新建一个配置文件,dataId 为 seataServer.properties

新建配置文件

文件 seataServer.properties 内容为:

代码语言:javascript
复制
service.vgroupMapping.default_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://192.168.242.112:3306/seata-server?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
store.db.user=zhangsan
store.db.password=Fawai@kuangtu6

「4,」 创建目录 /usr/local/seata/seata-config ,并在该目录下创建 registry.conf 文件:

代码语言:javascript
复制
registry {
  type = "nacos"
  
  nacos {
    application = "seata-server"
    serverAddr = "192.168.242.112:81"
    namespace = "5a4e4c1f-beda-4ae5-a3d7-428950e7473b"
    group = "SEATA_GROUP"
    cluster = "default"
    username = "nacos"
    password = "nacos123"
  }
}

config {
  type = "nacos"
  
  nacos {
    serverAddr = "192.168.242.112:81"
    namespace = "5a4e4c1f-beda-4ae5-a3d7-428950e7473b"
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos123"
    dataId: "seataServer.properties"
  }
}

「5,」usr/local/seata 目录下创建 docker-compose.yml 文件,内容为:

代码语言:javascript
复制
version: "3"
services:
  seata-server:
    image: seataio/seata-server:1.4.2
    ports:
      - "8091:8091"
    environment:
      - SEATA_PORT=8091  
      - SEATA_IP=192.168.242.16
    volumes:
      - "./seata-config/registry.conf:/seata-server/resources/registry.conf"
    expose:
      - 8091
    container_name: seata-server

「6,」/usr/local/seata 目录下,执行如下命令启动:

代码语言:javascript
复制
docker-compose up

前面都准备好以后,只需要 docker-compose up -d-d 表示后台启动)这样一个命令就启动了 「Seata Server」 了:

Seata Server 启动成功

来看一下 「Nacos」 中有没有:

在 Nacos 中查看

OK,服务有了,我们可以点击详情进去看一下:

详情

使用 Docker Compose 部署 Seata Server 单机多实例集群

有了单节点部署的经验,部署单机多实例就很容易了,只需要修改一下 docker-compose.yml 文件,多加几个服务即可,这里以配置三个实例为例:

代码语言:javascript
复制
version: "3"
services:
  seata-server-1:
    image: seataio/seata-server:1.4.2
    hostname: seata-server
    ports:
      - "8091:8091"
    environment:
      - SEATA_PORT=8091
      - SEATA_IP=192.168.242.16
      - SEATA_CONFIG_NAME=file:/seata-server/resources/registry.conf
    volumes:
      - "./seata-config/registry.conf:/seata-server/resources/registry.conf"
  seata-server-2:
    image: seataio/seata-server:1.4.2
    hostname: seata-server
    ports:
      - "8092:8092"
    environment:
      - SEATA_PORT=8092
      - SEATA_IP=192.168.242.16
      - SEATA_CONFIG_NAME=file:/seata-server/resources/registry.conf
    volumes:
      - "./seata-config/registry.conf:/seata-server/resources/registry.conf"
  seata-server-3:
    image: seataio/seata-server:1.4.2
    hostname: seata-server
    ports:
      - "8093:8093"
    environment:
      - SEATA_PORT=8093
      - SEATA_IP=192.168.242.16
      - SEATA_CONFIG_NAME=file:/seata-server/resources/registry.conf
    volumes:
      - "./seata-config/registry.conf:/seata-server/resources/registry.conf"

当然了,各个文件的路径还是不能有差错的,目录结构如下:

docker-compose 文件目录结果

最后,还是在 /usr/local/seata 目录下,执行 docker-compose up

启动成功

再来看一下注册到 「Nacos」 中的 「Seata Server」 集群:

Nacos 中查看

Nacos 中查看集群

使用 K8S 快速部署 Seata Server 高可用集群

使用 K8S 部署 「Seata Server」 高可用集群非常简单,如果你的 K8S 是使用 「Rancher」 来部署的,那么在 「Rancher」 上使用 K8S 来部署应用将会简单乘以2,快乐加倍!

「Rancher」 的使用请看我的另一篇文章:使用Rancher部署管理K8S集群,真香!

下面我来演示一下在 「Rancher」 上如何快速部署 「Seata Server」,首先,准备一下需要的的 yaml 文件,内容如下:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: seata-ha-server
  namespace: default
  labels:
    app.kubernetes.io/name: seata-ha-server
spec:
  type: ClusterIP
  ports:
    - port: 8091
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: seata-ha-server

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: seata-ha-server
  namespace: default
  labels:
    app.kubernetes.io/name: seata-ha-server
spec:
  replicas: 3
  selector:
    matchLabels:
      app.kubernetes.io/name: seata-ha-server
  template:
    metadata:
      labels:
        app.kubernetes.io/name: seata-ha-server
    spec:
      containers:
        - name: seata-ha-server
          image: docker.io/seataio/seata-server:1.4.2
          imagePullPolicy: IfNotPresent
          env:
            - name: SEATA_CONFIG_NAME
              value: file:/root/seata-config/registry
            - name: SEATA_IP
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: status.hostIP
          ports:
            - name: http
              containerPort: 8091
              protocol: TCP
          volumeMounts:
            - name: seata-config
              mountPath: /root/seata-config
      volumes:
        - name: seata-config
          configMap:
            name: seata-ha-server-config


---
apiVersion: v1
kind: ConfigMap
metadata:
  name: seata-ha-server-config
data:
  registry.conf: |
    registry {
        type = "nacos"
        nacos {
          application = "seata-server"
          serverAddr = "192.168.242.112:81"
          namespace = "5a4e4c1f-beda-4ae5-a3d7-428950e7473b"
          group = "SEATA_GROUP"
          cluster = "default"
          username = "nacos"
          password = "nacos123"
        }
    }
    config {
      type = "nacos"
      nacos {
        serverAddr = "192.168.242.112:81"
        namespace = "5a4e4c1f-beda-4ae5-a3d7-428950e7473b"
        group = "SEATA_GROUP"
        username = "nacos"
        password = "nacos123"
        dataId: "seataServer.properties"
      }
    }

这里需要将 「注册中心」「配置中心」 改成自己的 「Nacos」 信息。

然后在 「Rancher」 面板上点击 导入 YAML

Rancher

将我们之前准备的内容复制进来:

Rancher操作

点击 导入 按钮后,「Seata Server」 集群将以不可思议的速度创建起来了:

Seata Server启动

我们再看看 「Nacos」 注册中心中有没有 Seata Server 集群服务:

Nacos 中查看

那必须有啊,我用 「Rancher」 通过 K8S 部署服务没有失手过,哈哈!点击详情看一下集群信息:

查看集群详情

完美!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 行百里er 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Docker 容器和外界网络连通性问题
  • 使用 Docker Compose 部署 Seata Server 单节点
  • 使用 Docker Compose 部署 Seata Server 单机多实例集群
  • 使用 K8S 快速部署 Seata Server 高可用集群
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档