Kafkaのパーティションとコピーのメカニズム

プロデューサーパーティションの書き込みルール

概要概要

プロデューサーがトピックにメッセージを書き込むと、Kafkaは異なるルールに従って異なるパーティションにデータを割り当てます。パーティションデータが指定されている場合は、指定されたパーティションに書き込まれます。パーティションが指定されていない場合、指定されたパーティションは次のルールに従って実行されます。

分類

ハッシュパーティション(指定されたキーはデフォルトで有効になっています)
ここに画像の説明を挿入

長所:同じキーが同じパーティションに入ります。
短所:同じキーのハッシュの残りが同じであるため、データの偏りが発生します。

ポーリングパーティション(キーが指定されていない場合に開く)

ここに画像の説明を挿入

  • 最もよく使用される戦略でもあるデフォルトの戦略では、すべてのメッセージが1つのパーティションに均等に分散されるようにすることができます。
  • メッセージの生成時にキーがnullの場合、ポーリングアルゴリズムを使用してパーティションを均等に分散します

長所:データ分散がより均一になります。
短所:同じキーを持つデータが異なるパーティションに移動します
。2.xの前:パーティションのポーリング、2.xの後:スティッキーパーティション

ランダムパーティション(未使用)

ランダム戦略。毎回各パーティションにメッセージをランダムに割り当てます。以前のバージョンでは、デフォルトのパーティション戦略はランダム戦略でした。これは、各パーティションにメッセージを均等に書き込むことでもありました。ただし、後続のポーリング戦略のパフォーマンスは向上するため、ランダム戦略が使用されることはめったにありません。

カスタムパーティション
ここに画像の説明を挿入
実装コード:
1。カスタムパーティショナーを作成します

import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;

import java.util.Map;
import java.util.Random;

/**
 * @ClassName UserPartition
 * @Description TODO 自定义分区器,实现随机分区
 * @Date 2021/3/31 9:21
 * @Create By     Frank
 */
public class UserPartition implements Partitioner {
    
    

    /**
     * 返回这条数据对应的分区编号
     * @param topic:Topic的名
     * @param key:key的值
     * @param keyBytes:key的字节
     * @param value:value的值
     * @param valueBytes:value的字节
     * @param cluster:集群对象
     * @return
     */
    @Override
    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
    
    
        //获取Topic的分区数
        Integer count = cluster.partitionCountForTopic(topic);
        //构建一个随机对象
        Random random = new Random();
        //随机得到一个分区编号
        int part = random.nextInt(count);
        return part;
    }

    @Override
    public void close() {
    
    
        //释放资源
    }

    @Override
    public void configure(Map<String, ?> configs) {
    
    
        //获取配置
    }
}

2. Kafkaプロデューサー構成で、カスタムパーティショナーのクラス名をカスタマイズします
props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, 类所在包路径.UserPartition.class);

コピーメカニズム

概要概要

コピーはデータをバックアップするためのものです。Kafkaクラスター内のブローカーのデータ(パーティション)が失われたりダウンしたりした場合、他のブローカーのコピーが利用可能になります。

プロデューサーのACKSパラメーター

ACKSパラメーターは、メッセージのコピーを書き込むためのプロデューサーの要件の厳密さを示します。ACKSパラメーターが異なれば、パフォーマンスとセキュリティも異なります。

パラメータ分類

acksの構成は0です
ここに画像の説明を挿入
。acks= 0:Kafkaクラスターがメッセージを受信したかどうかに関係なく、プロデューサーは次のメッセージを直接送信します。長所
と短所:

メリット:優れたパフォーマンスは高速です
デメリット:データ損失が発生しやすく、確率が比較的高い

acksの構成は1です
ここに画像の説明を挿入
。acks= 1:プロデューサーはデータをKafkaに送信し、Kafkaはこのパーティションのリーダーコピーの書き込みが成功するのを待ち、ackの確認を返し、プロデューサーは次のパーティションを送信します。
長所と短所:

長所:パフォーマンスとセキュリティのバランスが取れている
短所:データが失われる可能性はありますが、その可能性は比較的小さいです

ACKはように構成され-1又は全てされ
ここに画像の説明を挿入
たACK =全/ -1:プロデューサはカフカにデータを送信し、カフカが書き込まれるように、このパーティションのすべてのコピーを待ち、ACK確認を返し、プロデューサは、次のいずれかを送信する
利点と短所:

長所:データセキュリティ
短所:遅い

補足:Kafkaがackを返さない場合はどうなりますか?

  • プロデューサーは、KafkaクラスターがACKSを返すのを待ち、待機時間があります。Kafkaが指定された時間内にACKSを返さない場合は、データが失われていることを意味します。
  • プロデューサーには、このデータをKafkaに再送信するための再試行メカニズムがあります

既存の問題:Kafkaクラスターデータが正常に書き込まれるたびにackが返されます。返されるプロセス中にKafkaがダウンすると、データの重複が発生します。解決方法は?

リンクをクリックして、Kafkaがこの問題をどのように解決するかを確認してください

おすすめ

転載: blog.csdn.net/zh2475855601/article/details/115346569
おすすめ