MySQL マスタースレーブ同期における server-id の例の詳細な説明

MySQL マスタースレーブ同期における server-id の例の詳細な説明

序文

MySQL クラスターを構築する場合、当然のことながら、データの一貫性を確保するために、データベースのマスターとスレーブの同期を完了する必要があります。マスタースレーブ同期には、1 つのマスターと複数のスレーブ、マスタースレーブの連鎖、複数のマスターと複数のスレーブなど、さまざまな方法があります。必要に応じて設定できます。ただし、マスターとスレーブの同期が必要な場合は、server-id の構成に注意する必要があります。そうしないと、マスターとスレーブのレプリケーション例外が発生します。

データベース データのレプリケーションとログ管理を制御するには、バイナリ ログ ファイル レコードとグローバル トランザクション ID に影響する server-id と server-uuid という 2 つの重要な構成があります。

サーバーID設定

マスター/スレーブ トポロジを使用する場合は、すべての MySQL インスタンスに一意のサーバー ID を指定してください。デフォルト値は 0 です。server-id=0 の場合、マスターはバイナリ ログを記録しますが、すべてのスレーブ接続を拒否します。スレーブは他のインスタンスへの接続を拒否します。

MySQL インスタンスの server-id はグローバル変数であり、直接表示できます。

mysql> '%server_id%' のような変数を表示します。
+---------------+-----------+
| 変数名 | 値 |
+---------------+-----------+
| サーバー ID | 171562767 |
+---------------+-----------+
セット内の 1 行 (0.00 秒)

グローバル変数 server-id はオンラインで直接変更できますが、すぐには有効にならないため、変更後はサービスを再起動することを忘れないでください。再起動後、システム構成ファイルが再度読み込まれるため、以前の変更は無効になります。したがって、オンラインで変更するのではなく、構成ファイルを変更してサービスを再起動することをお勧めします。

#私の.cnf
[mysqld]
#レプリケーション
ログ bin = mysql bin
サーバーID=171562767
同期バイナリログ=1
binlog-ignore-db=mysql
binlog-ignore-db=情報スキーマ

サーバーIDの使用

サーバー ID は、連鎖マスター スレーブまたはマルチ マスター マルチ スレーブ トポロジで SQL ステートメントの無限ループを防ぐためにデータベース インスタンスを識別するために使用されます。

  • binlogイベントのソースインスタンスをマークする
  • メイン データベースの binlog をフィルターします。サーバー ID が同じであることが判明した場合は、無限ループの実行を回避するためにイベントの実行をスキップします。
  • replicate-same-server-id=1 が設定されている場合、すべてのイベントが実行されますが、SQL ステートメントの無限ループが発生する可能性があります。

server-id を繰り返さない理由を説明するために、2 つの例を挙げてみましょう。

プライマリデータベースとスタンバイデータベースのサーバーIDが重複している場合

デフォルトでは replicate-same-server-id=0 であるため、スレーブ データベースはマスター データベースと同期されたすべてのデータをスキップし、マスター データとスレーブ データの間に不整合が生じます。

2つのスタンバイデータベースのサーバーIDが重複している場合

これにより、スレーブ データベースとマスター データベース間の接続が時々切断され、多数の例外が発生します。 MySQL の設計によれば、マスター データベースとスレーブ データベースはイベント メカニズムを通じて接続され、同期されます。新しい接続が行われたときに、サーバー ID が同じであることがわかった場合、マスター データベースは以前の接続を切断し、新しい接続を再登録します。データベース A がメイン データベースに接続されると、データベース B がそれに接続し、データベース A が切断されます。その後、データベース A が再接続し、このサイクルが繰り返され、大量の異常な情報が発生します。

サーバーID生成のルール

サーバー ID は同じにすることはできないため、インスタンスが 10 個ある場合、それぞれが異なることをどのように確認すればよいでしょうか?一般的に使用される方法はいくつかあります。

  • 乱数
  • タイムスタンプ
  • IPアドレス + ポート
  • 管理センターで一元的に配布し、自己増分IDを生成する

上記の方法はすべて問題ありませんが、最大値 2^32-1 を超えないように注意し、値は 2 より大きいことが望ましいです。私が使用している方法は、IP アドレスの下 2 桁 + ローカル MySQL インスタンス番号ですが、Docker を使用して複数のインスタンスを管理している場合、これをどのように生成しますか? 何かエレガントな解決策があるかどうか考えていただけますか?

サーバーUUID設定

MySQL サービスは、server-uuid 構成を自動的に作成して生成します。

  • ${data_dir}/auto.cnfファイル内のUUIDを読み取ります
  • 存在しない場合は、自動的にファイルを作成し、新しいUUIDを生成して読み取ります。
