カフカ読書ノート

カフカにおけるべき等とトランザクションの概念

1.べき等:簡単に言えば、インターフェイスへの複数の呼び出しの結果は、1つの呼び出しと同じです。

1.1。Kafkaでは、べき等を有効にするようにプロデューサーを設定する必要があります:properties.put(ProducerConfig .ENABLE_IDEMPOTENCE CONFIG、true); 
およびデフォルトのretries = Integer.MAX_VALUE; acks = -1; max.in.flight.requests.per .connection = 5。

1.2。プロデューサーのアイデンティティを実現するために、KafkaはプロデューサーID(PID)とシーケンス番号(シーケンス番号)の2つの概念を導入します。
各PIDについて、メッセージの送信先の各パーティションには対応するシリアル番号があります。数は最初から単調に増加します。プロデューサーがメッセージを送信するたびに、<PIDパーティション>に対応するシリアル番号の値が1ずつ増加します。
ブローカーは、<PID、パーティション>の各ペアのシリアル番号をメモリに保持します。受信したメッセージごとに、シリアル番号の値(SN_new)がブローカー側で維持されている対応するシリアル番号の値(SN_old)よりも1(SN_new = SN_old + 1)大きい
場合にのみ、 ブローカーはメッセージを受信します。SN_new<SN_old + 1 、その後、メッセージが繰り返し書き込まれました。ブローカーはそれを直接破棄できます。SN_new> SN_old + 1の場合、途中に書き込まれていないデータがあり、メッセージが失われる可能性があることを意味する無秩序があり、
対応するプロデューサーは例外をスローします。Kafkaは<pid、partition>などのデータ結果のみを維持するため、単一のプロデューサーセッション内の単一のパーティションのみがべき等になる可能性があることを示しています。

2.トランザクション:操作のアトミック性を確保するため。つまり、複数の操作がすべて成功またはすべて失敗します。部分的な成功または部分的な失敗の可能性はありません。

2.1。Kafkaでトランザクションを実装するには、以下を設定する必要があります。properties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG、 "transaction_Id");べき等構成も設定する必要があります。

2.2。kafkaのトランザクションには、2つの分離レベルがあります。read_uncommitted[コンシューマーアプリケーションが(消費された)コミットされていないトランザクションを表示できることを意味します。もちろん、コミットされたトランザクションにも表示されます]、
read_committed [は、コンシューマーアプリケーションがメッセージを表示できないことを意味します。コミットされていないトランザクション]。たとえば、プロデューサーがトランザクションを開始し、3つのメッセージmsgl、msg2、およびmsg3を特定のパーティション値に送信する場合、commitTransaction()、bortTransaction()メソッドを実行する前に、
「read_committed」に設定されたコンシューマーアプリケーションは実行できません。これらのメッセージを消費しますが、これらのメッセージはKafkaConsumer内にキャッシュされ、プロデューサーがcommitTransaction()メソッドを実行するまで、これらのメッセージをコンシューマーアプリケーションにプッシュできます。逆に、プロデューサー
がabortTransaction()メソッドを実行すると、KafkaConsumerはこれらのキャッシュされたメッセージをコンシューマーアプリケーションにプッシュせずに破棄します。

2.3。kafka__transaction_stateトピックは、ユーザーの対応するトランザクションIDのkafkaトランザクション状態を格納するために使用されます。各トランザクションIDのトランザクションステータス情報は、[hash( "transaction_Id")%partitionNums]のパーティションに送信されます。

Kafkaでのトランザクションのサンプルコード: 

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("transactional.id", "my-transactional-id");
Producer<String, String> producer = new KafkaProducer<>(props, new StringSerializer(), new StringSerializer());

producer.initTransactions();

try {
 producer.beginTransaction();
 for (int i = 0; i < 100; i++)
	 producer.send(new ProducerRecord<>("my-topic", Integer.toString(i), Integer.toString(i)));
 producer.commitTransaction();
} catch (ProducerFencedException | OutOfOrderSequenceException | AuthorizationException e) {
 // We can't recover from these exceptions, so our only option is to close the producer and exit.
 producer.close();
} catch (KafkaException e) {
 // For all other exceptions, just abort the transaction and try again.
 producer.abortTransaction();
}
producer.close();

Kafkaの_consumer_offsetsの概念

トピックは、コンシューマーがクラスター内で初めてメッセージを消費するときに作成されます。トピックoffsets.topic.replication.factor = 3; offsets.topic.num.partitions = 50;
各コンシューマーグループで送信されるオフセットは次のようになります。 [hash(consumer-groupId)%partitionNums]を使用してパーティションに送信します。
その中で、ブローカー側のコンシューマーによって送信されるメッセージの存在イベントの構成は、バージョン2.0.0以降ではoffsets.retention.minutes = 10080、以前はoffsets.retention.minutes = 1440です。
消費者が長い時間間隔の後に消費タスクを再度実行する場合、間隔がoffsets.retention.minutesを超えると、元の消費変位情報が失われます。消費の場所は、クライアントのauto.offset.resetパラメーターに従ってのみ選択できます。

