春风十里
(Ti D Ber F Vf Ce7m B)
2023 年11 月 27 日 06:58
1
【 TiDB 使用环境】测试
【 TiDB 版本】V7.1.2
不同TiDB Server 上访问相同数据,是否需要到存储加载?
比如一个三个TiDB Server端的集群,一个程序连到TiDB server 1 访问了表T1并加载到TiDB server 1 的内存中,同时另外一个程序连到了TiDB Server 2也要访问表T1。假定此时T1全部在TiDB server 1 的内存中,那么TiDB Server 2也要访问表T1,这时数据是从TiDB Server 1传到TiDB Server 2 ,还是从TiKV中获取?
zhanggame1
(Ti D Ber G I13ecx U)
2023 年11 月 27 日 07:02
2
从TiKV中获取,tidb内存有限不可能存下太多表的数据,所以还要算子下推,在tikv上完成一些where筛选,聚合函数等,然后汇总到tidb处理
Kongdom
(Kongdom)
2023 年11 月 27 日 11:26
11
第二个连接肯定从tikv中获取,因为第二个和第一个的tso不一样,不一样的tso意味着读取不同版本的数据。
1 个赞
春风十里
(Ti D Ber F Vf Ce7m B)
2023 年11 月 27 日 12:40
12
理论上内存加网络获取速度应该快于硬盘加网络,如果数据在第一个TiDB Server是最新的,我感觉从这个机器传过来性能会更好。
有猫万事足
2023 年11 月 27 日 14:21
15
你说的没错,所以怎么判断数据是最新的就是一个问题。
raft协议里面提到了两种做法,实现都在tikv,而不在tidb。
tidb之间并不会通信,无状态服务。
整个tidb的缓存设计也是多层的。tidb有缓存,tikv同样有。所以直接去tikv拿数据,按照raft的一套流程下来,和从另一个tidb拿效率其实是差不多的。
1 个赞
dba远航
(Ti D Ber M Lo7 Bqhk)
2023 年11 月 28 日 00:47
17
tidb-server之间是无感知的,所以不会相互传递
Kongdom
(Kongdom)
2023 年11 月 28 日 01:13
18
只有tikv里的数据是最新的,tidb里的无法判断是不是最新的。
1 个赞
肯定是TiKV,即使缓存表也是tidb server单节点
负责将 SQL 翻译成 Key-Value 操作,将其转发给共用的分布式 Key-Value 存储层 TiKV,然后组装 TiKV 返回的结果,最终将查询结果返回给客户端
节点之间完全对等
从另外tidb-server取还会有争用,像rac最大的问题就是gc争用
1 个赞
春风十里
(Ti D Ber F Vf Ce7m B)
2023 年11 月 28 日 14:38
21
你讲到Oracle RAC的gc争用,其实这只是RAC的内容融合技术Cache Fusion的一个小问题。Cache Fusion扩展了基于shared-disk架构的信息交互方式,允许不同节点间通过interconnect网络共享数据库内部的buffer。数据直接从一个节点的buffer传递到其他节点,避免了读写共享盘。
它设计底层逻辑就是磁盘+光纤交换机的速度慢于内存+网络的速度。根本上是为了减少磁盘IO,提高性能,实践证明在多活架构中是比较稳定的。gc争用只是实现多活导致的一个性能问题,但不能否认它的价值。
当然ORACLE RAC是 shared-disk 的架构,TiDB是shared-nothing的架构,技术线路不同本身也不能直接对比。
我想问的是TiDB执行SQL的时候,想要获取region信息都是先从PD上访问,就是说它天然就知道region的分布情况,哪个是leader,哪个是follower,这样它是否也应该知道哪个region已经在哪个TiDB的Server 上了,如果是这样的话,TiDB是否也可以使用“内存融合技术”,减少磁盘IO,提高性能?
有猫万事足
2023 年11 月 28 日 15:08
22
你的推测大致没错。
你问的这部分实现应该在client-go里面。
https://github.com/tikv/client-go
tidb就是用这个作为client来访问tikv。
client-go里面有一个region信息的缓存(region cache),所以client知道某个region大概在那个tikv上,当然也有被调度走的时候,如果调度走了。报错 region xxx is not leader,就会让对应id的region缓存失效,重新从pd上查询这个region的信息。
1 个赞
pd上的region信息都是节点上报的,需要知道tidb-server缓存了哪些region就需要tidb-server给pd上报缓存信息,但是tikv节点上本身也是有缓存的,从tikv节点获取最新的数据也是从内存获取的,所以tidb之间的“内存融合技术”感觉意义就不大了
zhanggame1
(Ti D Ber G I13ecx U)
2023 年11 月 29 日 02:04
24
tidb数据缓存主要靠tikv来缓存,tidb理论上知道数据在哪个tikv上,不同tikv数据不同,默认只查询leader的那个region