Seata 支持多种会话存储(Session Storage)模式,用于存储事务协调者(Transaction Coordinator, TC)的相关数据,例如全局事务的状态信息、分支事务的状态信息等。这些数据对于事务的正常执行和恢复至关重要。Seata 提供了多种会话存储实现,以适应不同的应用场景和技术栈。
会话存储模式概述
Seata 支持以下几种会话存储模式:
- FileStore:使用文件系统作为存储介质。
- DBStore:使用关系型数据库作为存储介质。
- MemoryStore:使用内存作为存储介质。
- RedisStore:使用 Redis 作为存储介质。
- MySQLStore:专门针对 MySQL 的存储实现。
FileStore
FileStore 是默认的会话存储模式,它使用文件系统来存储会话数据。这种模式简单易用,适合于测试和开发环境。
配置
在 Seata 的配置文件中(例如 config.txt
或 seata.properties
),你可以配置 FileStore 的相关参数:
store.mode=file
store.file.dir=data
store.file.maxBranchSessionSize=16384
store.file.maxGlobalSessionSize=512
store.file.fileWriteBufferCacheSize=16384
store.file.flushDiskMode=fsync
store.file.syncLog=disable
store.file.fileSystemType=local
store.mode=file
:指定使用 FileStore。store.file.dir=data
:指定会话数据的存储目录。store.file.maxBranchSessionSize=16384
:最大分支会话大小。store.file.maxGlobalSessionSize=512
:最大全局会话大小。store.file.fileWriteBufferCacheSize=16384
:文件写缓存大小。store.file.flushDiskMode=fsync
:磁盘刷新模式。store.file.syncLog=disable
:同步日志开关。store.file.fileSystemType=local
:文件系统类型。
DBStore
DBStore 使用关系型数据库作为存储介质。这种模式适合于生产环境,因为它提供了更好的可靠性和可扩展性。
配置
在 Seata 的配置文件中,你可以配置 DBStore 的相关参数:
store.mode=db
store.db.datasource.type=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
store.db.datasource.jdbcUrl=jdbc:mysql://localhost:3306/seata?useUnicode=true
store.db.datasource.user=root
store.db.datasource.password=root
store.db.datasource.driverClass=com.mysql.jdbc.Driver
store.db.initSql=classpath:db/init.sql
store.db.maxConn=30
store.db.minConn=5
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.lockTable=lock_table
store.mode=db
:指定使用 DBStore。store.db.datasource.*
:数据库连接的相关配置。store.db.initSql
:初始化 SQL 文件路径。store.db.maxConn
:最大连接数。store.db.minConn
:最小连接数。store.db.globalTable
:全局事务表名。store.db.branchTable
:分支事务表名。store.db.lockTable
:锁表名。
MemoryStore
MemoryStore 使用内存作为存储介质。这种模式只适用于简单的测试场景,因为重启后数据会丢失。
配置
在 Seata 的配置文件中,你可以配置 MemoryStore 的相关参数:
store.mode=memory
store.memory.maxGlobalSession=512
store.memory.maxBranchSession=16384
store.memory.sessionEvict="true"
store.memory.evictor="org.seata.store.memory.Evictor"
store.memory.evictor.delay="1000"
store.memory.evictor.interval="100"
store.mode=memory
:指定使用 MemoryStore。store.memory.maxGlobalSession=512
:最大全局会话数量。store.memory.maxBranchSession=16384
:最大分支会话数量。store.memory.sessionEvict=true
:是否启用会话回收。store.memory.evictor
:会话回收器实现。store.memory.evictor.delay=1000
:会话回收器的延迟时间。store.memory.evictor.interval=100
:会话回收器的间隔时间。
RedisStore
RedisStore 使用 Redis 作为存储介质。这种模式适合于需要高可用性和低延迟的应用场景。
配置
在 Seata 的配置文件中,你可以配置 RedisStore 的相关参数:
store.mode=redis
store.redis.clusterNodes=localhost:6379
store.redis.database=0
store.redis.password=
store.redis.maxPoolSize=10
store.redis.minIdle=5
store.redis.maxWaitMillis=3000
store.redis.timeout=1000
store.redis.globalKeyPrefix=SEATA_GLOBAL_
store.redis.branchKeyPrefix=SEATA_BRANCH_
store.redis.lockKeyPrefix=SEATA_LOCK_
store.redis.globalTable=global_table
store.redis.branchTable=branch_table
store.redis.lockTable=lock_table
store.mode=redis
:指定使用 RedisStore。store.redis.*
:Redis 相关配置。store.redis.globalKeyPrefix
:全局事务键前缀。store.redis.branchKeyPrefix
:分支事务键前缀。store.redis.lockKeyPrefix
:锁键前缀。store.redis.globalTable
:全局事务表名(用于兼容 DBStore)。store.redis.branchTable
:分支事务表名(用于兼容 DBStore)。store.redis.lockTable
:锁表名(用于兼容 DBStore)。
MySQLStore
MySQLStore 是专门针对 MySQL 的存储实现,它使用 MySQL 作为存储介质。
配置
在 Seata 的配置文件中,你可以配置 MySQLStore 的相关参数,这些参数与 DBStore 类似。
store.mode=db
store.db.datasource.type=com.mysql.jdbc.jdbc2.optional.MysqlDataSource
store.db.datasource.jdbcUrl=jdbc:mysql://localhost:3306/seata?useUnicode=true
store.db.datasource.user=root
store.db.datasource.password=root
store.db.datasource.driverClass=com.mysql.jdbc.Driver
store.db.initSql=classpath:db/init.sql
store.db.maxConn=30
store.db.minConn=5
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.lockTable=lock_table
总结
选择合适的会话存储模式取决于你的具体需求和应用场景。FileStore 适合快速开发和测试,DBStore 和 RedisStore 更适合生产环境,尤其是需要高可用性和高性能的场景。MemoryStore 仅适用于简单的测试环境,因为它不具备持久化能力。在配置时,请确保正确设置所有必要的参数,以确保 Seata 的稳定运行。