Linux
 Computer >> コンピューター >  >> システム >> Linux

MariaDBでマスター/マスター・マスター/スレーブレプリケーションを構成する方法

SQLデータベースにおけるレプリケーションとは、ソースデータベースから別のデータベース(1つまたは複数)へデータをコピーする仕組みです。あるデータベースサーバーのデータが、1台以上のサーバーに継続的に複製されます。レプリケーションを活用することで、複数のサーバー間でリクエストを分散・負荷分散したり、フェイルオーバーによる高可用性を実現したりできます。MariaDB(およびMySQL)では、マスター/マスター(Master-Master)とマスター/スレーブ(Master-Slave)という2種類のレプリケーション構成を利用できます。本記事では、Linux CentOS 7環境でこれら2種類のMariaDBレプリケーションを構成する手順を解説します。

MariaDBのインストール

MariaDBをCentOS 7にインストールする手順については、以前公開した記事「MariaDBのインストール・設定・チューニング(CentOS編)」をご参照ください。ここではインストール手順は省略し、レプリケーションの構成方法に焦点を当てて説明します。

シンプルなマスター/マスターレプリケーションの構成

マスター/マスターレプリケーションでは、どちらのMariaDBサーバーでもデータの読み書きが可能です。このレプリケーションは特別なbinlogファイルを基盤としており、マスターサーバーはデータベースへのすべての操作をbinlogに記録します。スレーブサーバーはマスターに接続し、そのコマンドを自身のデータベースに適用します。

1. 最初のマスターサーバー(Master-1)の設定

1台目のMariaDBサーバーのmy.cnfファイルに、以下の行を追加します。

#replication
server_id = 1
report_host = master
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

設定後、MariaDBサービスを再起動します。

service mariadb restart

次に、レプリケーション用のユーザーを作成します。

mysql
create user 'test_master'@'%' identified by 'test_master';
grant replication slave on *.* to 'test_master'@'%';

スレーブを追加するには、Master-1からbinlogの情報を取得する必要があります。

MariaDB [(none)]> show master status;

+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 | 664 | | |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

2. 2台目のマスターサーバー(Master-2)の設定

2台目のMariaDBサーバーに接続し、my.cnfファイルを開いて以下の設定を追加します。

#replication
server_id = 2
report_host = master2
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

同様に、2台目のサーバーにも新しいユーザーを作成します。

create user 'test_master2'@'%' identified by 'test_master2';
grant replication slave on *.* to 'test_master2'@'%';

Master-2でもbinlogの情報を取得します。

MariaDB [(none)]> show master status;

+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 | 667 | | |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

続いて、レプリケーションクラスター内のMariaDBサーバー間の接続を設定します。

まずスレーブを停止します。

STOP SLAVE;

2台目のサーバーにMaster-1を登録します。

CHANGE MASTER TO MASTER_HOST='IP_master1', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000002', MASTER_LOG_POS=664;

レプリケーションを開始します。

START SLAVE;

次にMaster-1に接続し、同じ手順を実行します。ただし、指定する情報は2台目のサーバーのものに置き換えます。

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='10.2.10.36', MASTER_USER='test_master2', MASTER_PASSWORD='test_master2', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=667;
START SLAVE;

2台目のサーバーのステータスを確認します。

show slave status \G

スクリーンショットのとおり、両サーバー間の接続が確立され、エラーも発生していません。

3. MariaDBサーバー間のレプリケーションを確認する方法

マスター/マスター構成でレプリケーションが正しく機能しているか確認するため、Master-1上に新しいデータベースを作成し、その中にテーブルを作ってみます。

MariaDB [(none)]> create database master1;
MariaDB [(none)]> use master1;
MariaDB [master1]> CREATE TABLE hello (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );

このデータベースが自動的に2台目のマスターに複製され、同じテーブルが存在するか確認します。

MariaDB [(none)]> show databases;

+--------------------+
| Database |
+--------------------+
| information_schema |
| master1 |
| mysql |
| performance_schema |
+--------------------+

MariaDB [(none)]> use master1;
MariaDB [master1]> show tables;

