Seata 2.x 系列【9】事务会话存储模式

news2024/11/19 16:21:05

有道无术,术尚可求,有术无道,止于术。

本系列Seata 版本 2.0.0

本系列Spring Boot 版本 3.2.0

本系列Spring Cloud 版本 2023.0.0

源码地址:https://gitee.com/pearl-organization/study-seata-demo

文章目录

    • 1. 概述
    • 2. 存储模式
      • 2.1 文件
      • 2.2 数据库
      • 2.3 Redis
      • 2.4 Raft
    • 3. 选型方案
      • 3.1 高可用
      • 3.2 一致性
      • 3.3 性能
      • 3.4 部署运维成本
      • 3.5 成熟度
      • 3.6 总结

1. 概述

TC(服务端)作为事务协调者,负责维护全局和分支事务的状态,驱动全局事务提交或回滚。在一次全局事务(分布式事务)会话中,TC需要维护一些会话数据(事务状态和记录),比如全局事务信息分支事务信息锁信息等。

TC端的作用是保证事务的二阶段被正确执行,这取决于事务记录的正确存储。为确保事务记录不丢失,需要在保持状态正确的前提下,驱动所有的RM执行正确的二阶段行为。

2. 存储模式

Seata服务端支持多种方式存储会话数据:

  • file:本地文件(不支持HA
  • db:数据库(支持HA
  • redis:缓存数据库(支持HA
  • raft:服务端Raft算法实现(支持HA

模式类型配置说明:

配置项描述备注版本说明
tore.mode存储方式filedbredisraft1.5.1 版本改用 locksession 分离存储,2.0.0 开始支持raft模式
store.lock.mode事务锁信息存储方式filedbredis,配置为空时,取 store.mode 配置项值,raft 模式不允许单独指定1.5.1 版本新增,sessionlock可分离存储
store.session.mode事务会话信息存储方式filedbredis,配置为空时,取 store.mode 配置项值,raft 模式不允许单独指定1.5.1 版本新增,sessionlock可分离存储
store.publicKeydbredis 存储密码解密公钥1.4.2 版本支持

Nacos控制台配置中心seata.properties文件中,可以看到默认使用的是file存储模式:
在这里插入图片描述

2.1 文件

file模式将会话数据存储在本地文件,以顺序写的形式将事务信息存储到本地磁盘上。为了兼顾性能,默认采用异步方式,并将事务信息存储在内存中,确保内存和磁盘上的数据一致性。当TC意外宕机时,在重新启动时会从磁盘读取事务信息并恢复到内存中,以便继续运行事务上下文。

file模式速度快,但是无法实现会话共享,所以不支持集群模式。

file模式下配置说明:

配置项描述备注
store.file.dir存储文件夹名默认 sessionStore
store.file.maxBranchSessionSize分支 session 最大字节数默认 16384(16kb),单位 byte
store.file.maxGlobalSessionSize全局 session 最大字节数默认 512b,单位 byte
store.file.fileWriteBufferCacheSize buffer 最大缓存大小默认 16384(16kb),单位 byte,写入 session 等数据量大于该值时会抛出异常
store.file.flushDiskMode刷盘策略默认 async,可选 sync
store.file.sessionReloadReadSizeServer 节点重启后从备份文件中恢复的 session lock key 上限个数默认100

配置文件内容如下:
在这里插入图片描述
可以看到,在执行全局事务后,会在seata\bin\file_store\data\8091文件夹下生成一个root.data文件:
在这里插入图片描述

2.2 数据库

db模式采用数据库存储会话信息,依赖于数据库,在数据库中进行事务信息的增删改查操作。一致性由数据库的本地事务保证,数据也由数据库负责持久化到磁盘。基于计算和存储分离的架构设计。

db模式支持mysqloracledb2sqlserversybaeeh2sqliteaccesspostgresqloceanbase等数据库。支持集群,但是需要同步数据结构,依赖数据库,性能也不太高。

将存储模式改为db
在这里插入图片描述
db模式下配置说明:

配置项描述备注
store.db.datasource数据源类型支持dbcpdruidhikari ,无默认值
store.db.dbType数据库类型mysqloracledb2sqlserversybaeeh2sqliteaccesspostgresqloceanbase,无默认值
store.db.driverClassName数据库驱动
store.db.url数据库 url在使用 mysql 作为数据源时,建议在连接参数中加上rewriteBatchedStatements=true(批量插入全局锁)
store.db.user数据库账户
store.db.password数据库账户密码
store.db.minConn数据库初始连接数默认 1
store.db.maxConn数据库最大连接数默认 20
store.db.maxWait获取连接时最大等待时间默认 5000,单位毫秒
store.db.globalTable全局事务表名 默认 global_table
store.db.branchTable分支事务表名默认 branch_table
store.db.lockTable全局锁表名 默认 lock_table
store.db.queryLimit查询全局事务一次的最大条数默认 100
store.db.distributedLockTableSever 端事务管理全局锁存储表名默认 distributed_lock,多 Sever 集群下保证同时只有一个 Sever 处理提交或回滚,1.5.1 版本新增

配置文件内容如下:
在这里插入图片描述
db模式下需要创建以下四张表:

  • global_table:全局事务表
  • branch_table:分支事务表
  • lock_table:全局锁表
  • distributed_lockSever事务管理全局锁存储表

seata\script\server\db目录提供了相关脚本:
在这里插入图片描述
官网SQL脚本没有注释,最好使用作者提供的:

-- seata_server.branch_table definition

CREATE TABLE `branch_table` (
  `branch_id` bigint NOT NULL COMMENT '分支事务ID',
  `xid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '全局事务唯一标识',
  `transaction_id` bigint DEFAULT NULL COMMENT '全局事务ID',
  `resource_group_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '资源分组ID',
  `resource_id` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '资源ID',
  `branch_type` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '事务模式',
  `status` tinyint DEFAULT NULL COMMENT '分支事务状态(io.seata.core.model.BranchStatus)',
  `client_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '客户端ID',
  `application_data` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '应用数据',
  `gmt_create` datetime(6) DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime(6) DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`branch_id`),
  KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='分支事务会话表';

-- seata_server.global_table definition

CREATE TABLE `global_table` (
  `xid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '全局事务的唯一标识(IP+事务ID)',
  `transaction_id` bigint DEFAULT NULL COMMENT '全局事务ID',
  `status` tinyint NOT NULL COMMENT '全局事务状态(io.seata.core.model.GlobalStatus)',
  `application_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '应用ID(TM服务名)',
  `transaction_service_group` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '事务分组名',
  `transaction_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '开启事务类方法',
  `timeout` int DEFAULT NULL COMMENT '超时时间',
  `begin_time` bigint DEFAULT NULL COMMENT '开始时间',
  `application_data` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '应用数据',
  `gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`xid`),
  KEY `idx_status_gmt_modified` (`status`,`gmt_modified`),
  KEY `idx_transaction_id` (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='全局事务会话表';

-- seata_server.lock_table definition

CREATE TABLE `lock_table` (
  `row_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '行键',
  `xid` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '全局事务唯一标识',
  `transaction_id` bigint DEFAULT NULL COMMENT '全局事务ID',
  `branch_id` bigint NOT NULL COMMENT '分支ID',
  `resource_id` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '资源ID',
  `table_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '表名',
  `pk` varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '主键对应的值',
  `status` tinyint NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking锁状态(0,已加锁;1,回滚中)',
  `gmt_create` datetime DEFAULT NULL COMMENT '创建时间',
  `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`row_key`),
  KEY `idx_status` (`status`),
  KEY `idx_branch_id` (`branch_id`),
  KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='全局锁信息表';

-- seata_server.distributed_lock definition

CREATE TABLE `distributed_lock` (
  `lock_key` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '锁键',
  `lock_value` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '锁值',
  `expire` bigint DEFAULT NULL COMMENT '过期时间',
  PRIMARY KEY (`lock_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Sever事务管理全局锁存储表';

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);

2.3 Redis

redis模式采用缓存数据库redis会话信息,是Seata 1.4 以后支持的新模式。和db 类似,也是一种事务存储方式,利用 JedisLua 脚本来进行事务的增删改查操作,部分操作(如竞争锁)在 Seata 2.x 版本中全部采用了Lua脚本。也依赖于存储方Redis来保证数据的一致性。基于计算和存储分离的架构设计。

redis模式的优点是支持集群,效率较快, 无需要同步数据结构。

将存储模式改为redis
在这里插入图片描述
db模式下配置说明:

配置项描述备注版本说明
store.redis.mode部署模式默认 single,可选 sentinel1.4.2 版本新增 sentinel 模式
store.redis.single.host主机地址单机模式下 redis host,兼容 1.4.2 之前的版本,该配置为空时选取 store.redis.host 作为配置项1.4.2 版本新增
store.redis.single.port端口单机模式下 redisport,兼容 1.4.2 之前的版本,该配置为空时选取 store.redis.port 作为配置项1.4.2 版本新增
store.redis.sentinel.masterNamesentinel 模式下 redis 的主库名称1.4.2 版本新增
store.redis.sentinel.sentinelHostssentinel 模式下 sentinelhosthosts 以逗号分隔1.4.2 版本新增
store.redis.host ip默认 127.0.0.11.4.2 版本弃用
store.redis.port端口默认 63791.4.2 版本弃用
store.redis.maxConn最大连接数默认 10
store.redis.minConn最小连接数默认 1
store.redis.database默认库默认 0
store.redis.password密码(无可不填)默认 null
store.redis.queryLimit一次查询最大条数默认 100
store.redis.type主要使用的方式: luapipplinepippline

2.4 Raft

Raft官网地址
Seata-Raft 存储模式详解及入门

Raft是一种用于分布式场景下的一致性算法,Seata 2.0开始支持,提供了存算一体的高性能易扩展,入门门槛低,运维成本低等特定的事务存储模式。

Seata-Raft模式的设计思路是通过封装无法高可用的file模式,利用Raft算法实现多个TC之间数据的同步。该模式保证了使用file模式时多个TC的数据一致性,同时将异步刷盘操作改为使用Raft日志和快照进行数据恢复。

注意:

  • 😶😶😶但是目前基于Raft模式的解决方案可能还不够成熟,生产环境切勿使用。😶😶😶
  • 🤫🤫🤫不支持与第三方注册中心搭配,故全链路只允许存在一个TC集群🤫🤫🤫

将存储模式改为raft
在这里插入图片描述
raft模式下配置说明:

配置项描述备注版本说明
server.raft.group分组,client 的事务分组对应的值要与之对应,如 service.vgroup-mapping.default_tx_group=default默认default2.0.0 版本新增
server.raft.server-addr集群列表2.0.0 版本新增
server.raft.snapshot-interval间隔多久做一次内存快照,每做一次快照将暂停状态机,但是能提高停机恢复速度默认 6002.0.0 版本新增
server.raft.apply-batch任务累积批次后提交至 leader默认 322.0.0 版本新增
server.raft.max-append-bufferSizeraft 日志存储缓冲区最大大小默认 256K 2.0.0 版本新增
server.raft.max-replicator-inflight-msgs在启用 pipeline 请求情况下,最大 in-flight 请求数默认 2562.0.0 版本新增
server.raft.disruptor-buffer-size内部 disruptor buffer 大小,如果是写入吞吐量较高场景,需要适当调高该值默认 163842.0.0 版本新增
server.raft.election-timeout-ms超过多久没有 leader 的心跳开始重选举默认 1000 毫秒2.0.0 版本新增
server.raft.reporter-enabledraft 自身的监控是否开启默认 false2.0.0 版本新增
server.raft.reporter-initial-delay监控输出间隔默认 602.0.0 版本新增
server.raft.serialization序列化方式,目前仅支持 jackson默认 jackson2.0.0 版本新增
server.raft.compressorraftlogsnapshot 的压缩方式,支持 gzip, zstd, lz4none2.0.0 版本新增
server.raft.syncraftlog 同步刷盘true2.0.0 版本新增

配置文件内容如下:
在这里插入图片描述
Seata服务端需要修改注册中心为file

seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos# 该配置可以选择不同的配置中心
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: file # raft模式下不允许使用非file的其他注册中心
  store:
    # support: file 、 db 、 redis 、 raft
    mode: raft # 使用raft存储模式
    file:
      dir: sessionStore # 该路径为raftlog及事务相关日志的存储位置,默认是相对路径,最好设置一个固定的位置

Seata客户端事务分组对应的TC集群需要修改为和server.raft.group 一致,并修改注册中心类型为raft
将tc集群改为server的raft group

seata:
   tx-service-group: default_tx_group
   service:
      vgroup-mapping:
         default_tx_group: 如果server.raft.group为default,那么此处便是default
   registry:
      type: raft
      raft:
         server-addr: 192.168.0.111:7091, 192.168.0.112:7091, 192.168.0.113:7091

3. 选型方案

Seata当前已经趋于成熟,性能入门门槛部署运维成本是未来发展的重点方向。

3.1 高可用

除了file模式外,dbredisraft模式都支持高可用集群部署。

3.2 一致性

一致性排名如下(由高到低):

  • raft:基于raft一致性算法
  • db:基于数据库事务
  • file:基于异步刷盘
  • redis:基于RDBAOF持久化

3.3 性能

性能排名如下(由高到低):

  • file:基于直接内存
  • redis:基于内存数据库
  • raft:基于raft
  • db:基于数据库

3.4 部署运维成本

部署运维成本排名如下(由高到低):

  • file:默认方式,直接部署即可
  • raft:只需修改配置,无需注册中心
  • redis:依赖于内存数据库,生产环境需要部署注册中心
  • db:基于数据库,需要同步数据接口,生产环境主要部署注册中心

3.5 成熟度

除了新出的raft模式,其他的基本已经很成熟,生产可用。

3.6 总结

raft模式是最理想的方案,但是当前并不成熟,所以不用考虑。

file模式简单易用,但是只支持单机模式部署,生产环境不考虑。

redisdb模式都支持集群部署,redis更易使用,且性能更高,所以推荐redis模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1521185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟机网络链接

在虚拟网络设置中找到如下界面: "子网 IP" 192.168.79.0/24 表示一个局域网络,它有254个可能的IP地址可供分配(192.168.79.1到192.168.79.254),255.255.255.0 是子网掩码,定义了网络和主机部分。…

MySQL--深入理解MVCC机制原理

什么是MVCC? MVCC全称 Multi-Version Concurrency Control,即多版本并发控制,维持一个数据的多个版本,主要是为了提升数据库的并发访问性能,用更高性能的方式去处理数据库读写冲突问题,实现无锁并发。 什…

Cartwheel——文本生成3D动作或动画的工具

一个强大的文本转3D动画平台,用户只需通过输入文字提示即可生成视频、游戏、电影、广告、社交或VR项目所需的3D动画角色。 Cartwheel 是一个功能强大的文本到动画平台。只需键入即可为您的视频、游戏、电影、广告、社交或 VR 项目制作角色动画 定位: 定位于为用户提供简单…

Unity类银河恶魔城学习记录10-11 p99 Aliment visual effects源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili EntityFX.cs using System.Collections; using System.Collections.Gener…

Mysql事务+锁测试 RR行锁升级

Mysql事务锁测试 Mysql5.7 在隔离级别RR下,添加写锁,锁住一行数据,写锁是排它锁,不允许其它的读写、 另外开启一个连接,进行写操作,发现执行没有成功,在等待锁 查询事务表,有两个事…

openssl3.2 - note - Decoders and Encoders with OpenSSL

文章目录 openssl3.2 - note - Decoders and Encoders with OpenSSL概述笔记编码器/解码器的调用链OSSL_STORE 编码器/解码器的名称和属性OSSL_FUNC_decoder_freectx_fnOSSL_FUNC_encoder_encode_fn官方文档END openssl3.2 - note - Decoders and Encoders with OpenSSL 概述 …

大数据Doris(六十八):基于Doris on ES的架构实现总结

文章目录 基于Doris on ES的架构实现总结 一、Mem Join架构遗留的核心问题 二、Doris

河南大学大数据平台技术实验报告二

大数据平台技术课程实验报告 实验二:HDFS操作实践 姓名:杨馥瑞 学号:2212080042 专业:数据科学与大数据技术 年级:2022级 主讲教师:林英豪 实验时间:2024年3月15日3点 至 2024年3月15日4点40 …

力扣经典题:分割平衡字符串

大佬的代码非常简洁 int balancedStringSplit(char * s){short i0,count0,sign0;while(s[i]){signs[i]L?sign1:sign-1;if(sign0) count;}return count; }

安装gpu-torch(已经成功)

### !!!直接使用pip安装,不要使用conda安装,使用conda安装总是会安装成CPU版本。 1.第一次尝试 之前按照官网安装pytorch的命令进行安装,结果安装出来是cpu版本的,试过https://blog.csdn.net/…

【日常记录】【CSS】css下划线动画

文章目录 1、效果2、思路3、代码 1、效果 2、思路 整体可以用 背景来做线:可以用 渐变 配合 background-size 、 background-position 、background-repeat正向动画:可以不断追加 background-size x 轴的大小来控制,当鼠标移入的时候&#x…

【应急响应靶场web2】

文章目录 前言 一、应急响应 1、背景 2、webshell查杀 3、日志排查 1)apache日志 2)nginx日志 3)ftp日志 4、隐藏账户 5、文件筛选 二、漏洞复现 总结 前言 靶场来源:知攻善防实验室 一、应急响应 1、背景 小李在某…

【算法训练营】周测1

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~ 考题11-1 题目描述 有一个初始时为空的序列,你的任务是维护这个…

SpringBoot(异常处理)

SpringBoot(异常处理) 1.基本介绍 2.debug异常处理机制 1.找到 DefaultErrorViewResolver 2.下断点 3.debug启动,浏览器输出一个不存在的页面 4.第一次查找 error/404 1.查看目前要找的视图名 2.准备去查找资源 3.准备从四个默认存放静态资…

使用 FastAPI APIRouter 构建高效的 API

FastAPI 是一个现代的、高性能的 Python Web 框架,它提供了 APIRouter 来帮助组织和管理路由。APIRouter 是一个可用于组织和分组路由的类,使得代码结构更加清晰和可维护。本文将介绍 FastAPI APIRouter 的用法,包括实践案例以及在 IDE 编辑器…

【商业|数据科学主题会议推荐】2024年商业分析与数据科学国际学术会议(ICBADS 2024)

【商业|数据科学主题会议推荐】2024年商业分析与数据科学国际学术会议(ICBADS 2024) 征稿主题 (以下主题包括但不限于) 多媒体决策 决策理论与决策科学 数字市场设计与运营 降维 电子商务 道德决策 财务分析 群体决策与软件 医疗保…

podman proxy 【podman 代理】

文章目录 方法1: 为当前用户设置环境变量方法2:为 Podman 服务设置配置文件方法3: 为单个 Podman 命令设置代理方法四: 配置 http-proxy.conf 方法1: 为当前用户设置环境变量 您可以为当前用户设置 HTTP_PROXY 和 HTTPS_PROXY 环境变量,Podman 将自动读取这些环境变…

C语言从入门到熟悉------第四阶段

指针 地址和指针的概念 要明白什么是指针,必须先要弄清楚数据在内存中是如何存储的,又是如何被读取的。如果在程序中定义了一个变量,在对程序进行编译时,系统就会为这个变量分配内存单元。编译系统根据程序中定义的变量类型分配…

【项目笔记】java微服务:黑马头条(day04)

文章目录 自媒体文章-自动审核1)自媒体文章自动审核流程2)内容安全第三方接口2.1)概述2.2)准备工作2.3)文本内容审核接口2.4)图片审核接口2.5)项目集成 3)app端文章保存接口3.1)表结构说明3.2)分布式id3.3)思路分析3.4)feign接口 4)自媒体文章自动审核功能实现4.1)表结构说明4.…

linux ffmpeg编译

下载源码 https://ffmpeg.org/ csdn下载源码包 不想编译可以直接下载使用静态版本 https://ffmpeg.org/download.html https://johnvansickle.com/ffmpeg/ 根据cpu类型,下载解压后就可以直接使用了。 linux编译 安装底层依赖 yum install gcc yum isntall …