27_MySQL高可用性PXC

1.PXCの概要

公式のPerconahttps //www.percona.com/software/mysql-database/percona-xtradb-clusterを参照してください

PXC(Percona XtraDB Cluster)は、オープンソースのMySQL高可用性ソリューションです。Percona ServerとXtraBackupをGaleraライブラリと統合して、同期マルチマスターレプリケーションを実現します。ガレラベースの高可用性ソリューションには、主にMariaDBガレラクラスターとPercona XtraDBクラスターが含まれます。現在、PXCアーキテクチャは生産ラインでますます成熟して使用されています。マスタースレーブレプリケーションに基づく従来のMHAおよびデュアルマスタークラスターアーキテクチャと比較して、Galera Clusterの最も顕著な機能は、長期にわたる悪意のあるレプリケーション遅延の問題を解決し、基本的にリアルタイムの同期を実現できることです。そして、ノード間では、それらの相互関係は等しくなります。GaleraCluster自体もマルチマスターアーキテクチャです。PXCは、ストレージエンジンによって実装される同期レプリケーションであり、非同期レプリケーションであるため、データの整合性は非常に高くなります。

[外部リンクの画像転送に失敗しました。ソースサイトにアンチホットリンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-5tPDl9FV-1615780034023)(C:\ Users \ Administrator \ AppData \ Roaming \ Typora \ typora-user-images \ image-20210314150453680.png)]

PXCアーキテクチャを構築するには、クラスターを形成するために少なくとも3つのMySQLインスタンスが必要です。3つのインスタンスはマスタースレーブモードではありませんが、それぞれがマスターです。したがって、従属関係に関係なく、3つの間の関係は等しくなります。マルチマスターアーキテクチャとも呼ばれます。クライアントが読み取りと書き込みを行う場合、接続されているインスタンスは同じであり、読み取られるデータも同じです。任意のインスタンスに書き込んだ後、クラスターは新しく書き込まれたデータを他のインスタンスに同期します。このアーキテクチャはデータを共有しません。非常に冗長なクラスターアーキテクチャ。

1.1PXCの長所と短所

利点:

  • MySQLクラスターの高可用性と強力なデータ整合性を実現します。
  • 実際のマルチノード読み取り/書き込みクラスターソリューションを完了しました。
  • マスタースレーブレプリケーションの遅延の問題が改善され、リアルタイムの同期が基本的に実現されます。
  • 新しく追加されたノードは、事前に手動でバックアップしなくても自動的に展開できるため、メンテナンスに便利です。
  • マルチノード書き込みであるため、DBフェイルオーバーは簡単です。

短所:

  • 新しいノードに参加するには費用がかかります。新しいノードを追加するときは、完成したデータセットを既存のノードの1つからコピーする必要があります。データが100Gの場合は、100Gをコピーします。
  • 更新は、他のノードで実行する前にグローバルに検証する必要があります。クラスターのパフォーマンスは、パフォーマンスが最も悪いノードに制限されます。これは、バレルの法則と呼ばれることがよくあります。
  • データの整合性を確保する必要があるため、PXCはリアルタイムストレージエンジンを使用して同期レプリケーションを実装します。そのため、複数のノードが同時に書き込む場合、ロックの競合の問題はより深刻になります。
  • 拡張の問題があります。したがって、書き込み操作はノードで発生します。書き込み負荷のある大規模なシナリオでは、PXCは推奨されません。
  • innoDBストレージエンジンのみがサポートされています。

1.2PXCの原則

ここに画像の説明を挿入します

PXCの操作フローはおおまかに次のようになります。まず、クライアントが接続を要求する書き込みポイントにトランザクションを送信する前に、ノードは生成する必要のある認証ライトセットをブロードキャストし、次にグローバルトランザクションのIDを取得して送信します。他のノードにそれを.. 他のノードが認証を通じてデータをマージした後、競合するデータがないことを検出し、apply_cbおよびcommit_cd操作を実行します。それ以外の場合、トランザクションは破棄されます。

