ホームページ >データベース >mysql チュートリアル >pt-heartbeat (percona ツールキット) に関するサンプルコード

pt-heartbeat (percona ツールキット) に関するサンプルコード

零下一度
零下一度オリジナル
2017-06-25 10:00:541017ブラウズ
pt-heartbeat は、マスター/スレーブのレイテンシを監視するために使用される Percona ツールです。MySQL アーキテクチャのほとんどは、MHA、MMM、keepalived およびその他のソリューションなど、依然としてマスター/スレーブのレプリケーションに基づいています。マスター/スレーブ環境では、マスター/スレーブの遅延問題が非常に懸念されます。通常、スレーブ ライブラリで次のステートメントを実行します。通常、次の 2 つのプロセスのステータスが監視され、マスターとスレーブの遅延にエラーがあるかどうかが判断されます:
Slave_IO_Running: Yes

Slave_SQL_Running: Yes
マスターの場合スレーブ遅延、最もよく監視できるのは SMB (Seconds_Behind_Master) を介して監視することですが、これはあまり信頼できません。または、Read_Master_Log_Pos-Exec_Master_Log_Pos 間の差を監視して、スレーブ ライブラリに遅延があるかどうか、およびマスター ライブラリに特定の遅延があるかどうかを確認できます。しかし、これも完全ではありません。まず、SMB について見てみましょう。SMB はサーバーの現在のタイムスタンプとバイナリ ログ内のイベント タイムスタンプを比較することによってどのように比較されるのでしょうか。誤検知が発生する可能性があります。たとえば、メイン ライブラリが大きなトランザクションを実行すると、実行に時間がかかり、スレーブ ライブラリからトランザクションを受信した後、タイムスタンプを比較して遅れていることがわかり、SMB 値が即座に増加します。 Read_Master_Log_Pos-Exec_Master_Log_Pos の値は完全に信頼できるわけではありません。 pt-heartbeat はこの問題の解決に役立ちます。 pt-heartbeat の原理を見てみましょう:
pt-heartbeat はマスター上にテーブルを作成し、特定の時間間隔でテーブルのフィールドを更新し、現在のタイムスタンプをテーブルに書き込み、比較します。マスターとスレーブの遅延は、スレーブ ライブラリのタイムスタンプと、pt-heartbeat が配置されているマシンのタイムスタンプによって決まります。 実際、ここには問題があります。pt-heartbeat がスレーブ データベースにデプロイされている場合、マスター マシンとスレーブ マシンの時刻が同期していることを確認する必要があります。これは通常、システムが毎日時刻を自動的に調整することで実現されます。 。 pt-heartbeat がメインライブラリにデプロイされている場合、そのような問題は発生しません。実際、私は個人的に、マスター/スレーブ データベース内のこのテーブルのタイムスタンプを比較して、遅延がより信頼できるかどうかを判断する方が良いと感じています。もちろん、これにはマスター/スレーブ クエリの問題も考慮する必要があります。
基本的な使い方を見てみましょう:
最初にテーブルを作成します:
mysql> show slave status\G*************************** 1. row ***************************Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.16.35Master_User: root
Master_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000016Read_Master_Log_Pos: 299786938Relay_Log_File: mxqmongodb2-relay-bin.000032Relay_Log_Pos: 299787151Relay_Master_Log_File: mysql-bin.000016Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0Last_Error:
Skip_Counter: 0Exec_Master_Log_Pos: 299786938Relay_Log_Space: 299787451Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0Last_IO_Error:
Last_SQL_Errno: 0Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 353306Master_UUID: 806ede0c-357e-11e7-9719-00505693235d
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 806ede0c-357e-11e7-9719-00505693235d:666-330347Executed_Gtid_Set: 6a4ab82c-4029-11e7-86b0-00505693235d:1-3,
806ede0c-357e-11e7-9719-00505693235d:1-330347Auto_Position: 1Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:1 row in set (0.00 sec)
テーブルの構造を見てみましょう:
[root@mxqmongodb2 bin]# ./pt-heartbeat --host=172.16.16.35 --port=3306 --user=root --password=123456 --database=test --update --create-table --daemonize

