1. PXCの紹介1.1 PXC の紹介PXC は、MySQL の高可用性クラスタ ソリューションです。マスター スレーブ レプリケーション モードに基づく従来のクラスタ アーキテクチャと比較すると、PXC の最も顕著な特徴は、長年批判されてきたデータ レプリケーションの遅延の問題を解決し、基本的にリアルタイムの同期を実現できることです。さらに、ノード間の関係は平等です。 PXC はデータの一貫性を最も重視しています。物事を処理するときは、すべてのノードで実行するか、まったく実行しません。その実装メカニズムは、一貫性の処理に非常に厳格であると判断され、MySQL クラスターのデータ一貫性も完全に保証できます。 1.2 PXC の特徴と利点
PXCの最大の利点: 強力な一貫性と同期遅延がない 1.3 PXCの限界と欠点
1.4 PXCとレプリケーションの違い
1.5 PXC共通ポート
用語集:
2. 練習2.1 PXC クラスターの構築MySQLとは異なり、PXCはDockerイメージを公式に提供しているため、PXCクラスターを簡単に構築できます。 1) Dockerイメージをダウンロードする docker pull percona/percona-xtradb-cluster:5.7 画像の名前を変更する docker タグ percona/percona-xtradb-cluster:5.7 pxc:5.7 3) 元の画像を削除する docker rmi percona/percona-xtradb-cluster:5.7 PXC クラスターを独立して使用するための Docker ネットワークを作成する docker ネットワーク pxc-network を作成する 後でマウントするためのデータボリュームを作成する docker ボリューム作成 --name v1 docker ボリューム作成 --name v2 docker ボリューム作成 --name v3 注意: PXC コンテナーはデータ ボリュームのマウントのみサポートし、ディレクトリのマウントはサポートしません。 最初のノードの作成 docker run -di --name=pn1 --net=pxc-network -p 9000:3306 -v v1:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 pxc:5.7 後続のノードの追加は最初のノードに関連付ける必要があるため、データベースが起動するまで待つ必要があります。 docker logs pn1 でログを確認します。次の出力が表示されれば、起動が成功したことがわかります。
注意: CLUSTER_NAME 名にキーワード PXC を使用しないでください。そうしないと起動に失敗します。 2番目のノードに参加する docker run -di --name=pn2 --net=pxc-network -p 9001:3306 -v v2:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn1 pxc:5.7 2 番目のノード以降には、pn1 ノードとの同期を示す CLUSTER_JOIN=pn1 パラメータを追加する必要があることに注意してください。そうしないと、pn1 コンテナは自動的に閉じられます。 PXC クラスターに 2 つ以上のノードがある場合、マスター ノードの概念はありません。クラスターから最後に退出するノードがプライマリ ノードになり、/var/lib/mysql/grastate.dat ファイルの属性 safe_to_bootstrap の値が 0 から 1 に設定され、そのノードがプライマリ ノードであることを示します。 8) 3番目のノードを追加する docker run -di --name=pn3 --net=pxc-network -p 9002:3306 -v v3:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn2 pxc:5.7 今回は CLUSTER_JOIN が pn2 コンテナであることがわかります。これは、PXC クラスターに 2 つ以上のノードがある場合、マスター ノードの概念は存在しないという先ほど述べたことが正しいことを証明しています。 9) pn1ノードに入る docker exec -it pn1 /usr/bin/mysql -uroot -p123456 ステータスを表示 mysql> 'wsrep%' のようなステータスを表示します。 +----------------------------------+-------------------------------------------------+ | 変数名 | 値 | +----------------------------------+-------------------------------------------------+ | wsrep_local_state_uuid | 068dd5e8-cedd-11e9-904d-466e75bd8fe1 | | wsrep_プロトコルバージョン | 9 | | wsrep_last_applied | 16 | | wsrep_last_committed | 16 | | wsrep_replicated | 0 | | wsrep_replicated_bytes | 0 | | wsrep_repl_keys | 0 | | wsrep_repl_keys_bytes | 0 | | wsrep_repl_data_bytes | 0 | | wsrep_repl_other_bytes | 0 | | wsrep_received | 10 | | wsrep_received_bytes | 800 | | wsrep_local_commits | 0 | | wsrep_local_cert_failures | 0 | | wsrep_local_replays | 0 | | wsrep_local_send_queue | 0 | | wsrep_local_send_queue_max | 1 | | wsrep_local_send_queue_min | 0 | | wsrep_local_send_queue_avg | 0.000000 | | wsrep_local_recv_queue | 0 | | wsrep_local_recv_queue_max | 2 | | wsrep_local_recv_queue_min | 0 | | wsrep_local_recv_queue_avg | 0.100000 | | wsrep_local_cached_downto | 0 | | wsrep_flow_control_paused_ns | 0 | | wsrep_flow_control_paused | 0.000000 | | wsrep_flow_control_sent | 0 | | wsrep_flow_control_recv | 0 | | wsrep_flow_control_interval | [ 173, 173 ] | | wsrep_flow_control_interval_low | 173 | | wsrep_flow_control_interval_high | 173 | | wsrep_flow_control_status | オフ | | wsrep_cert_deps_distance | 0.000000 | | wsrep_apply_oooe | 0.000000 | | wsrep_apply_oool | 0.000000 | | wsrep_apply_window | 0.000000 | | wsrep_commit_oooe | 0.000000 | | wsrep_commit_oool | 0.000000 | | wsrep_commit_window | 0.000000 | | wsrep_local_state | 4 | | wsrep_local_state_comment | 同期されました | | wsrep_cert_index_size | 0 | | wsrep_cert_bucket_count | 22 | | wsrep_gcache_pool_size | 1592 | | wsrep_causal_reads | 0 | | wsrep_cert_interval | 0.000000 | | wsrep_open_transactions | 0 | | wsrep_open_connections | 0 | | wsrep_ist_receive_status | | | wsrep_ist_receive_seqno_start | 0 | | wsrep_ist_receive_seqno_current | 0 | | wsrep_ist_receive_seqno_end | 0 | | wsrep_incoming_addresses | 172.19.0.2:3306,172.19.0.3:3306,172.19.0.4:3306| | wsrep_cluster_weight | 3 | | wsrep_desync_count | 0 | | wsrep_evs_delayed | | | wsrep_evs_evict_list | | | wsrep_evs_repl_latency | 0/0/0/0/0 | | wsrep_evs_state | 動作中 | | wsrep_gcomm_uuid | 11ed51e2-cedd-11e9-b362-af453a7ac074 | | wsrep_cluster_conf_id | 3 | | wsrep_cluster_size | 3 | | wsrep_cluster_state_uuid | 068dd5e8-cedd-11e9-904d-466e75bd8fe1 | | wsrep_cluster_status | プライマリ | | wsrep_connected | オン | | wsrep_local_bf_aborts | 0 | | wsrep_local_index | 0 | | wsrep_provider_name | ガレラ | | wsrep_provider_vendor | Codership Oy <[email protected]> | | wsrep_provider_バージョン | 3.37(rff05089) | | wsrep_ready | オン | +----------------------------------+-------------------------------------------------+ セット内の行数は 71 行 (0.06 秒) wsrep_incoming_addressesの値は3つのコンテナのIPアドレスであることがわかります。 | wsrep_incoming_addresses | 172.19.0.2:3306,172.19.0.3:3306,172.19.0.4:3306 | クラスターの整合性チェック:
ノードステータスチェック:
レプリケーションのヘルスチェック:
遅いネットワークの問題を検出しています:
競合またはデッドロックの数:
2.2 クラスタ同期の検証ノード1にデータベーステストを作成する mysql> データベーステストを作成します。 クエリは正常、1 行が影響を受けました (0.02 秒) ノード 2 の表示: mysql> データベースを表示します。 +--------------------+ | データベース | +--------------------+ | 情報スキーマ | |mysql | | パフォーマンススキーマ | |システム| | テスト | +--------------------+ セット内の行数は 5 です (0.00 秒) ノード2にテーブルを作成する mysql> テストを使用します。 データベースが変更されました mysql> テーブル sys_user(id int 、name varchar(30)) を作成します。 クエリは正常、影響を受けた行は 0 行 (0.11 秒) 4) ノード3のテーブル構造を表示する mysql> テストを使用します。 テーブル名と列名の補完のためのテーブル情報の読み取り -Aでこの機能をオフにすると起動が速くなります。 データベースが変更されました mysql> テーブルを表示します。 +----------------+ | テスト中のテーブル | +----------------+ |システムユーザー| +----------------+ セット内の 1 行 (0.00 秒) ノード3にデータを挿入する mysql> sys_user に値(1,'a')を挿入します。 エラー 1105 (HY000): Percona-XtraDB-Cluster は、pxc_strict_mode = ENFORCING または MASTER で明示的な主キーのないテーブル (test.sys_user) での DML コマンドの使用を禁止します。 表示された主キーがないとデータを挿入できないことがわかったので、次のテーブル構造を変更します。 テーブル sys_user を変更し、主キー (id) を追加します。 データを挿入: mysql> sys_user に値(1,'a')を挿入します。 クエリは正常、1 行が影響を受けました (0.05 秒) 6) ノード1のテーブルデータを表示する mysql> sys_user から * を選択します。 +----+------+ | ID | 名前 | +----+------+ | 1 | へ | +----+------+ セット内の 1 行 (0.00 秒) 3 つのノードのデータが正常に同期されており、すべて読み取りおよび書き込み可能であることがわかります。 2.3 データベースノード操作の追加データベースが十分でない場合は、通常、負荷を分散するためにデータベース ノードを追加する必要があります。新しいノードを追加する操作を説明しましょう。 データボリュームの作成 docker ボリューム作成 --name v4 2) 新しいコンテナを追加する docker run -di --name=pn4 --net=pxc-network -p 9003:3306 -v v4:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn3 pxc:5.7 今回は CLUSTER_JOIN が pn3 に結合することに注意してください。 データを表示するにはノード4を入力してください mysql> データベースを表示します。 +--------------------+ | データベース | +--------------------+ | 情報スキーマ | |mysql | | パフォーマンススキーマ | |システム| | テスト | +--------------------+ セット内の行数は 5 です (0.00 秒) mysql> テストを使用します。 テーブル名と列名の補完のためのテーブル情報の読み取り -Aでこの機能をオフにすると起動が速くなります。 データベースが変更されました mysql> テーブルを表示します。 +----------------+ | テスト中のテーブル | +----------------+ |システムユーザー| +----------------+ セット内の 1 行 (0.00 秒) mysql> sys_user から * を選択します。 +----+------+ | ID | 名前 | +----+------+ | 1 | へ | +----+------+ セット内の 1 行 (0.00 秒) 以前のデータも自動的に同期されていることがわかります。 2.4 ダウンタイム操作ノードpn4コンテナを閉じてダウンタイムを発生させる ドッカー停止pn4 ノードpn2のクラスタステータスを確認する mysql> 'wsrep%' のようなステータスを表示します。 ...... | wsrep_local_state | 4 | | wsrep_local_state_comment | 同期されました | | wsrep_cert_index_size | 3 | ...... | wsrep_incoming_addresses | 172.19.0.4:3306,172.19.0.3:3306,172.19.0.2:3306 | クラスターには 4 つのノードがあるはずですが、現在は 3 つだけが正常に接続されていることがわかります。 3) ノードpn2で変更操作を実行する mysql> sys_user を更新し、name='b' を設定します (id=1)。 クエリは正常、1 行が影響を受けました (0.00 秒) 一致した行: 1 変更された行: 1 警告: 0 ノードpn4コンテナを起動する [root@VM_0_15_centos ~]# docker start pn4 コンテナpn4を入力して、変更操作が同期されているかどうかを確認します。 docker exec -it pn4 /usr/bin/mysql -uroot -p123456 mysql> テストを使用します。 テーブル名と列名の補完のためのテーブル情報の読み取り -Aでこの機能をオフにすると起動が速くなります。 データベースが変更されました mysql> sys_user から * を選択します。 +----+------+ | ID | 名前 | +----+------+ | 1 | バ | +----+------+ セット内の 1 行 (0.00 秒) ノードがクラスターに正常に参加し、データが同期されていることがわかります。 pn4 は、指定されたマスターノードの形で PXC クラスターに入ることによって作成されたコンテナです。pn1 が自分自身をマスターノードとしてコンテナを直接起動するとどうなりますか?これを実証してみましょう: pn1ノードをシャットダウンする ドッカー停止pn1 pn2ノードにデータを挿入する mysql> sys_user に値 ('2'、'c') を挿入します。 クエリは正常、1 行が影響を受けました (0.01 秒) pn1ノードを起動する docker スタート pn1 1分待ってコンテナの起動リストを確認します ドッカーps -a pn1ノードが起動されていないことが判明しました コンテナIDイメージ......ステータス名 fa123563e787 pxc:5.7 ...... 終了しました (1) 約1分前 pn1 エラーログを確認してください: docker ログ pn1 例外情報は次のとおりです。
中国語に翻訳:
pn1 ノードはクラスターから最後に離脱したノードではなく、マスター ノードとして起動できないため、エラー メッセージは明らかです。マスター ノードとして起動する場合は、grastate.dat ファイルの safe_to_bootstrap パラメータを 1 に調整する必要があります。 ただし、クラスター内の他のノードはシャットダウンされていないため、起動したコンテナは以前のクラスターと接続されておらず、データは同期されないことに注意してください。確認してみましょう。 データボリュームが保存されているパスを表示する docker ボリューム検査 v1 [ { "作成日時": "2019-09-05T09:22:22+08:00", "ドライバー": "ローカル", 「ラベル」: {}, 「マウントポイント」: 「/var/lib/docker/volumes/v1/_data」、 「名前」: 「v1」、 「オプション」: {}, 「スコープ」: 「ローカル」 } ] データボリュームディレクトリに入り、grastate.datファイルがあるかどうかを確認します。 [root@VM_0_15_centos ~]# cd /var/lib/docker/volumes/v1/_data [root@VM_0_15_centos _data]# ll 合計 323444 -rw-r----- 1 1001 1001 56 9月 5 08:34 auto.cnf -rw------- 1 1001 1001 1680 9月5日 08:34 ca-key.pem -rw-r--r-- 1 1001 1001 1120 9月5日 08:34 ca.pem -rw-r--r-- 1 1001 1001 1120 9月5日 08:34 client-cert.pem -rw------- 1 1001 1001 1676 9月5日 08:34 クライアントキー.pem -rw-r----- 1 1001 1001 2 9月5日 08:34 fa123563e787.pid -rw-r----- 1 1001 1001 134219048 9月5日 09:22 galera.cache -rw-r----- 1 1001 1001 113 9月5日 09:21 grastate.dat -rw-r----- 1 1001 1001 1300 9月5日 08:34 ib_buffer_pool -rw-r----- 1 1001 1001 79691776 9月5日 09:15 ibdata1 -rw-r----- 1 1001 1001 50331648 9月5日 09:15 ib_logfile0 -rw-r----- 1 1001 1001 50331648 9月5日 08:34 ib_logfile1 -rw-r----- 1 1001 1001 12582912 9月5日 08:38 ibtmp1 -rw-r----- 1 1001 1001 34751 9月5日 08:38 innobackup.backup.log drwxr-x--- 2 1001 1001 4096 9月5日 08:34 mysql drwxr-x--- 2 1001 1001 4096 9月5日 08:34 performance_schema -rw------- 1 1001 1001 1676 9月5日 08:34 private_key.pem -rw-r--r-- 1 1001 1001 452 9月5日 08:34 public_key.pem -rw-r--r-- 1 1001 1001 1120 9月5日 08:34 server-cert.pem -rw------- 1 1001 1001 1676 9月5日 08:34 server-key.pem drwxr-x--- 2 1001 1001 12288 9月5日 08:34 sys drwxr-x--- 2 1001 1001 4096 9月5日 09:07 テスト -rw-r--r-- 1 1001 1001 143 9月5日 09:22 version_info -rw-r----- 1 1001 1001 3932160 9月5日 09:15 xb_doublewrite ファイルの編集 vim グラステート.dat safe_to_bootstrapパラメータ値を1に変更し、保存して終了します。 # GALERA 保存された状態 バージョン: 2.1 ユーザID: 068dd5e8-cedd-11e9-904d-466e75bd8fe1 シーケンス番号: 20 ブートストラップに安全: 1 pn1コンテナを再起動します docker スタート pn1 コンテナに入り、データを表示する docker exec -it pn1 /usr/bin/mysql -uroot -p123456 mysql> テストを使用します。 テーブル名と列名の補完のためのテーブル情報の読み取り -Aでこの機能をオフにすると起動が速くなります。 データベースが変更されました mysql> sys_user から * を選択します。 +----+------+ | ID | 名前 | +----+------+ | 1 | バ | +----+------+ セット内の1行(0.01秒) データが同期されていないことがわかりました。pn1 ノードをクラスターに追加するにはどうすればよいでしょうか? pn1 コンテナを直接削除し、ノードを追加してコンテナを再作成することができます。また、以前にコンテナ データをデータ ボリュームにマウントしたため、データ損失のリスクはありません。実行してみましょう。 pn1コンテナを削除する ドッカー停止pn1 docker rm pn1 スレーブノードとしてクラスターに参加する docker run -di --name=pn1 --net=pxc-network -p 9000:3306 -v v1:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn2 pxc:5.7 コンテナが初期化されるまで待ちます 3) コンテナに入り、データが同期されているかどうかを確認します docker exec -it pn1 /usr/bin/mysql -uroot -p123456 mysql> テストを使用します。 テーブル名と列名の補完のためのテーブル情報の読み取り -Aでこの機能をオフにすると起動が速くなります。 データベースが変更されました mysql> sys_user から * を選択します。 +----+------+ | ID | 名前 | +----+------+ | 1 | バ | | 2 | へ | +----+------+ セット内の 2 行 (0.00 秒) データが同期されました。 MySQL PXC クラスターの構築手順に関するこの記事はこれで終わりです。MySQL PXC クラスターの構築の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Vue を通じて QR コードスキャン機能を実装する
>>: Linux で ss コマンドと zabbix を組み合わせてソケットを監視する方法の詳細な説明
人気があり強力な Apache Web サーバーで 2 つ以上のサイトをホストする方法。前回の記事で...
ボタン (input, button) を記述すると、IE では次のようになります。単語数が増えると...
この記事では、MySQL 5.6.37のダウンロード、インストール、設定のチュートリアルを参考までに...
境界線のスタイルborder-style プロパティは、表示する境界線の種類を指定します。 bord...
目次rocketmqイメージを取得する名前rvを作成する単一のブローカーノードを作成するrocket...
前面に書かれた近年、ライブストリーミング業界は非常に人気が高まっています。伝統的な業界でのライブスト...
JSはショッピングカート内の商品の合計金額を計算して参考とします。具体的な内容は以下のとおりです。質...
プロジェクトシナリオ: Vueプロジェクトを実行したらインデントエラーが出ました。ideaコンパイラ...
1. ワニスの紹介Varnish は、高性能なオープンソースのリバースプロキシサーバーおよび HTT...
大画面のデジタル スクロール効果は、最近の作業における大画面 UI ダイアグラムから生まれました。U...
HTML 開発の歴史: HTML は英語で Hypertext Marked Language の...
MySQL インストーラーは、MySQL ソフトウェアのあらゆるニーズに対応する、使いやすいウィザー...
1. MacにMySQLデータベースをインストールする1. MySQLデータベースをダウンロードする...
目次1. 初心者が陥りがちな間違い2. Iteratorのremove()メソッドを使用する3. f...
以下のように表示されます。 //managefee_managefee テーブルの年と月を照会し、c...