什么是TSO(tidb配置tso)

本文详细介绍了如何在TiDB环境中部署Drainer并获取initial_commit_ts,同时深入解析了TSO技术的工作原理,包括其在网络传输中的作用及如何通过网卡卸载TCP分片任务,减轻CPU负担。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

部署 Drainer
获取 initial_commit_ts
使用 binlogctl 工具生成 Drainer 初次启动所需的 tso 信息,命令:

$ cd /home/tidb/tidb-ansible
$ resources/bin/binlogctl -pd-urls=http://127.0.0.1:2379 -cmd generate_meta
INFO[0000] [pd] create pd client with endpoints [http://192.168.199.118:32379]
INFO[0000] [pd] leader switches to: http://192.168.199.118:32379, previous:
INFO[0000] [pd] init cluster id 6569368151110378289
2018/06/21 11:24:47 meta.go:117: [info] meta: &{CommitTS:400962745252184065}

分析:什么是tso
查看tso状态
ethtool -k ens160

TSO(TCP Segmentation Offload),是利用网卡对TCP数据包分片,减轻CPU负荷的一种技术,也有人叫 LSO (Large segment offload) ,TSO是针对TCP的,UFO是针对UDP的。如果硬件支持 TSO功能,同时也需要硬件支持的TCP校验计算和分散/聚集 (Scatter Gather) 功能。如果网卡支持TSO/GSO,可以把最多64K大小的TCP payload直接往下传给协议栈,此时IP层也不会进行segmentation,网卡会生成TCP/IP包头和帧头,这样可以offload很多协议栈上的内存操作,节省CPU资源,当然如果都是小包,那么功能基本就没啥用了。
————————————————
对TSO的简单理解就是:
比如:我们要用汽车把3000本书送到另一个城市,每趟车只能装下1000本书,
那么我们就要书分成3次来发。如何把3000本书分成3份的事情是我们做的,汽车司机只负责运输。
TSO的概念就是:我们把3000本书一起给司机,由他去负责拆分的事情,这样我们就有更多的时间处理其他事情。
对应到计算机系统中,“我们”就是CPU,“司机”就是网卡。
在网络系统中,发送tcp数据之前,CPU需要根据MTU(一般为1500)来将数据放到多个包中发送,对每个数据包都要添加ip头,tcp头,分别计算IP校验和,TCP校验和。如果有了支持TSO的网卡,CPU可以直接将要发送的大数据发送到网卡上,由网卡硬件去负责分片和计算校验和。

### TSO 时间戳服务使用的时钟类型 在分布式系统中,TSO(Timestamp Oracle)用于提供全局唯一的单调递增时间戳。这些时间戳的生成依赖于特定类型的时钟机制。 #### 单一物理时钟 某些简单的分布式系统可能采用单一物理时钟来为所有事务分配时间戳。然而,在大规模分布式的环境中,这种方法难以实现高精度与时钟同步[^3]。 #### 多副本协调的逻辑时钟 对于更复杂的场景,特别是当需要跨地理区域操作时,多副本协调下的逻辑时钟成为一种可行的选择。在这种模式下,多个TSO实例被部署,并通过一致性算法(如 Paxos 或 Raft)保持同步。这不仅提高了系统的可用性,还允许即使部分节点失效也能继续正常工作。 #### 物理加逻辑组合型时钟 实际应用中最常见的是结合了物理时间和逻辑计数器的时间戳结构。例如,Google Spanner 使用 TrueTime API 结合 GPS 和原子钟硬件设施,提供了具有不确定性区间的精确时间源;而 TiDB 则利用其 PD 组件作为 TSO 来管理基于机器内部时钟加上偏移量计算得出的时间戳[^1][^2]。 ```python import time class TimestampOracle: def __init__(self, physical_clock_source=time.time): self.physical_clock_source = physical_clock_source self.logical_counter = 0 def get_timestamp(self): current_physical_time = int(self.physical_clock_source() * 1e9) # 转换为纳秒级表示 timestamp = (current_physical_time << 22) | self.logical_counter self.increment_logical_counter() return timestamp def increment_logical_counter(self): if self.logical_counter >= (1<<22)-1: # 如果达到最大值则重置 while abs(int(time.time()*1e9) - ((timestamp >> 22))) < 1_000_000: # 等待下一毫秒到来再更新 pass self.logical_counter = 0 else: self.logical_counter += 1 ``` 这段 Python 代码展示了如何创建一个简单版本的 TSO 类 `TimestampOracle` ,其中包含了物理时钟和逻辑计数器两部分组成的混合时间戳生成方法。这里假设物理时钟来源于标准库函数 `time.time()` 并将其转换成纳秒级别以便与逻辑位拼接形成最终返回给客户端的应用层时间戳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值