Skip to content

virgo 服务端部署手册

1 部署步骤

1.1 安装准备

Virgo 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 Virgo 中使用了 JDK8 中的一些特性,所以要求必须在 JDK8 以上的版本上运行。

1.2 解压 tm 安装包

将 Virgo Server 的安装包解压到规划的目录下,解压后的目录如下所示:

virgo-tm
├-- bin 此目录下为可执行脚本,用于 server 的启停
├-- conf 此目录下为所有配置文件 (从3.3.0版本开始 virgo-tm 采用 yaml替代 properties文件)
|   ├-- application.yml 核心配置参数
|   ├-- application-dev.yml 各环境配置
|   └-- logback.xml 日志配置
├-- lib 所有依赖的 jar 包
└-- db 数据库脚本,用于初始化数据库
    └-- tables
        ├-- oracel Oracle 数据库安装脚本
        └-- mysql MySQL 数据库安装脚本

1.3 初始化数据库

  1. 根据数据库类型在 db 目录中找到对应的安装脚本并执行,执行成功后数据库中应该会新建以下表:
virgo_trunk_info
virgo_branch_info
cluster_node
cluster_election
  1. 根据数据库类型寻找对应的 jdbc 驱动,将驱动放入 lib 目录下。如果 lib 目录中已有对应的驱动,此步骤可省。

1.4 初始化配置

配置 conf/application.yml

yaml
servicename: virgo-tm
server:
  port: 8888
spring:
  application: ${servicename}
  profiles:
    active: dev

修改 conf/application-dev.yml datasource 下的数据库连接、用户名及密码相关配置:

yaml
trx:
  default-max-timeout: 86400000

transport:
  threads: 32
  ioThreads: 10
  bufferQueue: -1
  keepAliveTime: 0
  idleTimeout: 180000

cluster:
  enable: false
  shutdown:
    timeout: 10
    wait: 1
  discovery:
    type: jdbc
    jdbc:
      dataSource: tm1
      lease: 30000
      renewalInternal: 10000
      renewalInternalWhenFaild: 5000
  election:
    enable: false
    type: jdbc
    jdbc:
      dataSource: tm1
      lease: 30000
      renewalInternal: 10000
      renewalInternalWhenFaild: 5000

monitor:
  enable: true
  trxSize: 1000

recovery:
  enable: true
  internal: 10000
  threads: 4

# storage
log:
  active: single
  single:
    storage: jdbc # jdbc/memory/dc/shard
    jdbc: tm1
  shard:
    storage: shard
    shard:
      - jdbc1
      - jdbc2
  shard1:
    storage: jdbc
    jdbc: tm1
  shard2:
    storage: jdbc
    jdbc: tm2
  mem:
    storage: memory
  dc4:
    storage: dc
    dc:
      mydc: dc01
      dc01: shard1
      dc02: shard2

datasource:
  tm1: # 数据源ID,由使用者决定名称。如果需要修改,那么当前配置文件中其它使用此数据源的地方需要一起更改。
    type: druid  # 目前仅支持druid配置数据库
    druid:
      url: jdbc:mysql://192.168.244.20:3306/dev_virgo?useSSL=false
      username: root
      password: ENC(5e05001dca8c463ee9206019cd003a42)
      initialSize: 1
      minIdle: 1
      testOnBorrow: true
      testOnReturn: false
      testWhileIdle: true
  tm2:
    type: druid
    druid:
      url: jdbc:mysql://192.168.244.20:3306/dev_virgo?useSSL=false
      username: root
      password: ENC(5e05001dca8c463ee9206019cd003a42)
      initialSize: 1
      minIdle: 1
      testOnBorrow: true
      testOnReturn: false
      testWhileIdle: true
#密码加解密
jasypt:
  encryptor:
    bean: sm4ECBJasypt
    ecb:
      secretKey: 68bb4598e375455b87cfd09e26d061f4
#逻辑单元
unit:
  logicUnitId: unit01   # 逻辑单元,单元化后客户端会优先选择本单元服务端,可选配置项
  logicUnitRouter: default # 动态单元标识获取扩展,无需扩展时,此项配置可删除

1.4.1 (可选) 修改监听端口

默认情况下, tm 监听 8888 端口,如果需要,可以通过修改上述 conf/application-dev.ymlserver.port 属性来变更监听的端口。

