V20.1.4
问题修复
braft 在实现 install snapshot 时,在任务执行前就会更新 snapshot 的 meta 信息。raft leader 可能会提前 purge 掉 raft log,导致 log receiver 额外从 cos 拉取 raft log,导致 binlog 延迟变大。通过调整 log receiver 节点设置 snapshot meta 信息的时机,降低上述 log purge 的概率。
当一个事务中 delete SQL 删除 record_version 不同的多行同表数据时,生成的 binlog 下游可能会消费失败。
分区表 reset 时没有清理所有分区的 m_retrieved_record。
V20.1.3
版本更新说明
扩展性与性能
binlog 缓存过大时,阻塞上游或临时写到磁盘上
当等待落盘的 binlog 过多时,超过配置 wait_flush_binlog_cache_max_size,会阻塞上游不要继续生产 binlog,避免 OOM。
当 LogHandler 层的 binlog 缓存过多时,会借助 rocksdb 临时写到磁盘上。会限制总体 binlog 缓存(binlog_dump_log_handler_cache_max_size)和单个事务 binlog 缓存(binlog_dump_max_size_flush_disk_single_trans)。
去除函数调用,提升 binlog 性能
去除生成 binlog 过程中的部分函数调用,提升 binlog 生产性能。
将存储在 logservice_dump_seqno 的进度保存在本地 rocksdb 中,避免 binlog 回放受缓写的影响
之前 binlog 进度存储在 sys.logservice_dump_seqno,测试发现 tdstore 进入缓写后会影响 binlog 回放,将 binlog 进度存在本地 rocksdb 中,提高 binlog 回放性能。
稳定性
split rg commit 优化
将 split rg commit 流程中的统计信息更新逻辑(关闭 sst 边界对齐后,更新统计信息的估计函数会走 scan 抽样的逻辑,当分裂的 RG 数据量较大(TB 级)时,该步骤耗时较高)移出,等待允许事务读写后再立即更新统计信息,从而缩短 rg 分裂 commit 耗时,减少阻塞事务的时间。
alter table rename 时表不会处在中间状态
alter table rename 失败时,回滚流程将表状态设置为 public。
LogService MysqlClient 客户端使用 UseDB 函数
LogService 的 MysqlClient 连接使用 UseDB 函数,保证连接断联后,use db 语句仍然保持有效。
增加 table_def_cache_max_mem_size 参数支持通过 mem size 淘汰 TABLE_SHARE
增加 table_def_cache_max_mem_size 参数,通过设置该参数,限制 TABLE_SHARE 结构体占用的内存大小。TABLE_SHARE 结构体内存占用大小超过该参数,将触发淘汰机制。
将 ha_rocksdb::alloc_key_buffers 申请的内存 统计到 table_open_cache_max_mem_size
将 ha_rocksdb::alloc_key_buffers 申请的内存也统计到 table_open_cache_max_mem_size 变量中,使得 table_open_cache_max_mem_size 数值计算的更精确,table 结构体的淘汰策略更准确。
RefOrNull 走并行可能少数据
修复 RefOrNull 走并行可能少数据的问题。
增强 binlog log receiver 内存控制能力,杜绝 OOM
新增了参数 log_receiver_get_raft_log_from_cos_total_size 来控制 binlog log receiver 从 cos 获取 raft log 时使用的内存情况。杜绝从 cos 获取 raft 时占用内存过多而导致的 OOM 问题。
cdc 节点不受 set persist 持久化的变量影响
cdc 节点规格和 hybrid 节点规格可能会不一样,如果 hybrid 持久化资源相关的变量可能会报错,所以 cdc 节点不受 set persist 持久化变量的影响。
Fast Online DDL 回放过程将保持 GES,直到回放完成再释放
MC 将会保持 GES,直到 Fast Online DDL 产生的 ingest behind raft log 在所有节点都回放结束,保证所有节点的数据一致性。
运维
split rg job 细化耗时统计信息
细化 split rg 的耗时统计,主要是 commit 流程,方便线上定位问题。
调小单个 binlog 文件大小
调整单个 binlog 大小,避免单个 binlog 文件过大。
更改 cdc 节点延迟上报
延迟统计从 replay_leader_ts 变更为 commit_ts_barrier,保证 user rg 延迟大于等于 sys rg,使指标更准确。
问题修复
tdstore 若干 rpc 未能完整的在 response 中返回 ret,可能导致 SQLEngine 行为错误。
参与者回滚和主动切主并发,可能导致部分参与者未能被清除。
事务在 UpdateCoorTerm 日志同步失败时,coor_term_字段无法更新,可能导致分布式事务卡住无法推进。
RG 分裂 + 协调者切主 + 切主前协调者 COMMIT 状态 + 切主后协调者 PREPARE 状态叠加的场景可能导致事务卡住无法推进。
V20.1.2
版本更新说明
数据库管理
logservice 监控信息优化
为多 cdc 场景以及单 cdc 内同时开启 binlog dump 和灾备的场景提供更为细致独立的监控。
稳定性
并行执行正确性问题
mrr 表上做并行执行时,产生错误的结果。
hint 遇到 set_var optimizer_switch 不生效
hint 遇到 set_varoptimizer_switch 不生效,outline 也不生效。
CPU 热变配时,即使变配前后回放线程数量不变也会等待回放任务全部完成
在变配前后回放线程数量不变时跳过等待过程直接返回。
扩展性和功能
增加灾备链接强制断开功能
灾备连接允许强制断开,但不保证上下游数据一致性。
安全增强
CORRUPT DATA 的预防和报错
写入流程增加校验机制以免踩内存写入错误数据,读到 corrupt data 时打印完整的 key-value 以便定位分析。
问题修复
利用 range cache 估计 range 内行数时,错误地获取了所有 block range 的统计信息。
利用 range cache 估计 range 内行数时,一些 range query 会产生 gap range,但是这些 gap range 并没有数据,但是仍然每次需要去存储读取。
分裂 Region 和 Merge Region 前检查了副本间的数据大小差异,如果数据差异过大会禁止分裂或者合并,代码问题导致遗漏了 size 的比较,仅使用了 key 的比较。
commit log 部分回放失败导致整个 1PC 日志重新回放,而 prepare log 重复回放判断存在问题,导致状态转换持续失败。
灾备同步使用的 MysqlClient 由于引入了内存限制,导致同步速度非预期地变慢。
灾备同步使用的 MysqlClient 由于引入了内存限制,产生了全局最小同步时间戳非预期地更新异常,导致灾备同步卡住。
由于 Merge RG 会删掉 MC 中 vanished rg 的内存信息,所以 log-service 回放到该 rg 相关的 job 后会不停报错,正常 log-service 会挡住 mc 删除,但是基于备份的灾备实例建立这里是挡不住的。
灾备同步使用的 MysqlClient 模式会同步预期之外的系统表。
binlog:两张表联合更新时,当用一张表的列更新另外一张表,binlog 旧行主键生成错误。
GetRegionsByKeyRange RPC 由于拿不到 HyperNodeInfo 锁而超时。
在节点 IP 更新时会导致 PeerId 的 role 字段信息丢失。
SQLEngine 启动过程,没有及时持久化 node 信息,注册成功之后因为别的原因启动失败之后,重启重新注册节点会因为地址冲突而无法启动成功。
打印 CORRUPT DATA 改变了 read_row_from_secondary_key 行为,开启 MRR+ICP 时可能有查询结果错误。
修复 CDC 节点中 Binlog Log Receiver 无法正确触发 Raft Log 文件关闭(close)操作,导致无法从 COS 获取所需日志的问题。
fast online copy ddl 时判断表结构版本是否一致,不一致则返回错误。
灾备任务进行中时,取消灾备任务,发生死锁。
SQL forward 转发功能,获取表所在的节点的路由时不要获取该表所有路由,只获取其中一个 Region 即可。
V20.1.1
问题修复
DDL 回滚流程加固,删除 table 时依据 tindex id 判断是否可以删除。
执行 rename,alter rename 的 ddl 时,进行 new name 的冲突检测。
升级过程 mysql 下的系统表不随着 server_sub_version 的变化而重建。
调整 tdstore_rpc_max_body_size 的默认值为512M,放开对 tdstore_txn_max_entry_size 的上限。
解决 outline 解析线程 thd 从客户 session 中复制环境变量的问题。
修复多表 join 回表之前漏设置 write fence 的 bug。
V20.1.0
版本更新说明
数据库管理
支持 binlog_space_limit、binlog_dump_cache_max_size 以及 tdstore_data_db_max_background_jobs 的变配热加载
上述三个参数分别和磁盘空间、内存大小以及 cpu 核数相关,当节点变配时,会根据新的规格动态计算对应的值。
多 CDC 节点 MysqlClient 模式下,提供 api 固定 log receiver 的位置分布
提供了接口支持指定 RG 以及指定 data object (库表名)绑定和节点的映射。
提供开关来确保运行时不再调度 receiver 的分布。
新增 DBMS_ADMIN 方法 CHECK_UPGRADE_CDC,检查当前集群没有正在进行的 DDL 操作,并且所有 DDL 已经回放完成
用于升级前检查,检查 CDC 节点是否可以进行升级,如果存在正在执行的 DDL 或者 还有 DDL 没有被回放,这个 DBMS 包会检查失败。
扩展性与性能
性能优化:BulkLoad 导入支持自适应提交策略
数据导入的时候,支持将一个 Session 里面事务自适应合并/拆分,提升 Bulk Load 导入性能。
MC 根据自身 CPU 规格,自适应调整限流器配置令牌桶大小
令牌桶大小计算方式:net_limiter_burst(令牌桶大小)= 100*log2(x) + 400,其中 x 为核数。
支持 RANGE/LIST + HASH 二级分区表内的 subpartition 间的亲和性绑定
新增预定义的 DP 规则 inner_affinity,创建二级分区表时绑定 dp,可以使不同一级分区表下的对应的二级分区表绑定在同一个 RG 中,比如 p0.sp0 和 p1.sp0 会绑定在一起。
建表 SQL: CREATE TABLE ... USING DISTRIBUTION POLICY inner_affinity;
Outline 支持 EXPLAIN ANALYZE
此版本中实现了 EXPLAIN ANALYZE 也可以命中 Outline 的匹配规则。
提高批量拉取 region 路由的速度
此版本重构优化了 MC 获取路由的 RPC 实现,在拉取大量 region 路由的情况下,接口速度有数量级的提升,减少了并发拉取路由导致的连接不断超时的问题。
支持一级 key 分区显式亲和性
支持通过 SQL 显式创建一级 KEY 分区的亲和性策略, 用于结构相同的 KEY 一级分区表之间的绑定。
建表 SQL: CREATE PARTITION POLICY {policy_name} PARTITION BY KEY COLUMNS ({columns_num}) PARTITIONS {partition_num};,详细请参见 CREATE PARTITION POLICY。 语法与功能
INDEX_FOR_GROUPBY/NO_INDEX_FOR_GROUPBY Hint 引入
稳定性
修改数据字典缓存对列长度限制
将 max_dd_cache_size 修改为100,减少数据字典缓存占用内存的上限值。
在 MC 限流时,计算节点延缓向 MC 的 RPC
MC 进入限流状态时,计算节点延缓向 MC 的 RPC 请求,以免把 MC 节点负荷打满(打满可能让系统不可服务)。计算引擎新增参数以调控与 MC 的 RPC 交互。
BulkLoad 导数据支持自适应提交策略
BulkLoad 导数据支持自适应提交策略,聚合一个 session 里面不同事务的写入,数据量达到一定阈值以后提交。
备份恢复
备份存储介质支持 S3
新增对 S3 协议兼容存储介质的备份支持,提升数据备份的可靠性与存储扩展性。
数据迁移
Myloader 工具支持聚合多个文件作为一个事务进行提交
目前 MyLoader 所能提交的单个事务的大小上限,为单个 SQL 文件的大小,新增参数 package-file-cnt,控制 MyLoader 聚合文件作为单个事务的数量,package-file-cnt>1,表示开启聚合文件提交功能。
运维
支持 tdsql_auto_increment_batch_size 参数动态修改
TDStore 新增监控指标
Hyper 节点新增监控指标 total_sst_files_num,即当前 SST 文件数量。
MC 静态参数支持滚动重启
需要重启 MC 节点的静态配置参数的设置,支持逐个节点设置和滚动重启,提供系统高可用性。
问题修复
修复 RG 分裂与分布式事务提交并发,并且在同步日志失败时,导致分布式事务卡住的问题。
TDSQL 的 tdsql_use_online_copy_ddl 默认设置为 true,此时部分 Online DDL 无法执行。对于这种错误,非分区表会捕获并抛出具体的异常信息,但分区表只抛出 ERROR 8510 (HY000): SQLEngine system error 'Unknown error occurs'。
均衡时可以选出 src 节点,但是无法找到合适的 target 节点。
热点可能把主键和索引划分到不同的 RG 中。
修复 ingest-behind 子任务线程结束时未及时释放 MDL 锁的问题。
log receiver 发生 on_error 触发刷新叠加 SQLEngine 被 kill,出现同步数据丢失。
create table … like. ddl 执行过程中,源表存在并发 ddl,重试等待过程中使用 wait,会阻塞当前线程上的其他 bthread。
修复 CPU 热缩容过程卡住的问题。
SQL 执行完毕之后,清理 THD rpc_ctx 中的 as_connection_closed_ 标记。
修复 Fast Online DDL 执行期间,mc 在划分 RG 路由前切主可能导致 ddl 失败的问题。
修复 TDStore 与 MC 重建连接存在100s延迟的问题。
修复增量恢复 bulk load commit log 的过程中,拆分 SST 的时候没有填充 cf_name,导致 td_sst_healthy_check 不通过。
修复 TDStore 作为授时来源时重启可能会失败的问题。
参数变更
|
修改 | | 支持 tdsql_auto_increment_batch_size 参数动态修改。 |
语法变更
|
新增 | | INDEX_FOR_GROUPBY/NO_INDEX_FOR_GROUPBY 提供 Hint 控制 GROUPBY 操作的情况下采用 Loose Index Scan 方式(松散索引扫描),减少扫描开销。 |
修改 | | 支持通过 SQL 显式创建一级 KEY 分区的亲和性策略, 用于结构相同的 KEY 一级分区表之间的绑定。 |