Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如果想用hostname做peer ID,怎样改比较方便呢? #18

Open
pdu opened this issue Apr 19, 2018 · 18 comments
Open

如果想用hostname做peer ID,怎样改比较方便呢? #18

pdu opened this issue Apr 19, 2018 · 18 comments

Comments

@pdu
Copy link

pdu commented Apr 19, 2018

比如在k8s里面用braft,stateful应用只能保证hostname不变,但是IP每次重启就变了。

@chenzhangyi
Copy link
Collaborator

数据会变化吗?

@pdu
Copy link
Author

pdu commented Apr 19, 2018

数据不变,不如数据存在EBS或者EFS里面。

但是k8s里面重启pod/container之后,IP是会变的,这样起来后,braft会需要重新set peers,然后还是会同步所有的数据。

期望是,用k8s的stateful部署,这样可以做到hostname不变但是IP还是会变,在braft里面用hostname去标记所有的meta,这样pod/container重启之后就不用重新同步数据了。

@chenzhangyi
Copy link
Collaborator

chenzhangyi commented Apr 19, 2018 via email

@pdu
Copy link
Author

pdu commented Apr 19, 2018

不能保证。k8s的stateful只能保证每次重启hostname不变,但是IP是不做限制的(刚被释放的IP,是否会被立即重用,这个我不确定,但是我感觉应该会有限制,待确认)。

我现在简单的改了一个版本:
1,peerID里面不用butil::EndPoint,自己用hostname + port来代替
2,建立braft::Channel的时候,把hostname+port再转换成butil::EndPoint

这样解决了一个问题是:
1,node重启后,重新加入raft group后,不用再去sync所有的snapshot+binlog

但是还有个问题:
1,leader的replicator是在peers加入的时候建立brpc::Channel的,在那个阶段我把hostname解析成了IP。但是node重启后,leader并不知道背后的IP已经变了。

感觉这个问题在brpc::Channel层面解决会更好一点。

我现在暂时的解决方式是:外围的master/tools发现node重启后,会给leader发请求remove_peers,在node起来后,在add_peers。
但是如果braft能够自动处理的话就更好了。

BTW:etcd的raft实现是支持用hostname的,可能因为他们原生就是要用在k8s上的吧。

@chenzhangyi
Copy link
Collaborator

chenzhangyi commented Apr 19, 2018 via email

@pdu
Copy link
Author

pdu commented Apr 19, 2018

1,一个hostname只会有1个IP
2,如果两个node很快的交换IP,确实会有你说的ABA问题啦。我要确认下多久内不会被重用。

另外要避免这个场景下的ABA问题的话,在sync data的协议中,leader默认把follower的hostname也发过去,follower发现hostname不匹配的话,就refuse请求。

brpc::Channel的更新支持:

 133     // Connect this channel to a group of servers whose addresses can be
 134     // accessed via `naming_service_url' according to its protocol. Use the
 135     // method specified by `load_balancer_name' to distribute traffic to 
 136     // servers. Use default options if `options' is NULL.
 137     // Supported naming service("protocol://service_name"):
 138     //   bns://<node-name>            # Baidu Naming Service
 139     //   file://<file-path>           # load addresses from the file
 140     //   list://addr1,addr2,...       # use the addresses separated by comma
 141     //   http://<url>                 # Domain Naming Service, aka DNS.
 142     // Supported load balancer:
 143     //   rr                           # round robin, choose next server
 144     //   random                       # randomly choose a server
 145     //   la                           # locality aware
 146     //   c_murmurhash/c_md5           # consistent hashing with murmurhash3/md5
 147     //   "" or NULL                   # treat `naming_service_url' as `server_addr_and_port'
 148     //                                # Init(xxx, "", options) and Init(xxx, NULL, options)
 149     //                                # are exactly same with Init(xxx, options)
 150     int Init(const char* naming_service_url,
 151              const char* load_balancer_name,
 152              const ChannelOptions* options);

是指的这个吗?
// http:// # Domain Naming Service, aka DNS.

如果是的话,我待会儿改了试一下。

@pdu
Copy link
Author

pdu commented Apr 19, 2018

测试过了,这个能解决问题。
// http:// # Domain Naming Service, aka DNS.

@lingji
Copy link

lingji commented Apr 25, 2018

能否开启gitter讨论? @chenzhangyi

@chenzhangyi
Copy link
Collaborator

@pdu 现在没有k8s的测试环境, 你的改动如果比较成熟了,欢迎提交PR,或者可以发起更多的讨论.
@lingji 根据我们之前的经验, 『即时聊天』并不是一个非常高效的途径

@ipconfigme
Copy link
Collaborator

ipconfigme commented May 9, 2018

@pdu 我看了你的修改,string类型的addr,建议考虑支持www.abc.com和1.2.3.4两种格式,直接hostname2ip只有www.abc.com这种。不过最好的方式应该修改brpc中EndPoint,让它支持string类型的hostname和ip addr。

@pdu
Copy link
Author

pdu commented May 10, 2018

@chenzhangyi @ipconfigme 谢谢你们的建议。我也是觉得在brpc:EndPoint中支持更好。

我现在是计划在项目中用braft,等改动成熟了,我来提交PR。

@chenzhangyi
Copy link
Collaborator

chenzhangyi commented May 10, 2018 via email

@x-x-p
Copy link

x-x-p commented May 22, 2019

@pdu 啥时候有pr?

@Ryan-Git
Copy link

Ryan-Git commented Feb 19, 2020

遇到类似的问题,有个想法

  • peer id 仅用 string 标识(现有的保留向前兼容)
  • braft 加一个选项,初始化 channel 时候根据这个选项调 ns_url 那个构造函数
  • 用户自己实现、注册NamingService。比如这里想用域名看起来可以复用已有的DomainNamingService,peer id 用 http://xxxx 就行了

@egolearner
Copy link

Hi @pdu ,你们进展怎么样?是否已经成功落地到k8s上了?

@x-x-p
Copy link

x-x-p commented Apr 26, 2022 via email

@gulu-goolu
Copy link

gulu-goolu commented Dec 17, 2023

这个特性我实现了,如果需要的话,我提了一个 pull request:#429

@x-x-p
Copy link

x-x-p commented Dec 17, 2023 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

8 participants