TM所有配置文件的详解见第 5 节

1.5 启动

配置完成后,可以执行 bin/start.sh(linux) 或 bin/start.bat(win) 启动,如果在 linux 中部署,可以在 logs 目录下找到对应的日志文件。

2 配置详解

2.1 服务端配置

配置项含义如下:

yaml
server:
  port: 8888                    # 监听端口,默认值: 8888
# host: 127.0.0.1               # TM IP地址,默认情况无需配置

trx:
  default-max-timeout: 86400000 # 默认最大事务超时时长,单位毫秒,默认值: 24小时
  blocking-for-completion: false #是否同步等待事务第二阶段完成后响应客户端,为 fasle 时,更新主事务状态后立即返回,默认值:false

security:
  # 客户端 token 校验服务地址,若设置该值,则客户端连接时必须上送认证信息,否则允许所有客户端连接,默认值:null
  token-info-uri: http://192.168.233.20:8189/oms/uaa/oauth/check_token

transport:
  threads: 8                    # 第二阶段处理的线程池大小,默认值:200
  bufferQueue: 1000             # 线程池工作队列大小,默认值:-1
  keepAliveTime: 300            # 线程池存活时间,单位秒,默认值:0
  idleTimeout: 3000             # 连接空闲超时时间,单位毫秒,默认值:180000

cluster:
  enable: false                 # 是否开启集群,默认值:false
  discovery:
    type: jdbc                  # 目前仅支持jdbc方式服务注册发现
    jdbc:
      dataSource: db1           # 数据源ID,用于集群节点注册发现
      lease: 30000              # 节点租期时长,单位毫秒,默认值:10000
      renewalInternal: 10000    # 集群节点续租间隔,单位毫秒,默认值:3333
      renewalInternalWhenFaild: 5000 # 集群节点续租失败重试间隔,单位毫秒,默认值:3333
  election:
    enable: false               # 是否开启集群事务恢复节点选主,默认值:false
    type: jdbc                  # 集群中实现选举的方式,目前仅支持jdbc选举
    jdbc:
      dataSource: db1           # 数据源ID,用于事务恢复选主
      lease: 30000              # 节点租期时长,单位毫秒,默认值:10000
      renewalInternal: 10000    # 节点续租间隔时间,单位毫秒,默认值:3333
      renewalInternalWhenFaild: 5000 # 节点续租失败后重试间隔,单位毫秒,默认值:3333

monitor:
  enable: true                  # 开启管理端监听端口,默认:true
  trxSize: 1000                 # TM 事务缓存大小。默认:0,表示不缓存事务信息

recovery:
  enable: true                  # 是否开启事务故障恢复,默认值:true
  interval: 10000               # 故障事务扫描时间,单位毫秒,默认值:60000
  threads: 4                    # 故障恢复线程数,默认值:CPU核数

clean:
  enable: true                  # 是否开启事务日志清理,默认值:true
  interval: 60000               # 事务日志清理频率,单位毫秒,默认值:1800000
  keepTime: 1800000             # 事务日志保留时间,单位毫秒,默认值:1800000
  sharedScheduler: 1            # 多个日志库共享清理线程数,默认值:1。如果配置为 0,则每个日志库开启单独的清理线程

# 事务日志持久化
log:
  active: jdbc1                 # 指定生效的日志持久化方案
  jdbc1: # 事务存储方案ID
    storage: jdbc               # 存储方式:jdbc,表示事务只存储在一个数据库中
    jdbc: db1                   # 数据源ID,存储在db1数据库
    enable-recover: true        # 是否开启事务恢复,默认:true。只有storage为jdbc或memory的存储方案有开启事务恢复的功能
  jdbc2:
    storage: jdbc
    jdbc: db2                   # 存储在 db2 数据库
  shard3:
    storage: shard              # shard分片存储,表示事务存储在配置的多个分片中
    shard: # 值的数据类型必须是数组
      - jdbc1
      - jdbc2
  memory4:
    storage: memory             # 事务存储在内存中,不可以在生产环境使用
  dc5:
    storage: dc                 # dc 表示使用双中心模式
    dc:
      mydc: dc01                # 当前中心ID
      dc01: jdbc1               # 中心dc01 采用的存储方式,中心ID可根据环境而更改
      dc02: jdbc2               # 中心dc02 采用的存储方式,中心ID可根据环境而更改

