Appearance
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 初始化数据库
- 根据数据库类型在 db 目录中找到对应的安装脚本并执行,执行成功后数据库中应该会新建以下表:
virgo_trunk_info
virgo_branch_info
cluster_node
cluster_election
- 根据数据库类型寻找对应的 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.yml
的 server.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>.shard | 是 | shard数组支持动态修改和添加 |
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
,步骤如下:
- 从
lib
目录下移除logback
相关的 jar 包,并加入slf4j-log4j12
及log4j
或log4j2
的jar包 conf
目录添加log4j
配置文件
5 其它数据库支持
安装包中提供了几种常用数据库的脚本及驱动,如果要使用其它类型的数据库。需要在数据库自行建立 virgo
相关的表以及提供相应的驱动。
5.1 virgo_trunk_info
属性名 | 建议类型 | Java 类型 | 约束 |
---|---|---|---|
XID | VARCHAR(50) | String | 主键 |
STATUS | VARCHAR(20) | String | 不为 null |
GMT_CREATE | TIMESTAMP(3) | Timestamp | 不为 null |
GMT_MODIFIED | TIMESTAMP(3) | Timestamp | 不为 null |
GMT_TIMEOUT | TIMESTAMP(3) | Timestamp | 不为 null |
TIMEOUT | int | int | 不为 null |
RETRY | int | int | |
GLOBAL_TRACE_ID | VARCHAR(50) | String | |
SUB_TRACE_ID | VARCHAR(50) | String | |
MANUAL | smallint | int | 不为null,默认值是0 |
LOGIC_UNIT_ID | VARCHAR(50) | String | 单元中心标识 |
5.2 virgo_branch_info
属性名 | 建议类型 | Java 类型 | 约束 |
---|---|---|---|
XID | VARCHAR(50) | String | 主键, 非唯一索引 |
BXID | VARCHAR(50) | String | 主键 |
RESOURCE_NAME | VARCHAR(100) | String | 不为 null |
STATUS | VARCHAR(20) | String | 不为 null |
BRANCH_ORDER | int | int | |
DATA_CENTER | VARCHAR(50) | String | |
ADDITIONAL_DATA | TEXT | String | |
GMT_CREATE | TIMESTAMP(3) | Timestamp | 不为 null |
GMT_MODIFIED | TIMESTAMP(3) | Timestamp | 不为 null |
SUB_TRACE_ID | VARCHAR(50) | String | |
MANUAL | smallint | int | 不为null,默认值是0 |
LOGIC_UNIT_ID | varchar(50) | String | 单元中心标识 |
提示
如果所使用的数据库无对应的类型,可以使用相近、可被驱动映射为对应Java 类型
的数据类型
5.3 cluster_node
属性名 | 建议类型 | Java 类型 | 约束 |
---|---|---|---|
HOSTNAME | VARCHAR(100) | String | 主键,非唯一索引 |
PORT | INT(11) | int | 主键 |
RENEWAL_TIMESTAMP | TIMESTAMP(6) | Timestamp | 不为null |
LEASE | INT(11) | int | 不为null |
5.4 cluster_election
属性名 | 建议类型 | Java 类型 | 约束 |
---|---|---|---|
ID | VARCHAR(100) | String | 主键,非唯一索引 |
LEADER_ID | VARCHAR(100) | int | 不为null |
PRIORITY | INT(11) | int | 不为null |
LEASE_TIME | INT(11) | int | 不为null |
RENEWAL_TIMESTAMP | TIMESTAMP(3) | Timestamp | 不为null |
5.5 使用其它版本的驱动
安装包中提供的数据库驱动可能与您目前使用的数据版本不符,这种情况下,需要您手动查找对应的jdbc
驱动并将其放入lib
目录下。