現在のノード(クライアントによって要求された書き込みノード)が検証に合格した後、commit_cb操作が実行され、okがクライアントに返されます。検証が失敗した場合は、rollback_cb。

実動ラインのPXCクラスターには、少なくとも3つのノードが必要です。同じノードが検証に失敗し、データの競合がある場合、現時点で採用されている方法は、データに一貫性のないノードをクラスターから削除することです。シャットダウンコマンドが自動的に実行され、自動的にシャットダウンされます。

1.3PXCの重要な概念

最初のステップは、クラスター内のノード数をスケーリングすることです。クラスターノード全体は、少なくとも3つから最大で8つの範囲内で制御されます。スプリットブレインはノードが2つある場合にのみ発生するため、少なくとも3つはスプリットブレインを防ぐためのものです。スプリットブレインのパフォーマンスは、任意のコマンドを入力することであり、結果は不明なコマンドです。

新しいノードがPXCクラスターに参加する場合、データの全量への貢献者として、クラスター内の各ノードからドナー(プロバイダー)ノードを選択する必要があります。PXCには、ノード用に2つのデータ送信方法があります。1つはSST完全送信と呼ばれ、もう1つはIST増分送信と呼ばれます。SST送信にはXtraBackup、mysqldump、rsyncの3つの方法がありますが、インクリメンタル送信にはXtraBackerのみがあります。一般に、データ量が多くない場合、SSTは全損失として使用できますが、XtraBackupメソッドのみが使用されます。

ノードクラスターでは、新しいノードの参加の失敗、同期の失敗などが原因で状態の切り替えが発生します。これらの状態の意味の例を次に示します。

  • open:ノードは正常に開始されました。クラスターへの接続を試みてください。
  • プライマリ:ノードはすでにクラスター内にあります。新しいノードがクラスターに参加すると、データ同期のためにドナーが選択されたときに状態が生成されます。
  • ジョイナー:ノードは同期されたデータファイルの受信を待機している状態です
  • joinerd:ノードは同期を完了し、進行状況をクラスター内の他のノードと一貫性のある状態に保とうとしています。
  • 同期済み:通常サービスを提供しているノードのステータス。同期が完了し、クラスターの進行状況が一貫していることを示します。
  • ドナー:ノードは、新しく追加されたノードに完全なデータを提供するときの状態です。

1.4PXCの重要な構成パラメーター

PXCを構築する過程で、my.cnfにいくつかのパラメーターを設定する必要があります

  • wsrep_cluster_name:クラスターの論理名を指定します。クラスター内のすべてのノードで、クラスター名は同じである必要があります。

  • wsrep_cluster_address:クラスター内の各ノードのIPアドレスを指定します

  • wsrep_node_name:現在のノードと質量の論理名を指定します

  • wsrep_node_address:現在のノードのIPアドレスを指定します

  • wwsrep_provider:Galeraライブラリパスを指定します

  • wsrep_sst_method:このモードでは、PXCはSST送信にXtraBackupを使用します。このパラメータはxtrabackup-v2を参照することを強くお勧めします

  • wsrep_sst_auth:認証資格情報をSSTとして<sst_user> <sst_pwd>として指定します。このユーザーは、最初のノードを起動した後に作成し、必要な権限を付与する必要があります

  • pxc_strict_mode:厳密モード。公式の推奨事項は、パラメーター値がENFORCINGであることです。

    PXCのもう1つの特に重要なモジュールは、Gcacheです。そのコア機能は、各ノードが現在の最新の書き込みセットをキャッシュすることです。新しいノードがクラスターに参加する場合、SSTメソッドを使用せずに、新しいデータ待機増分を新しいノードに渡すことができます。これにより、ノードがクラスターにすばやく参加できるようになります。GCacheモジュールには、次のパラメーターが含まれます。

  • gcache.size:書き込みセットの増分情報をキャッシュするために使用されるサイズを表します。デフォルトのサイズは128MBで、これはwsrep_provider_options変数パラメーターによって設定されます。2G〜4Gの範囲に調整することをお勧めします。十分なスペースは、より多くの増分情報をバッファリングするのに便利です。

  • gcache.page_size:メモリが不足している(Gcacheが不足している)場合は、書き込みセットをディスクファイルに直接書き込むことが理解できます。

  • gcache.mem_size:Gcacheのメモリキャッシュのサイズを表します。適度に増やすと、クラスター全体のパフォーマンスを向上させることができます。