datasource:
  db1: # 数据源ID
    type: druid                 # 目前只支持 druid 数据库连接池配置
    druid:
      url: jdbc:mysql://<ip>:<port>/<virgo-tm>?useSSL=false
      username: <username>
      password: <password>
      initialSize: 1
      minIdle: 1
      testOnBorrow: true
      testOnReturn: false
      testWhileIdle: true
  db2:
    type: druid
    druid:
      url: jdbc:mysql://<ip>:<port>/<virgo-tm2>?useSSL=false
      username: <username>
      password: <password>
      initialSize: 1
      minIdle: 1
      maxActive: 100
      testOnBorrow: true
      testOnReturn: false
      testWhileIdle: true

2.2 服务端配置监听

TM集成了Apollo配置中心,支持配置修改后动态生效(依赖Apollo的配置监听功能)。**此功能目前只能用于开发测试环境,配置修改时应保证没有未结束的事务。 **

各配置项对动态修改的支持:

配置支持与否备注
server.port监听端口不可变更
server.host服务端地址不可变更
trx.default-max-timeout只在配置修改时生效。若删除该配置,此修改忽略。
transport.threads暂不支持
transport.bufferQueue暂不支持
transport.keepAliveTime暂不支持
transport.idleTimeout支持修改连接空闲时间
cluster.enable
cluster.discovery.type
cluster.discovery.jdbc.dataSource修改数据源时,对应的datasource下配置需要一并修改
cluster.discovery.jdbc.lease
cluster.discovery.jdbc.renewalInternal
cluster.discovery.jdbc.renewalInternalWhenFaild
cluster.election.enable暂不支持
cluster.election.type
cluster.election.jdbc.dataSource暂不支持
cluster.election.jdbc.lease
cluster.election.jdbc.renewalInternal
cluster.election.jdbc.renewalInternalWhenFaild
monitor.enable
monitor.trxSize暂不支持
recovery.enable
recovery.internal
recovery.threads暂不支持
log.active修改后存储配置动态生效
log.<anyStrategy>.storage存储方案的storage配置不可更改
log.<singleStrategy>.jdbc新增和修改数据源ID,对应的datasource下配置需要一并修改
log.<singleStrategy>.enable-recover事务恢复的开启和关闭
log.<shardStrategy>.shardshard数组支持动态修改和添加
log.<dcStrategy>.dc支持修改mydc和中心名称、各中心对应的存储策略
datasource.<dataSourceId>.type不支持修改数据库连接池
datasource.<dataSourceId>.druid.url
datasource.<dataSourceId>.druid.username
datasource.<dataSourceId>.druid.*是否支持取决于druid的配置是否支持动态修改

3 日志存储方式

3.1 jdbc配置

applicationp-dev.yml中配置:

yml
...
log:
  active: single
  single:
    storage: jdbc
    jdbc: db1
...
datasource:
  db1:
    type: druid
    druid:
      url: jdbc:mysql://<ip>:<port>/<virgo-tm>?useSSL=false
      username: <username>
      password: <password>
      ...
#单元配置
unit:
  logicUnitId: unit01   # 逻辑单元,单元化后客户端会优先选择本单元服务端,可选配置项
  logicUnitRouter: default # 动态单元标识获取扩展实现,无需扩展时,此项配置可删除

virgo-tm 使用 druid作为数据库连接池,完整配置项见 druid 官方 wiki 。部分配置如下:

属性名含义
url数据库连接地址
username用户名
password用户密码,如需加密,见使用ConfigFilter
initialSize初始连接数
maxActive最大连接数
minIdle最小空闲连接数
testOnBorrow是否在获取连接时检查连接可用性
testOnReturn是否在归还连接时检查连接可用性
testWhileIdle是否在空闲时,获取连接时检查连接可用性

3.2 分片存储配置

application-dev.yml中分片配置示例如下:

yaml
log:
  active: shard2  # 采用 shard2 存储方案
  shard2:
    storage: shard
    shard:
      - jdbc1
      - jdbc2
  jdbc1:
    storage: jdbc
    jdbc: db1
  jdbc2:
    storage: jdbc
    jdbc: db2

datasource:
  db1:
    type: druid
    druid:
      url: jdbc:mysql://<ip>:<port>/<virgo-tm>?useSSL=false
      username: <username>
      password: <password>
      ...
  db2:
    type: druid
    druid:
      url: jdbc:mysql://<ip>:<port>/<virgo-tm2>?useSSL=false
      username: <username>
      password: <password>
      ...