データベースを見てみましょう詳細にリンクします更新操作があります:
mysql> desc heartbeat;+-----------------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------------+------+-----+---------+-------+
| ts | varchar(26) | NO | | NULL | |
| server_id | int(10) unsigned | NO | PRI | NULL | |
| file | varchar(255) | YES | | NULL | |
| position | bigint(20) unsigned | YES | | NULL | |
| relay_master_log_file | varchar(255) | YES | | NULL | |
| exec_master_log_pos | bigint(20) unsigned | YES | | NULL | |
+-----------------------+---------------------+------+-----+---------+-------+6 rows in set (0.01 sec)
mysql> select * from heartbeat\G*************************** 1. row ***************************ts: 2017-06-23T09:27:49.001580server_id: 353306file: mysql-bin.000016position: 299837221relay_master_log_file: NULL
exec_master_log_pos: NULL1 row in set (0.00 sec)

実際、次の操作は、最新のデータを取得するためにハートビート テーブルを継続的に更新するプロセスを開始するだけです。
UPDATE `test`.`heartbeat` SET ts='2017-06-23T09:32:47.001330', file='mysql-bin.000016', position='29

次に、常に更新されるモニタリング プロセスを開始します。
[root@mxqmongodb2 bin]# ./pt-heartbeat --host=172.16.16.35 --port=3306 --user=root --password=123456 --database=test --update --daemonize

ここで、ストレス テストを開始し、再度観察します。見てください:
[root@mxqmongodb2 bin]# ./pt-heartbeat -D test --monitor -h 172.16.16.34 -uroot -P3306 -p1234560.00s [ 0.00s, 0.00s, 0.00s ]0.00s [ 0.00s, 0.00s, 0.00s ]0.00s [ 0.00s, 0.00s, 0.00s ]0.00s [ 0.00s, 0.00s, 0.00s ]0.00s [ 0.00s, 0.00s, 0.00s ]

遅延を観察してください:
[root@mxqmongodb2 tpcc-mysql]# ./tpcc_start -h127.0.0.1 -P3306 -d tpcc -u root -p123456 -w 10 -c 20 -r 10 -l 600

遅延状況を確認できます。これらの出力結果をファイルにリダイレクトして、マスター/スレーブ遅延を監視できます。も非常に効果的です。
ここで、データベースから sql_thread を手動で停止します:

0.71s [ 0.68s, 0.16s, 0.05s ]1.71s [ 0.71s, 0.17s, 0.06s ]0.85s [ 0.72s, 0.17s, 0.06s ]0.93s [ 0.74s, 0.18s, 0.06s ]0.00s [ 0.74s, 0.18s, 0.06s ]0.82s [ 0.73s, 0.18s, 0.06s ]0.66s [ 0.75s, 0.18s, 0.06s ]0.00s [ 0.75s, 0.18s, 0.06s ]0.88s [ 0.74s, 0.18s, 0.06s ]1.00s [ 0.74s, 0.19s, 0.06s ]
次に、出力結果を見てください:
mysql> stop slave sql_thread;
Query OK, 0 rows affected (0.03 sec)

増加し続けており、間隔が 1 秒であることがわかります。 .ベル。この sql_thread を再度開始すると、スレーブ ライブラリはすぐにメイン ライブラリに追いつきます。
または、次の方法で監視することもできます:

53.00s [ 23.85s, 6.77s, 4.20s ]54.00s [ 24.75s, 6.94s, 4.26s ]55.00s [ 25.67s, 7.12s, 4.32s ]56.00s [ 26.60s, 7.30s, 4.39s ]57.00s [ 27.55s, 7.48s, 4.45s ]58.00s [ 28.52s, 7.67s, 4.51s ]59.00s [ 29.50s, 7.86s, 4.58s ]60.00s [ 30.50s, 8.05s, 4.65s ]61.00s [ 31.50s, 8.23s, 4.71s ]62.00s [ 32.50s, 8.42s, 4.78s ]63.00s [ 33.50s, 8.61s, 4.85s ]64.00s [ 34.50s, 8.80s, 4.92s ]65.00s [ 35.50s, 8.98s, 5.00s ]
遅延を秒単位で直接返します。これもより信頼性が高くなります。この値をモニタリングに直接使用できます。

以上がpt-heartbeat (percona ツールキット) に関するサンプルコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。