1.5PXCクラスターステータスの監視

クラスターのセットアップ後、次のステータス変数 '%wsrep%'を使用して、クラスター内の各ノードのステータスを表示できます。問題の発見を容易にするためのいくつかの重要なパラメーターを次に示します。

[外部リンクの画像転送に失敗しました。ソースサイトにアンチホットリンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-9D8PgsSp-1615780034030)(C:\ Users \ Administrator \ AppData \ Roaming \ Typora \ typora-user-images \ image-20210314180644599.png)]

2.PXCを展開します

2.1環境の説明

必要なファイルのダウンロード:1111

住所計画:

CPU名 IPアドレス
pxc-node1 192.168.1.61
pxc-node2 192.168.1.64
pxc-node3 192.168.1.65

依存パッケージを解決する

yum install -y libev lsof perl-Compress-Raw-Bzip2 perl-Compress-Raw-Zlib perl-DBD-MySQL perl-DBI perl-Digest perl-Digest-MD5 perl-IO-Compress perl-Net-Daemon perl-PlRPC qpress socat openssl openssl-devel

// qpressパッケージがインストールされていない可能性があります。手動でインストールします。上記により、必要なパッケージが提供されます。

tar xf qpress-11-linux-x64.tar -C /usr/local/bin/

XtraBackupをインストールします

yum -y install percona-xtrabackup-24-2.4.18-1.el7.x86_64.rpm

mariadbをアンインストールする

rpm -e mariadb-libs --nodeps

mysqlユーザーとグループを作成します

groupadd -r mysql && useradd -M -s /bin/false -r -g mysql mysql

パッケージを/ usr / local / mysqlに解凍し、データディレクトリを作成して、権限を付与します

tar zxf Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101.tar.gz 
mv Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101 /usr/local/mysql

mkdir /usr/local/mysql/data
chown -R mysql:mysql /usr/local/mysql/

環境変数を構成する

tail -1 /etc/profile
export PATH=/usr/local/mysql/bin:$PATH
. /etc/profile

構成ファイルを準備します。binlog形式は行である必要があります。pxc-node2とpxc-node3の構成ファイルは同じですが、server_id、wsrep_node_name、wsrep_node_addressを変更する必要があることに注意してください。

[client]
port = 3306
socket = /tmp/mysql.sock
[mysql]
prompt="\u@\h \R:\m:\s[\d]> "
no-auto-rehash
[mysqld]
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
pid-file = db.pid
character-set-server = utf8mb4
skip_name_resolve = 1
open_files_limit = 65535
back_log = 1024
max_connections = 512
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
table_open_cache_instances = 64
thread_stack = 512K
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 768

interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/data/slow.log
log-error = /usr/local/mysql/data/error.log
long_query_time = 0.1
server-id = 1813306
log-bin = /usr/local/mysql/data/mysql-bin
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 1G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row
relay_log_recovery = 1
relay-log-purge = 1
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
lock_wait_timeout = 3600
explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_data_file_path = ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2

innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_neighbors = 0
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32

innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_online_alter_log_max_size = 4G
internal_tmp_disk_storage_engine = InnoDB
innodb_stats_on_metadata = 0

wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=1G"
wsrep_cluster_name=pxc-test
wsrep_cluster_address=gcomm://192.168.1.61,192.168.1.64,192.168.1.65
wsrep_node_name=pxc-node1
wsrep_node_address=192.168.1.61
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sst:pwd@123
pxc_strict_mode=ENFORCING
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
[mysqldump]
quick
max_allowed_packet = 32M

各ノードはMySQLの初期化を完了します

mysqld --defaults-file=/etc/my.cnf --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/  --initialize

