V18.0.1
版本更新说明
数据字典缓存大小可配置
新增 max_dd_cache_size 用于限制数据字典缓存容量。
问题修复
修复容量均衡时从源端节点迁移过多数据到目的节点,导致在下一轮检查时本次的源节点成为迁移的目的节点,在两个节点之间来回调度的问题。
修复引入 Learner 之后,迁移时触发 promote-demote job,将被移除的副本降级为 Learner,等心跳更新后再下发 remove job 的问题。
修复对于不健康或失联的节点,由于没有心跳上报导致迁移卡住的问题。
修复 V17.0.0 新增的参数 expired-log-receiver-topology-keep-time 缺失 JSON tag 的问题。
修复 multi job task 有概率记录无效的 job ID,导致 task 因无法找到该 job 而无法结束,最终任务超时的问题。
修复热点调度无法将数据对象从 RG(复制组)内分裂出来的问题。
V18.0.0
版本更新说明
分布式事务
支持 SQL 查询节点的悲观锁等待
通过查询 performance_schema.data_locks、performance_schema.data_lock_waits 和 information_schema.tdstore_part_ctx 表,可以获取当前节点 TDStore 的悲观锁信息和参与者信息。
高可用
增强容器化 HA(高可用性)能力
在现有 HA 能力基础上进行辅助增强,能通过探测模块秒级感知到集群内 node、cluster、pod 的异常状态,通过告警方式通知运维人员及时知晓 HA 异常事件,保障用户实例的健康。
基于内存值的 table cache 淘汰策略
实现针对 open table cache 占用内存大小的 table cache 淘汰策略,对应变量 table_open_cache_max_mem_size。
增强获取 GTS(全局时间戳服务)的健壮性
优化 SQLEngine 获取 GTS 的重试逻辑。
性能优化
迁移任务性能与稳定性优化
将 Install Snapshot 的 snapshot data 生成方式从 scan 优化为硬链接,单 RG 迁移性能提升20倍以上。
深入优化 Raft 层 Install Snapshot 的两阶段机制,提高了高负载场景下的成功率。
重构 Raft Log 保留策略
在新策略中,如果一条日志同步完成,则在短时间内将其删除;如果同步日志出现异常,则尽量将日志保留更长时间,等待同步流程恢复。
Raft Log 增加多种 fsync 策略
Raft Log 写盘支持三种 fsync 策略:1. 写完立即调用 fsync;2. 按照写入的数据量、时间间隔调用 fsync;3. 不调用 fsync,由操作系统自主调用。
Multi INSERT IGNORE 及表中有唯一索引的 Multi INSERT 支持 Batch Put 优化(INSERT ON DUPLICATE KEY UPDATE 不支持 Batch Put 优化)
旧版本当表中有唯一索引或者 INSERT 语句是 INSERT IGNORE,插入流程不会走 Batch Put 优化,而是退化成逐行插入。本版本增加 Batch Check 用来检测主键及唯一索引唯一性,以便在这两个场景下可以走 Batch Put 优化,该功能可以通过 tdsql_stmt_optim_batch_check 变量进行控制。
降低分区表内存规模
分区过多会占用较多内存,优化代码以降低分区表内存规模。
重构路由缓存
将计算层路由缓存拆分重构为 Node 缓存、ReplicationGroup 缓存、Region 缓存,减少不必要的内存分配与内存拷贝,便于数据读写和事务 RPC(远程过程调用)代码编写,为将来实现 Region Merge 和 Replication Group Merge 提供支持。
配置路由缓存的 Bucket 个数
大数据量实例的 Node、ReplicationGroup、Region 可能较多,会造成计算层路由缓存内存占用较多,而此内存占用和缓存 Bucket 数成正比,因此引入 GLOBAL 参数 tdsql_route_cache_buckets 调整路由缓存 Bucket 个数。
DDL(数据定义语言)时耗优化
为实现 Online Schema Change,DDL 须在各个阶段执行 write fence(DDL barrier)操作,本版本将 write fence 进行聚合批处理,加快 DDL 执行。
减少 vio 相关不必要的系统调用
为减少 epoll_ctl 调用对 bthread 调度效率的影响,减少 vio 相关不必要的系统调用。
备份恢复
Raft 层支持精准感知增量备份位点
旧版本的 Raft Log 保留策略默认保留一个小时,以此来保证增量备份的连续性。Raft 层支持精准感知增量备份位点后,为 Raft Log 保留策略提供了精细控制的数据支撑,从而及时回收无用 Raft Log 所占用的磁盘空间。
TDBR 支持 multi level ingest
恢复集群支持 multi level ingest,避免恢复时 SST(Sorted String Table)文件膨胀比较严重。
TDBR 支持将已卸载节点在 COS 残留的数据 close
增量备份对于已经卸载的节点,及时将 COS 的数据 close,避免最终可能导致恢复失败。
数据导入
BulkLoad 探活机制
BulkLoad 导数据之前 MC(元数据缓存)会禁止一些调度,当 SQLEngine、myloader、MC 被终止后,MC 可以自动恢复调度,不需要依赖人工介入。
BulkLoad 支持 segment 传输数据
BulkLoad 传输数据使用 segment,减少内存的频繁分配。
BulkLoad 限定同一事务内所有 SQL 为同一种 SQL Statement
BulkLoad 导入数据时,限定同一事务内所有的 SQL Statement 为同一种类型。
BulkLoad 回滚时删除远端的 SST 文件
BulkLoad 回滚时,可能远端节点已经传输过去数据,回滚时需要保证远端的 SST 文件可以被成功清除。
查询处理
并行查询支持分组操作(GROUP BY)完全下推
通常情况下,并行计划需要做二阶段分组操作,Release 18 支持某些查询的分组操作完全下推,省掉第 2 阶段的分组操作。该特性仅在并行扫描使用主键和 Unique Key 扫描时启用。
不带 GROUP BY 的 SELECT COUNT(*) 默认走并行查询
Release 18之前,对于查询表总行数的查询(不带 GROUP BY 的 SELECT COUNT(*))默认走存储引擎层并行,不受 max_parallel_degree 等并行查询相关参数控制。Release 18改为默认使用并行查询框架实现,参看 parallel_query_switch 参数使用说明。
并行查询支持包含标量子查询的语句并行执行
Release 17 中,如果查询中包括子查询则不走并行计划。Release 18 中支持包含下列子查询的 Query 并行执行,同时支持这些查询跨节点执行(MPP,大规模并行处理):1. 任意位置的非相关标量子查询;2. WHERE 条件上的相关子查询并行执行。
并行查询支持非第1张表做并行扫描
Release 17中如果是多表查询,只支持第1张表做并行扫描,如果第1张表不能并行扫描则退回到串行执行。Release 18去除了这个限制,同时支持跨节点执行(MPP),可以使用 PARALLEL hint 来指定并行扫描表。
并行查询支持带 DISTINCT 的聚集函数
Release 18去除了之前并行查询的语句不能包含带 DISTINCT 聚集函数的限制。如果一个查询包含带 DISTINCT 聚集函数,该语句的分组(GROUP BY)和排序操作都不能下推到并行 Worker 上执行。
运维
参数支持 SQL 查询与修改
MC 支持从 MySQL Client 使用 SQL 查询系统信息,包括:RG(复制组)元信息、DataObject 元信息、参数、任务等。支持使用存储过程修改 MC 参数。
tdstore_client_new_console 稳定性优化
修复 console 无法获取已删除的 Replication Group 信息的问题。
优化 get_rg_info 命令的 RPC 包大小,避免超过限制导致连接断开。
定期 dump SHOW PROCESSLIST
定期采集 SHOW PROCESSLIST 信息,便于分析问题。
默认导出 RPC trace 信息到慢查询日志
增加 RPC trace 信息,便于分析问题。
问题修复
修复 INSERT 事务在特定并发时序下破坏 Unique Secondary Index 唯一性约束的问题。
修复 hybrid 节点尝试连接不存在的节点的问题。
修复 LocalSqlRunner 存在内存泄漏的问题。
新增索引长度统计。
修复范围锁解锁时将范围锁转为一个等待中的单条锁请求,导致对应的 key range 一直被加锁,影响可用性的问题。
修复 RG 切主和迁移时,SQLEngine 发送 commit 请求至旧 RG Leader 所在的 hybrid 节点报错的问题。
修复事务更新某个并发事务刚刚提交的一行记录的非索引列后,可能后续使用二级索引读不到刚刚的修改(通过主键可以读到)的问题。
修复热点调度时随机根据读或写的负载下发切主任务,且读写热点的统计方式不合理导致频繁下发切主任务的问题。
参数变更
|
修改 | | table_definition_cache 用于设置表定义对象的缓存数量。表定义缓存存储了数据库中表的元数据(如列名、数据类型等),以便在查询执行过程中快速访问这些信息。当达到此限制时,系统会根据 LRU(最近最少使用)算法关闭最近最少使用的表定义,以便为新的表定义腾出空间。
|
修改 | | tdsql_max_retry 表示允许失败(网络/ RPC 等)重试的最大次数。
|
修改 | | table_open_cache 用于设置打开的表对象的缓存数量。当一个表被打开时,系统会将该表的结构信息存储在表缓存中,以便在后续的查询中重用 table_open_cache 参数值表示可以同时打开的表的最大数量。当达到此限制时,系统会根据 LRU(最近最少使用)算法关闭最近最少使用的表,以便为新的表腾出空间。
|