新建的表一会有一会没有

1min30s 整,应该是走到了慢速 ddl 的逻辑,也就意味着走 etcd 快速变更那块有问题。

原理是这样的:ddl 的算法要保证,在 tidb1 上面执行了这个操作,tidb 2 3 4 … 上面都能看到最新的 schema 信息。有两种方式,一种是慢速路径,要求每个 tidb 去 load 最新的 schema,在一个 lease 时间内,schema 变更不会有两次。一个 tidb 不知道其它 tidb 是否使用了正确的 schema,但是它可以等待。其它 tidb 会在 lease 时间内加载最新的 schema,如果加载不到就自己停止服务。ddl owner 节点只要等完 lease 就可以执行下一个状态变更,并且一定是安全的。

另一种是快速路径,tidb 是无状态的,并不知道其它所有 tidb 节点的存在。不过我们使用了 etcd (pd 内嵌的),可以往 etcd 写消息,推送给其它 tidb,相当于 ddl owner 执行完变更后,就立即通过 etcd 确认其它 tidb 是否都获知了这次的 schema 变更,如果全部 tidb 都回应了消息,则可以走快速变更逻辑,不走 lease

lease 的默认时间如果我没记错应该是 45s,所以 1min30s 是两次的 lease , 走了慢速路径

4 个赞