2.3最初のノードを起動してクラスターを初期化します

pxc-node1でMySQLを起動します

mysqld --defaults-file=/etc/my.cnf --wsrep_new_cluster &
netstat -anput | grep mysql
tcp        0      0 0.0.0.0:4567            0.0.0.0:*               LISTEN      1691/mysqld         
tcp6       0      0 :::3306                 :::*                    LISTEN      1691/mysqld      

エラーログから一時パスワードを取得し、MySQLにログインしてルートパスワードを変更します

[root@pxc-node1 ~]# grep 'password' /usr/local/mysql/data/error.log 
2021-03-14T11:05:42.083115Z 1 [Note] A temporary password is generated for root@localhost: k-506%(lZJlu

root@localhost 19:09: [(none)]> alter user root@'localhost' identified by '123.com';

PXCでSST転送アカウントを作成します

root@localhost 19:09: [(none)]> grant all privileges on *.* to 'sst'@'localhost' identified by 'pwd@123';
root@localhost 19:13: [(none)]> flush privileges;

2.4クラスターに他のノードを追加する

pxc-node2とpxc-node3でMySQLを起動し、pxc-node2とpxc-node3をクラスターに追加します。プロセスには数分かかります。しばらくお待ちください。

mysqld --defaults-file=/etc/my.cnf &
netstat -anput | grep mysql
tcp        0      0 0.0.0.0:4567            0.0.0.0:*               LISTEN      2653/mysqld     

現在、pxc-node2とpxc-node3はpxc-node1からローカルにデータを同期しています

netstat -anput | grep mysql
tcp        0      0 0.0.0.0:4567            0.0.0.0:*               LISTEN      2653/mysqld         
tcp        0      0 192.168.1.64:4567       192.168.1.65:48590      ESTABLISHED 2653/mysqld         
tcp        0      0 192.168.1.64:41942      192.168.1.61:4567       ESTABLISHED 2653/mysqld         
tcp6       0      0 :::3306                 :::*                    LISTEN      2653/mysqld                

データはローカルに同期されているため、pxc-node1に設定されているrootユーザーのパスワードを直接使用してMySQLターミナルに直接ログインできます。

mysql -uroot -p123.com

クラスターのステータスを確認すると、現在のクラスターに3つのノードがあることがわかります。

root@localhost 11:30: [(none)]> show global status like '%wsrep_cluster_s%';
+--------------------------+--------------------------------------+
| Variable_name            | Value                                |
+--------------------------+--------------------------------------+
| wsrep_cluster_size       | 3                                    |
| wsrep_cluster_state_uuid | abd434e7-853e-11eb-b686-920f5f5a4d49 |
| wsrep_cluster_status     | Primary                              |
+--------------------------+--------------------------------------+
3 rows in set (0.00 sec)

root@localhost 11:33: [(none)]> show global status like '%wsrep_ready%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wsrep_ready   | ON    |
+---------------+-------+
1 row in set (0.00 sec)

2.5コピーを確認する

それらの1つにライブラリを作成して、他の2つが同期されているかどうかを確認します。

root@localhost 11:35: [(none)]> create database pxc
root@localhost 11:41: [(none)]> use pxc
root@localhost 11:41: [pxc]> create table test_t1 (
    -> id int primary key auto_increment,
    -> name varchar(22)
    -> );

root@localhost 11:43: [pxc]> insert into test_t1(name) values('zhangsan'),('lisi');

//他のノードで同期されているかどうかを確認します

root@localhost 11:45: [qin]> select * from pxc.test_t1;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  4 | lisi     |
+----+----------+
-> id int primary key auto_increment,
-> name varchar(22)
-> );

root @ localhost 11:43:[pxc]> test_t1(name)に挿入values( 'zhangsan')、( 'lisi');


//在其他节点查看是否同步

```bash
root@localhost 11:45: [qin]> select * from pxc.test_t1;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  4 | lisi     |
+----+----------+

おすすめ

転載: blog.csdn.net/weixin_45310323/article/details/114825269