感觉不对劲,测试了下:
配置两个ip可以正常同步任务
当我将10.0.0.1:4000 tidb-server stop,query changefeed没有error,但是无法正常同步,syncpoint_v1也不更新了。
等了6分钟没反应,我将10.0.0.1:4000 tidb-server start后同步任务恢复正常。
这说明当10.0.0.1:4000出现问题后并没有切换到10.0.0.2:4000上(测试期间10.0.0.2:4000是正常的)
感觉不对劲,测试了下:
配置两个ip可以正常同步任务
当我将10.0.0.1:4000 tidb-server stop,query changefeed没有error,但是无法正常同步,syncpoint_v1也不更新了。
等了6分钟没反应,我将10.0.0.1:4000 tidb-server start后同步任务恢复正常。
这说明当10.0.0.1:4000出现问题后并没有切换到10.0.0.2:4000上(测试期间10.0.0.2:4000是正常的)
你意思还分主节点次节点?要是把2节点停了,1节点可以正常呗?
是的,试了下把节点2停了不影响同步。。。
加油,弄清楚它,我也学习下
那你这个IP要是反过来写呢?把2节点写前面,然后停2节点
反过来写,把host2放前面,停host2后无法同步。
还是一样的现象:
只有当前顺序中第一个host可用,才会正常同步,没有在第一个发生异常后自动切换到第二个host上
好吧,那其实还是相当于单点了,后面的节点根本不认
目前是这样的,其实也就是按序来的,看看最新的版本有木有搞。有段时间没弄这个了
看了上面的跟帖感觉有点意思,趁中午时间快速翻了下代码一探究竟。
sink解析的关键代码:
https://github.com/pingcap/tiflow/blob/master/cdc/sink/validator/validator.go#L32
只做了个简单的URI解析,顺手测了一把sink包含多个host的情况:
s := "mysql://root:111@127.0.0.1:3306,127.0.0.2:3306/"
u, err := url.Parse(s)
fmt.Println(u.Host)
// 输出127.0.0.1:3306,127.0.0.2:3306
s := "mysql://root:111@127.0.0.1:3306/,127.0.0.2:3306/"
u, err := url.Parse(s)
fmt.Println(u.Host)
// 输出127.0.0.1:3306
s := "mysql://root:111@127.0.0.1:3306/,127.0.0.2:3306"
u, err := url.Parse(s)
fmt.Println(u.Host)
// 输出127.0.0.1:3306
根据测试结果判断host解析规则是从@开始后一直到第一个/出现的中间那一部分,后面的部分都当做了URI的Path字段,这也说明了为啥你用4种sink测cdc第1、2种可以运行,而且多个host之间不能自动切换。
进一步猜测sink到底支不支持多个host,扒一下golang系统库的代码,找到host解析的真实逻辑:
if (url.Scheme != "" || !viaRequest && !strings.HasPrefix(rest, "///")) && strings.HasPrefix(rest, "//") {
var authority string
authority, rest = rest[2:], ""
if i := strings.Index(authority, "/"); i >= 0 {
authority, rest = authority[:i], authority[i:]
}
url.User, url.Host, err = parseAuthority(authority)
if err != nil {
return nil, err
}
}
func parseAuthority(authority string) (user *Userinfo, host string, err error) {
i := strings.LastIndex(authority, "@")
if i < 0 {
host, err = parseHost(authority)
} else {
host, err = parseHost(authority[i+1:])
}
}
和我猜想的一致。
另外也看了下官方对sink格式的单元测试,并没有对多个host做测试:
https://github.com/pingcap/tiflow/blob/master/cdc/sink/validator/validator_test.go#L26
综上所述
不知道官网文档里那个kafka的案例写多个host有没有经过测试
太强了!
非常感谢hoho大佬的分享
双大拇哥给你
v7.1.2版本试了下多个ip,在多分区多副本的情况下,任意关闭下游一个kafka地址同步都正常。
–sink-uri="kafka://10.10.10.10:1000,10.10.10.10.11:1001,10.10.10.10:12/katest
kafka应该是可以的。这里下游是tidb
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。