+-------------------+
| Tables_in_master1 |
+-------------------+
| hello |
+-------------------+

2台目のマスターにもデータベースが作成されました。完全なサイクルを確認するため、今度は2台目のマスター側でmaster1データベースにテーブルを作成し、それが1台目のサーバーに反映されるかチェックします。

MariaDB [master1]> CREATE TABLE hello_master1 (
-> AuthorID INT NOT NULL AUTO_INCREMENT,
-> AuthorName VARCHAR(100),
-> PRIMARY KEY(AuthorID)
-> );

hello_master1テーブルが1台目のサーバーに複製されました。

MariaDB [master1]> show tables;

+-------------------+
| Tables_in_master1 |
+-------------------+
| hello |
| hello_master1 |
+-------------------+

ご覧のとおり、新しいテーブルがMaster-1に出現しています。レプリケーションが正常に動作しています。

MariaDBでマスター/スレーブレプリケーションを設定する方法

マスター/スレーブモードのMariaDBレプリケーションでは、一方のサーバーがスレーブとして動作し、マスターサーバーからのデータが継続的に書き込まれます。スレーブ側で行った変更はマスターサーバーには転送されません。このレプリケーション方式はより堅牢で、実際によく使われています。この構成では常に最新のデータベースを持つバックアップサーバーが確保され、仮にスレーブサーバーに障害が発生しても、マスターはデータを失いません。また、アプリケーションからの読み取りをスレーブサーバーに任せ、書き込みはマスターサーバーのみに行うことで、データベース負荷を分散させ、応答速度を最大化できます。

マスター/スレーブレプリケーションを構成する場合、マスターサーバー(master1)の設定は前述の手順と同じです。

続いてスレーブサーバーを設定します。スレーブのmy.cnfファイルに以下の設定を追加します。

#replication
server_id = 2
report_host = slave2
log_bin = /var/lib/mysql/mariadb-bin
log_bin_index = /var/lib/mysql/mariadb-bin.index
relay_log = /var/lib/mysql/relay-bin
relay_log_index = /var/lib/mysql/relay-bin.index

MariaDBサービスを再起動し、1台目のサーバーからbinlogの情報を取得します。

MariaDB [(none)]> show master status;

+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 | 664 | | |
+--------------------+----------+--------------+------------------+

スレーブサーバーのMariaDBコンソールで以下のコマンドを実行します。

MariaDB [(none)]> STOP SLAVE;

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='IP_master', MASTER_USER='test_master', MASTER_PASSWORD='test_master', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=664;
MariaDB [(none)]> START SLAVE;

既存のMariaDBデータベースに対してレプリケーションを設定する場合は、開始前にデータベースを読み取り専用モードにして、binlog番号が更新されないようにする必要があります。

SET GLOBAL read_only = ON;

さらに、データベースのメモリダンプ(ダンプファイル)を作成し、それを使ってスレーブサーバー上のMariaDBに初期データを投入してください。

スレーブの状態確認:SHOW SLAVE STATUS\G;

マスター上でデータベースを作成します。

MariaDB [(none)]> create database master_hello;

スレーブサーバーにもデータベースが作成されていることを確認します。

MariaDB [(none)]> show databases;

+--------------------+
| Database |
+--------------------+
| information_schema |
| master_hello |
| master_test |
| mysql |
| performance_schema |
| test |
+--------------------+

次に、スレーブサーバー上でデータベースを作成し、それがマスターに複製されるかどうかを確認してみます。

ご覧のとおり、スレーブ上にはデータベースが作成されています。しかし、マスター側を確認すると、そこには存在していません。つまり、スレーブからマスターへのデータ複製は行われないということです。

これは、MariaDBのレプリケーションが一方向のみで動作していることを意味します。念のためもう一度検証し、スレーブサーバーからmaster_helloデータベースを削除してみます。

マスターサーバーから削除されたか確認します。

ご覧のとおり問題なく、データベースはマスター上に残っています。

レプリケーション構成時の注意点とトラブルシューティング