シェル> cat ~/mysql/data/auto.cnf
[自動]
サーバーUUID=fd5d03bc-cfde-11e9-ae59-48d539355108

auto.cnf 構成スタイルは my.cnf に似ていますが、このファイルには auto 構成ブロックと server-uuid 構成行のみが含まれています。自動的に作成されるため、内容を変更しないでください。

マスター スレーブ トポロジでは、マスターとスレーブは互いの UUID を認識できます。Master_UUID フィールドを表示するには、マスターで show slave hosts を使用し、スレーブで show slave status を使用します。

server-uuid パラメータは server-id パラメータを置き換えるものではありません。これらは機能が異なります。マスターインスタンスとスレーブインスタンスを同期するときに、マスターインスタンスとスレーブインスタンスの server-uuid が同じである場合、エラーが報告され、システムが終了します。ただし、replicate-same-server-id=1 を設定することでエラーを回避できます (非推奨)。

参考文献

  • 17.1.6 レプリケーションおよびバイナリ ロギングのオプションと変数: https://dev.mysql.com/doc/ref...
  • 一意のサーバー ID を生成する方法: https://www.jb51.net/article/169550.htm

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQL マスター スレーブ データベースが同期されない問題を解決する 2 つの方法
  • Mysql データベースのマスタースレーブ同期構成
  • この記事では、MySQLのマスタースレーブ同期の原理を説明します。
  • Docker環境でMySQLを実行し、Binlogを有効にしてマスタースレーブ同期を構成する方法
  • MySQL マスタースレーブ同期、トランザクションロールバックの実装原理
  • MySQLデータベースのマスタースレーブ同期の実際のプロセスの詳細な説明
  • MySQLデータベースのマスタースレーブ同期構成と読み取り書き込み分離
  • MySQL マスタースレーブ同期の原理と応用

<<:  Linux システムで httpd の自動インストールと構成を Ansible で実装する方法

>>:  Vite2とVue3を使用したウェブサイトの国際化を実現するプロセス全体

推薦する

VMware Workstation 15 Pro に Ubuntu 1804 をインストールするチュートリアル (画像とテキスト付き)

このメモはインストール チュートリアルです。実用的な意味はありません。記録のためだけに書いています。...

grpc のリバース プロキシとして nginx を使用する場合の落とし穴の概要

背景ご存知のとおり、nginx は高性能な Web サーバーであり、負荷分散やリバース プロキシによ...

MySQL 8.0ドライバとAlibaba Druidバージョン間の互換性の問題を解決

この記事では主に、MySQL 8.0 ドライバーと Alibaba Druid バージョン間の互換性...

MySQL 実験: explain を使用してインデックスの傾向を分析する

概要インデックス作成は、MySQL で習得しなければならないスキルであり、MySQL クエリの効率を...

MySQL SELECT実行順序の簡単な理解

SELECT ステートメントの完全な構文は次のとおりです。 (7)選択 (8) DISTINCT ...

HTML 要素に注釈を付けるときにクラスと ID のどちらが優れているかを分析する

Web ページには、非常に複雑な HTML 構造があります。CSS を使用して関連するスタイルを定義...

Vue で Excel インポート機能を実装する詳細な手順

1. フロントエンド主導の実装手順最初のステップは、ページのインポートボタンをクリックしてExcel...

負荷分散の基礎知識とnginxを使用した負荷分散の簡単な例

Nginx は、一般的に 7 層の負荷分散に使用できます。この記事では、負荷分散に関する基本的な知識...

MySQL 5.7 の一時テーブルスペースを使用して落とし穴を回避する方法

導入MySQL 5.7 は、SSL/TLS と全体的なセキュリティ開発におけるいくつかの重要な変更に...

JavaScript を使用して文字列内の最も繰り返しの多い文字を取得する方法

目次トピック分析する使用目的解決:コードは次のように実装されます。分析:配列とポインタ解決:コードは...

html5 の新しいメソッドを使用して JavaScript で要素クラス名を操作する方法の詳細な説明

目次1. classList属性2. 実用化以前の JavaScript では、最初にクラス属性を取...

MySQLで指定した時間前にレコードを自動的に削除する方法

イベントについて: MySQL 5.1 では、イベントの概念が導入され始めました。イベントは「時間ト...

Vueコンポーネント通信のさまざまな方法の詳細な説明

目次1. 父から息子へ2. 息子から父へ3. 親子関係のないコンポーネントの値の転送4. ヴュークス...

VMware Workstation に Windows Server 2019 をインストールする (グラフィック チュートリアル)

キーの入力を求められた場合は、[キーがありません]を選択します。デスクトップエクスペリエンスを選択す...

複数の X 軸を使用して 7 日間の天気予報を実現するための Echarts サンプル コード

目次UIデザインEcharts の例の効果序文サンプルコード最終結果UIデザイン Echarts の...