AWSで実行されているMySQLインスタンスがあり、1秒あたり約5000の挿入があります。 binlog(行)とbinlogテーラーを使用した場合のパフォーマンスへの影響について何か考えはありますか?
私の理解では、binログテーラーは「リアルタイム」のデータ接続を可能にするためにMySQLbinlogを定期的にポーリングします。 binlogテーラーはNodeJSで実行されます。
重要なのは、MySQLを使用する必要があり、Meteorを使用してデータをクライアントにリアルタイムで取得したいということです。したがって、このbinlogテーラーを使用するという私の考え。
MySQLデータベースは非常に集中的に満たされるため(1秒あたり5000挿入)、binlog/binlogテーラーが深刻なパフォーマンスの問題を抱える時点を知りたいと思います。
Grts、トム
私は同様の機能を備えたソフトウェアを開発しました。MySQLレプリケーションストリーム(バイナリログ、binlog)を使用して、データベースへの挿入/更新/削除に応答してほぼリアルタイムでイベントをキャプチャする機能です。
これが私がパフォーマンスに関して行ったいくつかの観察です。幸いなことに、潜在的なホットスポットは互いにほとんど独立しています。
私はあなたが引用したNodeパッケージに慣れておらず、コードに大まかなレビューを与えたばかりなので、実際にはポーリングによってbinlogを「テーリング」していないと思いますが、実際にスレーブ/レプリカサーバーをエミュレートし、マスターに接続してレプリケーションストリームを要求します。
最初の潜在的なボトルネックは、必要な量のBinlogデータを書き込むマスターの機能です(I/Oスループットが主要な制約です)。マスターがすでにROW
形式でログインしている場合、この問題はすでに解決されています。そうでない場合は、Binlog形式を切り替えて、を参照してください。 I preferROW
形式、とにかく、クエリがうまくいかなかったり、アプリケーションが本来持ってはいけないデータに対して何かをしたりしたときのデータ回復に非常に役立つからです。 (サードパーティのツールを使用して)何が起こったかをキャプチャして元に戻すことができます。デフォルトの構成では、(たとえば)削除が発生すると、削除されたデータが実際にバイナリログに書き込まれます。
リソース消費の次のポイントは、そのようなツールによってマスターに確立されたスレーブ接続であり、マスターはデータをプッシュします。よくある誤解は、スレーブがマスターを「ポーリング」するというものです。実際、スレーブは接続を開始しますが、マスターはデータをプッシュします。これは実際にはマスターへの負荷であり、接続されているスレーブの数が少ない場合(たとえば、5以下)のパフォーマンスにはほとんど影響しません。この負荷は、「binlogテーラー」をマスターではなく、log_slave_updates
が構成されたマスターの既存のスレーブに接続することにより、マスターから完全に排除できます。
マスターから疑似スレーブへのデータの転送は、かなりのネットワーク帯域幅を消費する可能性があるため、外部ユーティリティは、この帯域幅を減らすためにMySQLクライアント/サーバー圧縮プロトコルをサポートする必要があります。この機能を有効にすると、ペイロードに応じて10:1の圧縮率を実現できます。
最後の問題点は、外部ユーティリティ自体です。 MySQL Binlog形式は、非常に密にパックされたバイナリ形式(したがって、「バイナリログ」)であり、解析およびデコードする必要があります。外部ユーティリティがこのデータストリームを解凍して操作できる効率によって、検出されたイベントをリアルタイムにどれだけ近づけることができるかが決まります。これは、非効率的なコードにより、決定したイベントストリームがマスターよりもさらに遅れるからですが、この要因はマスターサーバー自体にパフォーマンスへの影響はありません。
つまり、マスターが予想されるトラフィック量に対して行形式のbinlogを生成するワークロードを処理できる場合、残りの潜在的な問題は依然として潜在的な問題ですが、マスターサーバー自体に意味のあるパフォーマンスの影響はないはずです。