MariaDBのレプリケーションを構成する際につまずきやすいポイントがありますが、最も多いのがファイアウォール関連です。CentOSではデフォルトでfirewalldが有効になっており、MariaDBのレプリケーションポート(TCP 3306)がブロックされます。iptablesでポートを開放するか、ファイアウォールを無効化してください(無効化は推奨されません)。

データベースが接続を待ち受けるIPアドレスは、my.cnfのbind-addressパラメータで指定されています。ローカル接続と外部接続の両方を許可するには、この行をコメントアウトし、マスター/スレーブのIPアドレスからポート3306への接続を許可するiptablesルールを追加します。

iptables -I INPUT -p tcp -s ip_address_slave_server --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 3306 -j DROP

初期設定時に筆者もこの問題に遭遇しましたが、簡単に検出できます。SHOW SLAVE STATUS\Gでスレーブのステータスを確認すると、このエラーが表示されます。

my.cnfで使える便利なレプリケーションパラメータ

my.cnfファイルの#replicationブロックには、さまざまなパラメータを追加できます。以下に、レプリケーション構成で役立つ主なパラメータとその簡単な説明を示します。

server_id = 1 — サーバーIDを指定します。通常は1から始めますが、他のレプリケーション参加サーバーと重複しない任意の番号を使用できます。

report_host = master — 通常はサーバーのホスト名を指定しますが、IPアドレスを入力しても構いません。

log_bin = /var/lib/mysql/mariadb-bin — 更新ログ(log_bin)へのパスです。

log_bin_index = /var/lib/mysql/mariadb-bin.index — 現在アクティブなログや、過去に使用されたログを把握するのに役立ちます。

relay_log = /var/lib/mysql/relay-bin

relay_log_index = /var/lib/mysql/relay-bin.index — レプリケーション用のログです。

特定のデータベースのみをレプリケートしたい場合は、以下のパラメータを使用します。

replicate-do-db = dbname — 複数のデータベースを対象にする場合は、カンマ区切りで名前を指定します。

逆に、一部のデータベースをレプリケーションから除外したい場合(通常、information_schema、mysql、performance_schemaなどのシステム系データベースは除外します):

binlog-ignore-db = dbname

binlogの保持期間を設定するには:

expire_logs_days = 10 — 10はログを保存する日数です。

また、マスターサーバーからのデータを別名のデータベースに書き込みたい場合は、設定ファイルで以下のように指定できます。

replicate-rewrite-db=dbmastername->dbslavename

以上でレプリケーションの設定は完了です。この記事を参考にすれば、マスター/マスター構成でもマスター/スレーブ構成でも、問題なくMariaDBレプリケーションを構築できるはずです。

  1. Windows 11でインデックス作成オプションを構成・再構築する方法

    ファイルやフォルダー、アプリにアクセスしたいのに、ストレージの中を一つずつ探し回るのが面倒だと感じたことはありませんか?そんなときに便利なのが「Windows検索」です。Windowsの検索インデックスは、あらかじめ指定された範囲からファイルやアプリ、設定を素早く見つけ出し、検索結果を高速に表示します。新しい場所を追加すると、Windows OSは自動的にインデックスを再構築し、定期的に更新するため、最新のファイルも検索できるようになります。本記事では、Windows 11でインデックス作成オプションを手動で構成・再構築する方法について詳しく解説します。 Windows 11でインデックス作成

  2. OutlookでYahoo!メールをIMAP設定する方法を徹底解説

    はじめにこの記事では、IMAPを使用してOutlookにYahoo!メールを設定する手順を、初心者の方にもわかりやすいように順を追って解説します。Outlook側の設定を始める前に、まずYahoo!メールアカウント側で行っておくべき変更点がありますので、あわせてご確認ください。事前準備:Yahoo!メール側の設定変更Yahoo!メールにログインし、「設定」をクリックします。「アカウント情報(Account info)」オプションを選択します。新しいウィンドウが表示されます。左側のメニューから「アカウントセキュリティ(Account Security)」を選択し、「安全性の低いアプリによるサイン