Canal + Kafka经验

canal中写入kafka的BUG
kafka的默认最大消息大小是1M, canal作者也知道这个事, 所以往canal扔消息的时候, 会先做一个判断, 如果消息大小>1M, 会报错
但关键是他报错说的要把kafka的配置改大, 实际上是自己做了阉割, 怨不得kafka, 我横来竖去改了n遍kafka的配置也没用
目前我做的是修改了canal的源码:(GITHUB上最新版源码已经加上了这个配置)

vi server/src/main/java/com/alibaba/otter/canal/kafka/CanalKafkaProducer.java

public void init(MQProperties kafkaProperties) {
        this.kafkaProperties = kafkaProperties;
        Properties properties = new Properties();
        properties.put("bootstrap.servers", kafkaProperties.getServers());
        properties.put("acks", kafkaProperties.getAcks());
        properties.put("compression.type",kafkaProperties.getCompressionType());
        properties.put("retries", kafkaProperties.getRetries());
        properties.put("batch.size", kafkaProperties.getBatchSize());
        properties.put("linger.ms", kafkaProperties.getLingerMs());
        properties.put("buffer.memory", kafkaProperties.getBufferMemory());
        properties.put("key.serializer", StringSerializer.class.getName());
        properties.put("max.request.size", 268435456); ###添加这一行, 改为256M, 实际可以改的彻底一点, 让它可以从配置文件中获取
        if (!kafkaProperties.getFlatMessage()) {
            properties.put("value.serializer", MessageSerializer.class.getName());
            producer = new KafkaProducer<String, Message>(properties);
        } else {
            properties.put("value.serializer", StringSerializer.class.getName());
            producer2 = new KafkaProducer<String, String>(properties);
        }
        // producer.initTransactions();
    }
properties.put("max.request.size", );

当然, 要kafka自己也接受大于1M的消息, 也需要修改kafka的配置

vi server.properties

message.max.bytes=268435456
replica.fetch.max.bytes=268435456

canal + kafka网段
canal + kafka最好在同一个网段, 否则canal消息传递到kafka会非常慢

canal持久化
默认的持久化方式是文件, 进度会更新到conf/us_qa/meta.dat文件中, 下次启动再读这个文件
同时也会写到cd logs/us_qa/meta.log文件中, 可以从这个文件查看进度, 判断分析的进度
如果采用集群模式, 进度就会更新到zookeeper中, 需要从zookeeper中查看

网络问题
canal与source mysql之间网络存在问题时, 依然会存在binlog dump进程卡在writing to net的状况(二者这件的网络要好), 即使在同一网段, 依然可能会有问题, 目前我们在南京的环境两个虚拟机如果不在同一个物理主机上就会产生问题

canal时区/timstamp
canal在解析二进制日志的时候, 会将timestamp类型转换为时间, 但是根据JVM里面的时区设置
例如

-Duser.timezone=Asia/Shanghai

但目前canal —> 修改历史记录的, 我建议设置为UTC, 有需要的自己转.

kafka相关操作

  1. 查看consumer

    bin/kafka-consumer-groups.sh --bootstrap-server 10.168.3.145:9092 --group clickhouse --describe

  2. 重置offset

    /opt/kafka# bin/kafka-consumer-groups.sh --bootstrap-server 10.168.3.145:9092 --group clickhouse -topic mes --reset-offsets --to-offset 26720000 --execute

  3. 重置offset到最早

    bin/kafka-consumer-groups.sh --bootstrap-server 10.168.3.145:9092 --group mes_test --reset-offsets -all-topics --to-earliest

猜你喜欢

转载自blog.csdn.net/qq_22994783/article/details/85770384