Los clústeres de Kafka y zookeeper garantizan la confiabilidad de los datos, el orden y el equilibrio de carga de la configuración

Modo de confirmación de respuesta de Kafka

• 0: los datos enviados por el productor no necesitan esperar a que los datos se coloquen en el disco para responder.

• 1: Los datos enviados por el productor, el líder responderá después de recibir los datos.

Posible situación: Posterior a la respuesta cuelga el líder y se hace reelección, en este momento no se envían los datos de la respuesta anterior.

• -1 (todos): los datos enviados por el productor, todos los nodos en las colas de Leader+ e isr responderán después de recopilar los datos. -1 es equivalente a todos.

Situaciones posibles: cuando un seguidor cuelga, responde tarde, por lo que internamente se mantiene un isr dinámico.Al enviar una solicitud o sincronizar datos, el isr se generará si no hay respuesta dentro de los 30 segundos de forma predeterminada.

Garantizar la fiabilidad de los datos

Si la réplica de la partición se establece en 1, o el número mínimo de réplicas en el ISR (min.insync.replicas es 1 de forma predeterminada) se establece en 1, el efecto es el mismo que ack=1, pero aún existe el riesgo. de números perdedores (líder: 0 , isr:0).

• Los datos son una condición completamente confiable = el nivel de ACK está establecido en -1 + la réplica de partición es mayor o igual a 2 + el número mínimo de réplicas reconocidas en ISR es mayor o igual a 2

Código

public class CustomProducer {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //属性配置
        Properties properties = new Properties();
        //连接集群
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.6.101:9092");
        //指定k、v序列化类型
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
        // 设置 acks
        properties.put(ProducerConfig.ACKS_CONFIG, "1");
        // 重试次数 retries,默认是 int 最大值,2147483647
        properties.put(ProducerConfig.RETRIES_CONFIG, 3);
        //创建生产者对象
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
        //像first主题发送数据
        kafkaProducer.send(new ProducerRecord<>("first", 1,"","lzq"),new Callback() {
            @Override
            public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                if (e==null){
                    System.out.println("发送成功,主题"+recordMetadata.topic()+"分区"+recordMetadata.partition());
                }
            }
        }).get();
        //关闭资源
        kafkaProducer.close();
    }
}

Problema de duplicación de datos

Al enviar datos, el líder los recibe, como un seguidor de forma sincrónica, y cuelga al responder 

idempotencia

La idempotencia significa que no importa cuántas veces el Productor envíe datos repetidos al Corredor, el lado del Corredor solo conservará una parte de los datos, lo que garantiza la no duplicación. Exactamente una vez = idempotente + al menos una vez (ack=-1 + número de réplicas de partición>=2 + número mínimo de réplicas en ISR>=2)

Criterios de juicio para datos duplicados: cuando se envía un mensaje con la misma clave principal, el corredor solo conservará un mensaje. El PID es uno nuevo que Kafka asignará cada vez que se reinicie; la partición representa el número de partición; el número de secuencia aumenta monótonamente. Entonces, la idempotencia solo puede garantizar que no haya repetición dentro de una sola partición y una sola sesión.

El parámetro abierto enable.idempotence por defecto es verdadero, falso para cerrar

proceso de trabajo

 Código

public class CustomProducer {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //属性配置
        Properties properties = new Properties();
        //连接集群
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.6.101:9092");
        //指定k、v序列化类型
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());
        //关联自定义分区
        properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,"com.lzq.producer.MyPartitioner");
        // 设置 acks
        properties.put(ProducerConfig.ACKS_CONFIG, "all");
        // 重试次数 retries,默认是 int 最大值,2147483647
        properties.put(ProducerConfig.RETRIES_CONFIG, 3);
        //指定事务id
        properties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG,"t1");
        //创建生产者对象
        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
        //初始化、开启时候
        kafkaProducer.initTransactions();
        kafkaProducer.beginTransaction();
        try {
            //像first主题发送数据
            kafkaProducer.send(new ProducerRecord<>("first", 1,"","lzq"),new Callback() {
                @Override
                public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                    if (e==null){
                        System.out.println("发送成功,主题"+recordMetadata.topic()+"分区"+recordMetadata.partition());
                    }
                }
            });
            //提交事务
            kafkaProducer.commitTransaction();
        }catch (Exception e){
            //回滚事务
            kafkaProducer.abortTransaction();
        }finally {
            //关闭资源
            kafkaProducer.close();
        }
    }
}

datos fuera de servicio

Kafka en 1.x y versiones posteriores garantiza que se ordena la partición única de datos y las condiciones son las siguientes:

(1) Si la idempotencia no está habilitada, max.in.flight.requests.per.connection debe establecerse en 1.

(2) Para habilitar la idempotencia, max.in.flight.requests.per.connection debe configurarse para que sea menor o igual a 5.

Motivo: porque después de kafka1.x, después de habilitar la idempotencia, el servidor kafka almacenará en caché los metadatos de las últimas cinco solicitudes enviadas por el productor, por lo que, en cualquier caso, se puede garantizar que los datos de las últimas cinco solicitudes estén en orden. que es almacenar en caché la solicitud primero en el reordenamiento

balanceo de carga

Cree un archivo josn vim themes-to-move.json

{  "temas": [  {"tema": "primero"}  ],  "versión": 1 }




Generar un plan de carga balanceada

bin/kafka-reassign-partitions.sh -- bootstrap-server 192.168.6.100:9092 --topics-to-move-json-file themes-to-move.json --broker-list "0,1,2,3 " --genero

Un plan de equilibrio de carga se genera automáticamente

Después de crear un archivo josn, copie el plan correspondiente

vim aumentar-factor-de-replicación.json

Plan de IMPLEMENTACION

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.6.100:9092 --reasignment-json-file aumento-factor-de-replicación.json --ejecutar

plan de verificación

bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.6.100:9092 --reasignment-json-file aumento-factor-de-replicación.json --verify

Desactivar nodos antiguos

Regenerar el plan de ejecución

bin/kafka-reasign-partitions.sh --bootstrap-server 192.168.6.100:9092 --topics-to-move-json-file themes-to-move.json --broker-list "0,1,2" - -generar

secuencia de comandos de inicio

#!/bin/bash
case $1 in
"start")
    for i in ip address
    do
        ssh $i "ruta absoluta"
;;
"stop")
;;
esac

Supongo que te gusta

Origin blog.csdn.net/weixin_52210557/article/details/123540618
Recomendado
Clasificación