Galera Cluster4.0はMariaDB10.4の一部として最初にリリースされ、このバージョンのリリースには多くの重要な改善があります。このリリースで最も印象的な機能は、次の問題を処理するように設計されたストリーミングレプリケーションです。
以前のブログでは、2部構成のシリーズブログ(パート1とパート2)の新しいストリーミングレプリケーション機能について詳しく説明しました。 Galera 4.0のこの新機能の一部は、GaleraClusterノードとストリーミングレプリケーションで処理されたログのクエリとチェックに非常に役立つ新しいシステムテーブルです。
以前のブログでも、AWSにMySQL Galera Clusterをデプロイする簡単な方法と、AmazonAWSEC2にMySQLGaleraCluster4.0をデプロイする方法を紹介しました。
Perconaは、Percona XtraDB Cluster(PXC)8.0のGAをまだリリースしていません。これは、MySQL wsrep関数WSREP_SYNC_WAIT_UPTO_GTIDなど、まだ存在していないように見える一部の機能がまだ開発中であるためです(少なくともPXC 8.0.15-5-27dev.4.2バージョン)。それでも、PXC 8.0がリリースされると、次のような優れた機能が満載されます...
PXC 8.0 GAのリリースを待っている間、このブログでは、MariaDBを使用してAmazonAWSでGaleraCluster4.0のホットスタンバイノードを作成する方法について説明します。
ホットスタンバイは、特に高度に分散されたシステムでは、コンピューティングの一般的な用語です。これは、1つのシステムが同一のプライマリシステムと同時に実行される冗長性の方法です。プライマリノードで障害が発生すると、ホットスタンバイがすぐにプライマリシステムの交換を引き継ぎます。データは両方のシステムにリアルタイムでミラーリングされます。
データベースシステムの場合、ホットスタンバイサーバーは通常、強力なリソース(マスターと同じ)で実行されているプライマリマスターに続く2番目のノードです。このセカンダリノードは、正しく機能するためにプライマリマスターと同じくらい安定している必要があります。
マスターノードまたはクラスター全体がダウンした場合、データ回復ノードとしても機能します。ホットスタンバイノードは、クライアントからの要求に継続的に対応しながら、障害のあるノードまたはクラスターを置き換えます。
Galera Clusterでは、クラスターの一部であるすべてのサーバーがスタンバイノードとして機能できます。ただし、リージョンまたはクラスター全体がダウンした場合、これにどのように対処できますか?クラスタの特定のリージョンまたはネットワークの外部にスタンバイノードを作成することは、ここでの1つのオプションです。
次のセクションでは、MariaDBを使用してAWSEC2でスタンバイノードを作成する方法を示します。
AmazonAWSでのホットスタンバイの導入
これまで、AWSでGaleraクラスターを作成する方法を説明しました。 Galera 4.0を初めて使用する場合は、「MySQL GaleraCluster4.0をAmazonAWSEC2にデプロイする」をお読みください。
ホットスタンバイノードのデプロイは、同期レプリケーションを使用する別のガレラクラスターのセット(このブログをチェックしてください。リレーノードを使用したMySQLガレラクラスターによるダウンタイムゼロネットワーク移行)または非同期MySQL/MariaDBノードをデプロイします。 。このブログでは、Galeraノードの1つから非同期に複製するホットスタンバイノードをセットアップして展開します。
このサンプルセットアップでは、MariaDB10.4.8バージョンを使用して3ノードクラスターをデプロイしました。このクラスターは米国東部(オハイオ)地域で展開されており、トポロジは次のとおりです。
非同期スレーブのマスターとして、172.31.26.175サーバーを使用しますこれはスタンバイノードとして機能します。
AWSコンソールで、[コンピューティング]セクションの下にあるEC2に移動し、[インスタンスの起動]をクリックして、以下のようにEC2インスタンスを作成します。
このインスタンスは、米国西部(オレゴン)地域で作成します。 OSの種類に応じて、好きなサーバー(Ubuntu 18.04が好きです)を選択し、好みのターゲットの種類に基づいてインスタンスの種類を選択できます。この例では、高度なセットアップを必要とせず、このサンプル展開専用であるため、t2.microを使用します。
前述したように、ホットスタンバイノードは別のリージョンに配置し、同じリージョン内に配置しないことをお勧めします。そのため、地域のデータセンターがダウンしたり、ネットワークが停止したりした場合、問題が発生したときにホットスタンバイをフェイルオーバーのターゲットにすることができます。
続行する前に、AWSでは、さまざまなリージョンに独自の仮想プライベートクラウド(VPC)と独自のネットワークがあります。 Galeraクラスターノードと通信するには、最初にVPCピアリングを定義して、ノードがAmazonインフラストラクチャ内で通信できるようにし、ネットワークの外部に出てオーバーヘッドとセキュリティ上の懸念を追加する必要がないようにする必要があります。
まず、ホットスタンバイノードが存在するVPCに移動し、次にピアリング接続に移動します。次に、スタンバイノードのVPCとGaleraクラスターのVPCを指定する必要があります。以下の例では、us-west-2がus-east-2に相互接続しています。
作成すると、ピアリング接続の下にエントリが表示されます。ただし、この例ではus-east-2にあるGaleraクラスターVPCからのリクエストを受け入れる必要があります。以下を参照してください
受け入れたら、CIDRをルーティングテーブルに追加することを忘れないでください。 VPCピアリングの後にそれを行う方法については、この外部ブログVPCPeeringを参照してください。
では、戻ってEC2ノードの作成を続けましょう。セキュリティグループに、開く必要のある正しいルールまたは必要なポートがあることを確認してください。詳細については、ファイアウォール設定マニュアルを確認してください。この設定では、これは単なるテストであるため、すべてのトラフィックを受け入れるように設定しました。以下を参照してください
インスタンスを作成するときに、正しいVPCを設定していることを確認してください。適切なサブネットを定義しました。それについて助けが必要な場合は、このブログをチェックしてください。
MariaDB非同期スレーブのセットアップ
まず、リポジトリを設定し、リポジトリキーを追加して、リポジトリキャッシュのパッケージリストを更新する必要があります。
$ vi /etc/apt/sources.list.d/mariadb.list
$ apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
$ apt update
MariaDBパッケージとそれに必要なバイナリをインストールします
$ apt-get install mariadb-backup mariadb-client mariadb-client-10.4 libmariadb3 libdbd-mysql-perl mariadb-client-core-10.4 mariadb-common mariadb-server-10.4 mariadb-server-core-10.4 mysql-common
次に、xbstreamを使用してバックアップを取り、Galeraクラスター内のノードの1つからネットワークにファイルを転送しましょう。
##ホットスタンバイノードに新しくインストールされたMySQLのデータディレクトリを消去します。
$ systemctl stop mariadb
$ rm -rf /var/lib/mysql/*
##次に、ホットスタンバイノードで、これをターミナルで実行します。
$ socat -u tcp-listen:9999,reuseaddr stdout 2>/tmp/netcat.log | mbstream -x -C /var/lib/mysql
##次に、ターゲットマスター、つまりガレラクラスター内のノードの1つ(この例ではノード172.31.28.175)で、これをターミナルで実行します。
$ mariabackup --backup --target-dir=/tmp --stream=xbstream | socat - TCP4:172.32.31.2:9999
ここで、172.32.31.2はホストスタンバイノードのIPです。
MySQL構成ファイルを準備します。これはUbuntuにあるので、/ etc / mysql / my.cnfのファイルを編集しており、ClusterControlテンプレートから取得した次のサンプルmy.cnfを使用しています。
[MYSQLD]
user=mysql
basedir=/usr/
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
pid_file=/var/lib/mysql/mysql.pid
port=3306
log_error=/var/log/mysql/mysqld.log
log_warnings=2
# log_output = FILE
#Slow logging
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time=2
slow_query_log=OFF
log_queries_not_using_indexes=OFF
### INNODB OPTIONS
innodb_buffer_pool_size=245M
innodb_flush_log_at_trx_commit=2
innodb_file_per_table=1
innodb_data_file_path = ibdata1:100M:autoextend
## You may want to tune the below depending on number of cores and disk sub
innodb_read_io_threads=4
innodb_write_io_threads=4
innodb_doublewrite=1
innodb_log_file_size=64M
innodb_log_buffer_size=16M
innodb_buffer_pool_instances=1
innodb_log_files_in_group=2
innodb_thread_concurrency=0
# innodb_file_format = barracuda
innodb_flush_method = O_DIRECT
innodb_rollback_on_timeout=ON
# innodb_locks_unsafe_for_binlog = 1
innodb_autoinc_lock_mode=2
## avoid statistics update when doing e.g show tables
innodb_stats_on_metadata=0
default_storage_engine=innodb
# CHARACTER SET
# collation_server = utf8_unicode_ci
# init_connect = 'SET NAMES utf8'
# character_set_server = utf8
# REPLICATION SPECIFIC
server_id=1002
binlog_format=ROW
log_bin=binlog
log_slave_updates=1
relay_log=relay-bin
expire_logs_days=7
read_only=ON
report_host=172.31.29.72
gtid_ignore_duplicates=ON
gtid_strict_mode=ON
# OTHER THINGS, BUFFERS ETC
key_buffer_size = 24M
tmp_table_size = 64M
max_heap_table_size = 64M
max_allowed_packet = 512M
# sort_buffer_size = 256K
# read_buffer_size = 256K
# read_rnd_buffer_size = 512K
# myisam_sort_buffer_size = 8M
skip_name_resolve
memlock=0
sysdate_is_now=1
max_connections=500
thread_cache_size=512
query_cache_type = 0
query_cache_size = 0
table_open_cache=1024
lower_case_table_names=0
# 5.6 backwards compatibility (FIXME)
# explicit_defaults_for_timestamp = 1
performance_schema = OFF
performance-schema-max-mutex-classes = 0
performance-schema-max-mutex-instances = 0
[MYSQL]
socket=/var/lib/mysql/mysql.sock
# default_character_set = utf8
[client]
socket=/var/lib/mysql/mysql.sock
# default_character_set = utf8
[mysqldump]
socket=/var/lib/mysql/mysql.sock
max_allowed_packet = 512M
# default_character_set = utf8
[xtrabackup]
[MYSQLD_SAFE]
# log_error = /var/log/mysqld.log
basedir=/usr/
# datadir = /var/lib/mysql
もちろん、設定や要件に応じてこれを変更できます。
手順3のバックアップを準備します。つまり、以下のコマンドを実行して、ホットスタンバイノードにあるバックアップを終了します。
$ mariabackup --prepare --target-dir=/var/lib/mysql
$ chown -R mysql.mysql /var/lib/mysql
ここで、MariaDBインスタンスを開始します
$ systemctl start mariadb
最後に、非同期レプリケーションを設定する必要があります
##マスターノード、つまりGaleraクラスター内のノードにレプリケーションユーザーを作成します
MariaDB [(none)]> CREATE USER 'cmon_replication'@'172.32.31.2' IDENTIFIED BY 'PahqTuS1uRIWYKIN';
Query OK, 0 rows affected (0.866 sec)
MariaDB [(none)]> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'cmon_replication'@'172.32.31.2';
Query OK, 0 rows affected (0.127 sec)
##次のようにxtrabackup_binlog_infoからGTIDスレーブの位置を取得します。
$ cat /var/lib/mysql/xtrabackup_binlog_info
binlog.000002 71131632 1000-1000-120454
##次に、次のようにスレーブレプリケーションを設定します。
MariaDB [(none)]> SET GLOBAL gtid_slave_pos='1000-1000-120454';
Query OK, 0 rows affected (0.053 sec)
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.31.28.175', MASTER_USER='cmon_replication', master_password='PahqTuS1uRIWYKIN', MASTER_USE_GTID = slave_pos;
##ここで、スレーブのステータスを確認します
MariaDB [(none)]> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.31.28.175
Master_User: cmon_replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_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: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 4
Relay_Log_Space: 256
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1000
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: Slave_Pos
Gtid_IO_Pos: 1000-1000-120454
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 0
1 row in set (0.000 sec)
ClusterControlを使用している場合は、データベースサーバーの状態を簡単に監視できます。これをスレーブとして追加するには、Galeraノードクラスターを選択し、次に示すように選択ボタンに移動してレプリケーションスレーブを追加します。
[レプリケーションスレーブの追加]をクリックして、以下のように既存のスレーブの追加を選択します。
お気づきかもしれませんが、ノード172.32.31.2がホットスタンバイとして機能していますノードには、172.32。%us-west-2(オレゴン)というプレフィックスが付いた異なるCIDRがあり、他のノードは172.31。%us-east-2(オハイオ)にあります。それらは完全に異なるリージョンにあるため、Galeraノードでネットワーク障害が発生した場合は、ホットスタンバイノードにフェイルオーバーできます。
AmazonAWSでのホットスタンバイの構築は簡単で簡単です。必要なのは、容量要件と、セットアップが必要なネットワークトポロジ、セキュリティ、およびプロトコルを決定することだけです。
VPCピアリングを使用すると、パブリックインターネットにアクセスせずに、異なるリージョン間の相互通信を高速化できるため、接続はAmazonネットワークインフラストラクチャ内にとどまります。
もちろん、1つのスレーブで非同期レプリケーションを使用するだけでは不十分ですが、このブログは、これを開始する方法の基盤として機能します。これで、非同期スレーブが複製する別のクラスターを簡単に作成し、ディザスタリカバリノードとして機能する別の一連のGaleraクラスターを作成できます。また、Galeraでgmcast.segment変数を使用して、このブログのように同期的に複製することもできます。