Kafkaノート-信頼性、累乗性、トランザクション
4011 ワード
ここ数日は忙しいですが、今私に要求しているのは1週間に少なくとも1つの文章を出すことです.だから、まずこのノートを持って前菜を作ります.ソース分析では、明日から2日後に1つ書けると思います.誰も見ていなくても、自分を応援してください.
Kafkaは「コミットされた」メッセージ(committed message)に対して限られた永続化保証を行う.
コミットされたメッセージKafkaの複数のBrokerがメッセージを正常に受信し、ログファイルに書き込むと、プロバイダにメッセージが正常にコミットされたことを通知します.
限られた永続化は、1つのメッセージがN個のKafka Brokerに保存されている場合、少なくともこのN個のBrokerが少なくとも1個生存してこそ、メッセージが失われないことを保証することができることを保証する.
Kafka Producerは非同期送信であるため、producerを呼び出す.send(msg)はメッセージの送信に成功したとは考えられない.
したがって、Producerではコールバック通知付きの送信APIを常に使用し、producerを使用する.send(msg,callback).メッセージの送信に失敗すると、的確に処理することができる.
消費者はoffsetを更新してから、メッセージを消費します.この時、消費者が突然ダウンタイムになったら、このニュースは失われます.
だから私たちはまずメッセージを消費して、offsetの位置を更新します.しかし、これにより、メッセージの重複消費が発生します.
もう1つは、consumerがメッセージを取得した後、複数のスレッドが非同期にメッセージを処理し、consumerがoffsetを自動的に更新する場合である.スレッドのいずれかが失敗すると、メッセージが失われます.
このような場合、consumerは自動コミットシフトをオンにするのではなく、アプリケーションに手動でシフトをコミットします.
producerを使用する.send(msg,callback). acks=allを設定します.acksはProducerのパラメータであり、すべてのコピーBrokerがメッセージを受信することを意味し、このメッセージは「コミットされた」とみなされます. retriesを大きな値に設定します.Producerのパラメータで、Producerに対応して自動的に再試行されます.ネットワークジッタが発生した場合、メッセージの送信を自動的に再試行し、メッセージの損失を回避できます. unclean.leader.election.enable = false.どのBrokerがパーティションに立候補する資格があるかをコントロールするリーダー.あまり遅れているBrokerのリーダー選挙は許されないと述べた. replicationを設定.factor>=3.Brokerパラメータ、冗長Broker. min.insyncを設定.replicas>1.Brokerパラメータ.制御メッセージが少なくとも何個のコピーに書き込まれるかを「コミット済み」とします. replicationを確保する.factor>min.insync.replicas.2つが等しい場合、コピーマウントが1つある限り、パーティション全体が正常に動作しません.推奨設定はreplication.factor=min.insync.replicas+1. メッセージ消費がコミットされていることを確認します.Consumer側パラメータenbale.auto.commit、falseに設定し、シフトを手動でコミットします.
第2条と第6条を説明する:ISRに1つのコピーしかない場合、acks=allはacks=1に相当し、min.insyncを導入する.replicasの目的は、ISRのすべての書き込みのみを満たすことができず、ISRの書き込み個数がmin.insyncより少なくないことを保証する下限の制限を行うことである.replicas.
0.11.0.0リリースでは、べき乗等性Producerを作成する機能が導入されています.propsを設定するだけです.put(「enable.idempotence」,true)、またはprops.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG,true).
enable.idempotenceがtrueに設定されると、Producerは自動的にべき乗等性Producerにアップグレードされます.Kafkaは自動的に重さを落とす.Brokerはフィールドを多く保存します.Producerが同じフィールド値のメッセージを送信すると、Brokerはこれらのメッセージが重複していることを自動的に知ることができる.
有効範囲:は、単一パーティション上のべき乗等性のみを保証します.すなわち、1つのべき乗等性Producerは、あるトピックの1つのパーティションに重複メッセージが表示されないことを保証します. では、単一のセッションのべき乗等性しか実現できません.ここでのセッションは、Producerプロセスの1回の実行を指します.Producerプロセスを再起動した後、べき乗等性は保証されません.
Kafkaは0.11リリースでトランザクションのサポートを開始し、read committed独立性レベルのトランザクションを提供します.複数のメッセージがターゲットパーティションに原子的に書き込まれることを保証し、Consumerはトランザクションが正常にコミットされたメッセージしか表示されないことを保証します.
複数のメッセージが複数のパーティションに原子的に書き込まれることを保証します.このメッセージはすべて成功するか、すべて失敗しないか.トランザクションProducerもプロセスの再起動を恐れません.
Producer側の設定:オープン Producerエンドパラメータ を設定する.
さらに、initTransaction、beginTransaction、commitTransaction、abortTransactionなどの呼び出しトランザクションAPIも追加され、トランザクションの初期化、トランザクションの開始、トランザクションのコミット、およびトランザクションの終了に対応します.次のようになります.
このコードは、record 1とrecord 2が同じトランザクションとしてKafkaにコミットされるか、すべて成功するか、すべての書き込みに失敗するかを保証します.
Consumer側の設定:isolationを設定する.レベルパラメータ、現在2つの値があります. read_uncommitted:デフォルト値は、Consumer側がトランザクション型Producerがトランザクションをコミットしても終了しても、書き込まれたメッセージを読み取ることができることを示しています. read_committed:Consumerはトランザクション型Producerがトランザクション書き込みを正常にコミットしたメッセージのみを読み込むことを示します.トランザクション以外のProducerが書き込むすべてのメッセージが表示されることに注意してください.
しんらいせい
メッセージが失われないことを保証する方法
Kafkaは「コミットされた」メッセージ(committed message)に対して限られた永続化保証を行う.
コミットされたメッセージKafkaの複数のBrokerがメッセージを正常に受信し、ログファイルに書き込むと、プロバイダにメッセージが正常にコミットされたことを通知します.
限られた永続化は、1つのメッセージがN個のKafka Brokerに保存されている場合、少なくともこのN個のBrokerが少なくとも1個生存してこそ、メッセージが失われないことを保証することができることを保証する.
データ消失事例
生産者プログラム損失データ
Kafka Producerは非同期送信であるため、producerを呼び出す.send(msg)はメッセージの送信に成功したとは考えられない.
したがって、Producerではコールバック通知付きの送信APIを常に使用し、producerを使用する.send(msg,callback).メッセージの送信に失敗すると、的確に処理することができる.
消費者側のデータ損失
消費者はoffsetを更新してから、メッセージを消費します.この時、消費者が突然ダウンタイムになったら、このニュースは失われます.
だから私たちはまずメッセージを消費して、offsetの位置を更新します.しかし、これにより、メッセージの重複消費が発生します.
もう1つは、consumerがメッセージを取得した後、複数のスレッドが非同期にメッセージを処理し、consumerがoffsetを自動的に更新する場合である.スレッドのいずれかが失敗すると、メッセージが失われます.
このような場合、consumerは自動コミットシフトをオンにするのではなく、アプリケーションに手動でシフトをコミットします.
さいてきインプリメンテーション
第2条と第6条を説明する:ISRに1つのコピーしかない場合、acks=allはacks=1に相当し、min.insyncを導入する.replicasの目的は、ISRのすべての書き込みのみを満たすことができず、ISRの書き込み個数がmin.insyncより少なくないことを保証する下限の制限を行うことである.replicas.
べき乗等性
0.11.0.0リリースでは、べき乗等性Producerを作成する機能が導入されています.propsを設定するだけです.put(「enable.idempotence」,true)、またはprops.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG,true).
enable.idempotenceがtrueに設定されると、Producerは自動的にべき乗等性Producerにアップグレードされます.Kafkaは自動的に重さを落とす.Brokerはフィールドを多く保存します.Producerが同じフィールド値のメッセージを送信すると、Brokerはこれらのメッセージが重複していることを自動的に知ることができる.
有効範囲:
取引
Kafkaは0.11リリースでトランザクションのサポートを開始し、read committed独立性レベルのトランザクションを提供します.複数のメッセージがターゲットパーティションに原子的に書き込まれることを保証し、Consumerはトランザクションが正常にコミットされたメッセージしか表示されないことを保証します.
トランザクション・プログラム
複数のメッセージが複数のパーティションに原子的に書き込まれることを保証します.このメッセージはすべて成功するか、すべて失敗しないか.トランザクションProducerもプロセスの再起動を恐れません.
Producer側の設定:
enable.idempotence = true
transactional.id
さらに、initTransaction、beginTransaction、commitTransaction、abortTransactionなどの呼び出しトランザクションAPIも追加され、トランザクションの初期化、トランザクションの開始、トランザクションのコミット、およびトランザクションの終了に対応します.次のようになります.
producer.initTransactions();
try {
producer.beginTransaction();
producer.send(record1);
producer.send(record2);
producer.commitTransaction();
} catch (KafkaException e) {
producer.abortTransaction();
}
このコードは、record 1とrecord 2が同じトランザクションとしてKafkaにコミットされるか、すべて成功するか、すべての書き込みに失敗するかを保証します.
Consumer側の設定:isolationを設定する.レベルパラメータ、現在2つの値があります.