maxwell高可用

本文链接:http://blog.csdn.net/qq_26238425/article/details/108759993

 

先对比一下

 

只有maxwell不支持HA,上面写的是定制,到现在我也没明白定制是什么意思...,还有那个分区指的是什么也没懂。

因为我们需要把mysql的数据同步到kafka中,所以那一段时间还是调研了比较多的同步工具的(nifi、canal、streamsets、dts、maxwell等等),每个基本都弄了一遍,说一下我为什么最后选择了maxwell(个人理解,别喷)

  • nifi:中间需要将数据放到缓存中(貌似是redis,应该有其他的,但是我没时间弄..)感觉有点复杂就pass了
  • canal:还是比较强的,有HA、还有比较多的功能等等,但是我没选择的原因是有一次和朋友讨论的过程中,他说他们公司之前用的是canal采集的是rds的数据,用过rds的哥们儿都知道rds只有主库才有binlog,然后因为canal一直监听主库的binlog,导致binlog没有被purge,最后磁盘满了,rds就锁了,大概是这样子昂,细节我也不太清楚。我也问了好多人,说canal没问题,不管了,我是个胆小的人,然后canal就被我pass了
  • streamsets:很好的东西,比nifi的界面强多了,功能很多,不对,应该说功能特别多,吊炸天的那种,但是国内没代理,开源版貌似被阉割过,使用他同步mysql数据的时候,如果改了表结构,sdc就会异常,然后你就重启吧,有时候还启动不起来,但是另一个朋友的公司一直在用,估计他们解决了吧
  • dts:aliyun的产品,功能很强大,各种东西都能同步(但是要花钱),我们业务端在用所以就白嫖了一下做了测试,将mysql数据同步到kafka后你会发现是Avro序列化的,要用一个工具包反序列化(我在他的工具包上改了一版,但是比较蛋疼,自己拼的格式,spark&flink要直接消费kafka的数据就要先解析一遍...),还有一个问题是dts同步到kafka是单分区的,不支持多分区,应该是要保证数据的有序性吧,总之不符合我们的业务场景
  • maxwell:怎么说呢,感觉简单吧,部署起来,配置一下就行了,但是没有高可用,并且我用的那个版本不能随机分区,只能根据database、table、primary key、transaction id、column data这几个来分区,后来我提了一个pr加了一个random,就是轮训分区。没高可用在生产环境是个很坑的事,所以在看了maxwell的源码后,发现是在自己的能力范围内的,就试着写了写maxwell的高可用

实现

通过curator-recipes来实现的,没什么复杂的,具体用法也很简单

  1. 先搞几台服务器来部署maxwell,高可用嘛!起码 >=3 吧(要能连通你的zookeeper集群,zookeeper集群自备)
  2. 在我的仓库里面clone到本地,然后打一个包,在target里面找到maxwell-1.26.4,弄到服务器上就可以了,如果想使用高本版的maxwell,那就把maxwell-1.xx.xx.jar在服务器里面替换一下(每一台都要替换)仓库地址:https://github.com/wanghangyu817/maxwell
  3. 最新版本https://github.com/wanghangyu817/maxwell1.33.0
  4. 正常配置maxwell,在你自己的启动脚本里面加上 
    --ha_mode = true --zookeeper_server ='host:port'

    其他的机器上也这样配置maxwell,然后把每个脚本都启动起来就可以了,这样就实现了maxwell的高可用,当一台maxwell挂掉的时候,其他节点的maxwell进程会接替并继续工作,我已经在生产上跑了,到现在没有任何异常,除非是mysql端异常,然后就会不断循环(我是有自动重启的),如果想知道哪一台是leaders可以执行bin下的maxwell-leaders脚本

    bin/maxwell-leaders --ha_mode = true --zookeeper_server ='host:port'

    会输出

    Maxwell's leaders now are xxxx

    就能知道哪一台是正在服务的maxwell进程了

  5. #!/bin/sh
    nohup
    maxwell --log_level='WARN' \
    --host='balabalabalabala' \
    --user='maxwell' \
    --password='balabalabalabala' \
    --port=3306 \
    --jdbc_options='autoReconnect=true&useCursorFetch=true&allowMultiQueries=true&rewriteBatchedStatements=true' \
    --ha_mode = true \
    --zookeeper_server ='host:port' \
    --sessionTimeoutMs = 2000 \
    --connectionTimeoutMs = 2000 \
    --maxRetries = 3 \
    --baseSleepTimeMs = 2000 \
    --client_id='balabalabalabala' \
    --gtid_mode=true \
    --replication_host='balabalabalabala' \
    --replication_password='balabalabalabala' \
    --replication_port=3306 \
    --replication_user='maxwell' \
    --replication_jdbc_options='autoReconnect=true&useCursorFetch=true&allowMultiQueries=true&rewriteBatchedStatements=true' \
    --producer='kafka' \
    --kafka.bootstrap.servers='xxxx:9092,xxxx:9092,xxxx:9092' \
    --producer_partition_by='random' \
    --kafka_topic='enheng' \
    --filter='exclude:*.*,include:db1.*,exclude:*./^tp/,exclude:*./ghc$/,exclude:*./gho$/' >> /mnt/maxwellLog/HNbb9LX8qU1590415271123.log  2>&1 &

    这是我们线上使用的配置,监控的我没写上,我个人建议在生产上把 exclude:*./^tp/,exclude:*./ghc$/,exclude:*./gho$/这几个正则加上,没准的你业务库会使用gh-ost等工具,如果不加的话,你就会发现你的数据都是双份的,如果下游接实时计算没过滤到位的话,不就重复计算了吗

综上就是maxwell高可用的使用方法,具体代码也在github,大神路过的时候可以看下哪里写的不妥或者存在bug指点下(毕竟我线上用着呢...),一起交流下

 

 

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值