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

关于canal高可用的问题 #147

Open
lulu2panpan opened this issue Mar 9, 2016 · 18 comments
Open

关于canal高可用的问题 #147

lulu2panpan opened this issue Mar 9, 2016 · 18 comments

Comments

@lulu2panpan
Copy link
Collaborator

目前canal的高可用只考虑了双机热备,并且是抢占式的(大部分情况下一台机器运行所有instance,另一台机器处于空闲状态)

有没有考虑过canal的集群和负载均衡?比如:
一共有20个instance,10台canal-server,每台canal-server在conf目录下都配置这20个instance,但是通过负载均衡策略,每台server实际只运行2个instance。当出现宕机时,做re-balance,其它server接管宕机server的instance。

没有这种统一的集群策略的话,目前只能以分组的方式实现某种程度的集群。比如:
canal_A1和canal_A2为一组,conf目录下配置instance1,instance2,instance3,instance4
canal_B1和canal_B2为一组,conf目录下配置instance5,instance6,instance7,instance8
相应的消费端同理,一组只消费1,2,3,4,另一组只消费5,6,7,8

@agapple
Copy link
Member

agapple commented Mar 9, 2016

高可用模式,是针对instance级别,非server级别. 也就是说你10台server,20个instance,每个instance都会是10台server进行互相抢占.
ps. 是抢占式可能不会是最平均的状态,比如一台server先启动,就会抢占所有的instance

@agapple
Copy link
Member

agapple commented Mar 9, 2016

倒是可以对集群模式下的server,允许设置容量上限,比如最多同时服务多少个instance,避免一个server撑死. 比如你这情况,单server设置最多服务2个,就可以将instance服务平摊到所有server上

@lulu2panpan
Copy link
Collaborator Author

单server设置最多服务2个,是基于instance的数目是静态的假设的,如果以后能做成动态的就好了,自动做balance操作。

@agapple
Copy link
Member

agapple commented Mar 9, 2016

你假定有10台server,但是在启动第一台server时是不知道还有剩余9台,所以启动第一台server时,要么就人为设置上限不加载所有instance,要么就是认为自己应该全部加载.
一旦集群启动完成后,节点的起停也有类似的问题,别人一旦抢占不会自动做均衡.

@lulu2panpan
Copy link
Collaborator Author

恩,这个如果真做的话,可以考虑通过zk做协调,metaq的消费端负载均衡就做到了动态调整。

@suhuaguo
Copy link

文档中说道:更新对应instance的running节点内容,将"active"设置为false,对应的running节点收到消息后,会主动释放running节点,让出控制权但自己jvm不退出,gracefully.
经过我的测试后,我发现 还是可以进行数据同步的

@suhuaguo
Copy link

所以;在 instance 是高可用的。在 server 层次是备份,但得做好监控。非常完美

@agapple
Copy link
Member

agapple commented Apr 18, 2016

理解正确,手工将active设置为false,可以手工干预集群负载

@chelubaiq
Copy link

@agapple 要做instance自动均衡,可以在多个server中用zk选个leader,由leader将多个instance均衡分配给不同的server节点(比如可用一致性哈希),分配结果写到zk目录,所有server监听这个zk目录,得到自己要处理的instance。leader在发现server节点有变化时,就重新分配。

@agapple
Copy link
Member

agapple commented May 3, 2016

@chelubaiq 按照我之前的规划,每个canal节点会有一个server id,会注册到后台manager系统,任务发布都是通过manager系统进行集群分配. 模型和otter有点像,大物理集群,通过配置定义的方式隔离出一堆的逻辑小集群(比如一个任务可以关联到1,2,3这几台server上).

之前偷懒的做法,就是使用了otter manager进行了任务分配,整个canal的集群管理并没有做起来,二期你仔细观察otter manager其实也预留了一些canal的多样性部署的case,比如嵌入式部署和独立式部署.
包括canal自身,也预留了文件队列store的 + 多client的模型,国内已有个别公司已经有实现,但国内开源氛围既如此,一般不太愿意贡献.

@StupppidB
Copy link

@agapple 想问一下,instance的running节点内容,将"active"设置为false,这个设置是在哪里设置?集群模式下的server,允许设置容量上限,最多同时服务多少个instance,这个也在哪里设置呢?

@agapple
Copy link
Member

agapple commented Jan 8, 2019

  1. instance的running节点的zk信息,原本active的属性设计为方便运维的,允许人肉干预的方式进行running节点切换
  2. 集群内的server下nstance的数量没有绝对的限制,走的是抢占模式,抢占比较适合小规模集群,如果instance规模比较多,建议切分为多个集群,各自集群抢占各自的,或者可以引入分配式的管控能力,这块大家也可以贡献

@agapple
Copy link
Member

agapple commented Jan 8, 2019

从canal 1.1.x系列开始,引入了比较多的开源贡献的代码,包括多语言客户端、多消费模式(MQ/tcp)、多adapter消费组件,同时也在运维层面做了一些改善,比如docker化部署、支持promethues监控,包括最近也在尝试提供web化的管控能力

未来也发展期待大家,可以在多个方面进行共建,包括但不局限于多语言、adapter组件、web管控、store实现等

@jianyun
Copy link

jianyun commented Feb 22, 2019

canal有web管理模块吗

@zl-pangu
Copy link

@agapple 想问一下,instance的running节点内容,将"active"设置为false,这个设置是在哪里设置?集群模式下的server,允许设置容量上限,最多同时服务多少个instance,这个也在哪里设置呢?

+1,请问找到在哪里配置了吗

@yansheng105
Copy link

@agapple 想问一下,instance的running节点内容,将"active"设置为false,这个设置是在哪里设置?集群模式下的server,允许设置容量上限,最多同时服务多少个instance,这个也在哪里设置呢?

+1,请问找到在哪里配置了吗

这个地方说的instance的running节点,是zookeeper里面的节点,在/otter/canal/destinations目录下有你的所有实例,实例下有running节点,用set命令改active的值就行了

@dartick
Copy link

dartick commented Sep 21, 2020

我这边有一个方案是给instance加权,然后每个server维护最大负载和当前负载,这样的话,如果每个instance权重一样,那就每个server会均摊;如果某个instance比较核心,那就加重权值到server的最大负载,这样子这个instance只会在一个server上跑。
整个逻辑很简单,对代码的侵入很小

@shmilbin1570
Copy link

我这边有一个方案是给instance加权,然后每个server维护最大负载和当前负载,这样的话,如果每个instance权重一样,那就每个server会均摊;如果某个instance比较核心,那就加重权值到server的最大负载,这样子这个instance只会在一个server上跑。 整个逻辑很简单,对代码的侵入很小

这样做server集群重启时,如果某个instance的负载占满server的负载,那剩下的instance不就被停止了。

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

10 participants