配置了6个同步任务,每个任务我都选择了三个node节点,来保证node的高可用,开始测试的时候同步任务是均匀分布在各个node上的,但是后来使用过程中6个同步任务全都挤到一个node节点上了,另外两个node节点上没有同步任务,想问一下node对同步任务是怎么分配的,为什么会出现这种情况?
原提问者Github 用户 raisemeup
选择多个节点,只是保证高可用,同时只会有1个节点处理一个pipeline中的se/tl节点。
这点可以在pipeline的同步进度中看到使用的se节点, 这里做法是首先多个select node会竞争zk上的一个临时节点,mainstem? s->e->-t->l的过程是通过仲裁器来通知的,你可以看到配置pipeline时仲裁器有内存,自动,Zookeeper啥的 默认的自动,在s->e时使用内存通知也就是阻塞队列,e->t时是rpc,这时候有个负载均衡策略,也一样是在pipeline配置的,有随机,stick啥啥啥的,默认stick优先选上一次使用的t节点,t->l也是使用内存通知
这个是任务的通知,在pipeline上的节点相当于拿到通知才得到授权,只有select是竞争的,其他都是上一个节点选择的 还有数据的传输,默认自动=内存+rpc+http,s->e时是内存方式,数据在队列里,e->t时同一node是内存方式,数据超过1M就会走http也就是aria2上传下载,数据小于1M走rpc本地缓存等待t节点远程拉取,也是在pipeline有配置的,一般选择rpc其实也可以。t->l数据也在内存里
node是抢占式的,如果有节点出现不可用或者网络抖动,就会被存活的节点给抢占了任务。
在 Canal 中,负载均衡是通过一个叫做 clientIdentity
的标识来实现的。当一个客户端连接到 Canal Server 时,会提供一个唯一的 clientIdentity
,Canal Server 会根据这个标识将同步任务分配给不同的节点。如果你在创建同步任务时选择了多个节点,那么 Canal Server 会尝试将任务均匀地分配到这些节点上,以实现负载均衡。
然而,如果你的某个节点的处理能力比其他节点更强,或者其他节点出现了故障,那么任务就有可能被集中在这个节点上。这种情况下,你可以通过手动调整同步任务的节点分配来实现负载均衡,或者增加节点的数量来提高整个系统的容错能力。另外,也可以通过监控节点的 CPU、内存等指标,及时发现节点负载过高的情况,从而采取相应的措施来避免负载不均衡的问题。
node是抢占式的,如果有节点出现不可用或者网络抖动,就会被存活的节点给抢占了任务
原回答者Github 用户 agapple
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。