_consumer _offsetsのコンテンツを表示します。たとえば
、consumerGroupIdのコンシューマーグループのオフセットコンテンツを表示するには、対応するコンシューマーグループに対応するパーティション番号を計算する必要があります。

bin / kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic __consumer_offsets partition 20 --formatter "kafka.coordinator.group.GroupMetadataManager.OffsetsMessageFormatter"


カフカのARとISRコレクションのコンセプト

1.パーティションには1つのコピーが含まれ、そのうちの1つはリーダーコピーで、残りはフォロワーコピーであり、各
コピーは異なるブローカーノードに配置されます。リーダーコピーのみが外部サービスを提供し、フォロワーコピーは
データ同期のみを担当します。パーティション内のすべてのコピーは、まとめてWeiARと呼ばれます。

2. ISRは、リーダーレプリカと同期されるレプリカのコレクションを指します。無効なコピー:ISRセットの外部、つまり、同期障害または機能障害にあるレプリカ(たとえば、コピーが
非存続状態にある)は、まとめて無効コピーと呼ばれ、無効コピーに対応するパーティションも無効コピーと呼ばれます。同期障害パーティション、つまり複製不足ゾーンと呼ばれます

カフカのLEOとHWの概念

1. LEOは、各パーティションの最後のメッセージの次の位置を識別し、パーティションの各コピーには独自のLEOがあります。
2. ISRで最小のLEOはHWであり、一般に最高水準点として知られています。消費者はHWの前にのみニュースを引き出すことができます。


Kafkaのトピックパーティション管理:

1.無効なレプリカ
bin / kafka-topics.sh --zookeeper localhost:2181 / kafka --describe --topic my_topicunder-replicated-partitionsをクエリします

カフカの消費者管理:

1.コンシューマーの消費
ビン/ kafka-consumer-groupsを確認します。sh--bootstrap-serverlocalhost:9092 --describe --group ConsumerGroup

2.コンシューマーのステータスを表示します
bin / kafka-consumer-groups.sh --bootstrap-server localhost:9092 --descrbe --group ConsumerGroup --state

3.各コンシューマーグループのメンバー情報を表示します
bin / kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group ConsumerGroup --members

3.各コンシューマーメンバーの分布を確認し
ますbin / kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group ConsumerGroup --members --verbose

4.指定されたコンシューマーグループを削除します
bin / kafka-consumer-groups.sh --bootstrap-server localhost:9092 --delete --group ConsumerGroup

カフカ消費オフセット管理

1.コンシューマーグループのコンシューマーグループ内のすべての
トピックのオフセットをリセットするには、bin / kafka-consumer-groups.sh --bootstrap-server localhost:9092 --groupconsumerGroupを消費するコンシューマーグループ内のコンシューマーが存在しないようにする必要があります。--all-topics --reset-offsets --to-earliest --execute

2.コンシューマーグループ内の指定されたトピックパーティションのオフセット
bin / kafka-consumer-groups.shをリセットします--bootstrap-serverlocalhost:9092 --group ConsumerGroup --topic topic-monitor:2 --reset-offsets- to--latest --execute

前の2つの例では、to-earlystパラメーターとto-latestパラメーターを使用して、消費変位をパーティションの最初と最後にそれぞれ調整しました。

さらに、kafka-consumer-groups.shスクリプトには、さらに多くのオプションがあります。

by-duration <String:duration>:現在の時刻の指定された間隔から最も早い変位に消費変位を調整します。持続時間の形式は「pnDTnHnMnS」です。

from-file <文字列:CSVファイルへのパス>:消費変位をcsvファイル内の場所にリセットします。

shift-by <Long:number-of-offsets>:消費変位を現在の変位+ mber-of-offsetsに調整します。umber-of-offset〜は負の数にすることができます

to-current:消費変位を現在の位置に調整します。

to-datetime <String:datatime>:消費変位を指定された時間よりも大きい最も早い変位に調整します。データ時間の形式は「YYYY-MM-DDTHH:mm:SS.sss」です。

to-offset <Long:offset>:消費変位を指定位置に調整します。


Kafkaは手動でメッセージを削除します:

kafka-delete-records.shスクリプト。このスクリプトを使用して、指定した場所より前のメッセージを削除できます。

まず、パーティションごとに削除する必要があるオフセットの前にメッセージを指定し、次のdelete.jsonファイルを書き込みます。

{
	"partitions":[
		{
			"topic":"my_topic",
			"partition":0,
			"offset":10
		},
		{
			"topic":"my_topic",
			"partition":1,
			"offset":10
		},
		{
			"topic":"my_topic",
			"partition":2,
			"offset":10
		}
	],
	"version":1
}

削除コマンドを実行し
ますbin / kafka-delete-records.sh --bootstrap-server localhost:9092 --offset-json-file delete.json 

おすすめ

転載: blog.csdn.net/qq_32323239/article/details/103549265