3.3 双中心配置

TM 如果要开启双中心模式,必须选择 storage 为 dc的储存方案,同时开启集群功能(双中心下所有节点必须使用同一个datasource用于注册发现)。 application-dev.yml中配置示例如下:

yaml
cluster:
  enable: true        # 集群功能必须开启
  discovery:
    type: jdbc
    jdbc:
      dataSource: db1

log:
  active: dc4         # 选择storage为dc的存储方案
  dc4:
    storage: dc
    dc:
      mydc: dc01
      dc01: jdbc1
      dc02: jdbc2
  jdbc1:
    storage: jdbc
    jdbc: db1
  jdbc2:
    storage: jdbc
    jdbc: db2

datasource:
  db1:
    type: druid
    druid:
      url: jdbc:mysql://<ip>:<port>/<virgo-tm>?useSSL=false
      username: <username>
      password: <password>
      ...
  db2:
    type: druid
    druid:
      url: jdbc:mysql://<ip>:<port>/<virgo-tm2>?useSSL=false
      username: <username>
      password: <password>
      ...

4 日志配置

virgo-tm 默认使用logback作为日志框架。

logback 的配置文件为 conf/logback.xml,兼容任何logback的配置方式。关于logback的配置在此不做详解。

4.1 使用其它日志框架

virgo-tm 内部使用 slf4j 作为日志编程接口,可以使用任何实现slf4j接口的日志框架替换logback

例如要切换到log4j,步骤如下:

  1. lib目录下移除logback 相关的 jar 包,并加入 slf4j-log4j12log4jlog4j2的jar包
  2. conf目录添加log4j配置文件

5 其它数据库支持

安装包中提供了几种常用数据库的脚本及驱动,如果要使用其它类型的数据库。需要在数据库自行建立 virgo相关的表以及提供相应的驱动。

5.1 virgo_trunk_info

属性名建议类型Java 类型约束
XIDVARCHAR(50)String主键
STATUSVARCHAR(20)String不为 null
GMT_CREATETIMESTAMP(3)Timestamp不为 null
GMT_MODIFIEDTIMESTAMP(3)Timestamp不为 null
GMT_TIMEOUTTIMESTAMP(3)Timestamp不为 null
TIMEOUTintint不为 null
RETRYintint
GLOBAL_TRACE_IDVARCHAR(50)String
SUB_TRACE_IDVARCHAR(50)String
MANUALsmallintint不为null,默认值是0
LOGIC_UNIT_IDVARCHAR(50)String单元中心标识

5.2 virgo_branch_info

属性名建议类型Java 类型约束
XIDVARCHAR(50)String主键, 非唯一索引
BXIDVARCHAR(50)String主键
RESOURCE_NAMEVARCHAR(100)String不为 null
STATUSVARCHAR(20)String不为 null
BRANCH_ORDERintint
DATA_CENTERVARCHAR(50)String
ADDITIONAL_DATATEXTString
GMT_CREATETIMESTAMP(3)Timestamp不为 null
GMT_MODIFIEDTIMESTAMP(3)Timestamp不为 null
SUB_TRACE_IDVARCHAR(50)String
MANUALsmallintint不为null,默认值是0
LOGIC_UNIT_IDvarchar(50)String单元中心标识

提示

如果所使用的数据库无对应的类型,可以使用相近、可被驱动映射为对应Java 类型的数据类型

5.3 cluster_node

属性名建议类型Java 类型约束
HOSTNAMEVARCHAR(100)String主键,非唯一索引
PORTINT(11)int主键
RENEWAL_TIMESTAMPTIMESTAMP(6)Timestamp不为null
LEASEINT(11)int不为null

5.4 cluster_election

属性名建议类型Java 类型约束
IDVARCHAR(100)String主键,非唯一索引
LEADER_IDVARCHAR(100)int不为null
PRIORITYINT(11)int不为null
LEASE_TIMEINT(11)int不为null
RENEWAL_TIMESTAMPTIMESTAMP(3)Timestamp不为null

5.5 使用其它版本的驱动

安装包中提供的数据库驱动可能与您目前使用的数据版本不符,这种情况下,需要您手动查找对应的jdbc驱动并将其放入lib目录下。