changefeed 可以指定多个sink-uri吗?

感觉不对劲,测试了下:

配置两个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是正常的)
image

你意思还分主节点次节点?要是把2节点停了,1节点可以正常呗?

是的,试了下把节点2停了不影响同步。。。

:joy:加油,弄清楚它,我也学习下

那你这个IP要是反过来写呢?把2节点写前面,然后停2节点

反过来写,把host2放前面,停host2后无法同步。
还是一样的现象:
只有当前顺序中第一个host可用,才会正常同步,没有在第一个发生异常后自动切换到第二个host上

好吧,那其实还是相当于单点了,后面的节点根本不认

目前是这样的,其实也就是按序来的,看看最新的版本有木有搞。有段时间没弄这个了 :face_with_peeking_eye:

看了上面的跟帖感觉有点意思,趁中午时间快速翻了下代码一探究竟。

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

综上所述

sink不支持写多个host :rofl:

不知道官网文档里那个kafka的案例写多个host有没有经过测试

3 个赞

太强了! :+1: :+1: :+1:

非常感谢hoho大佬的分享 :+1:

双大拇哥给你

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 天后被自动关闭。不再允许新回复。