MySQL レプリケーション · 2 min read · Oct 08, 2025

完璧な負荷分散と高可用性のウェブクラスター - 2台のサーバーでXenを実行するUbuntu 8.04 Hardy Heron - ページ4

10. MySQLレプリケーション (web1, web2)

10.1 Mysql MySQL 5.0のインストール

apt-get install mysql-server-5.0 mysql-client-5.0

レプリケーションが機能することを確認するために、MySQLがすべてのインターフェースでリッスンするように設定する必要があります。したがって、/etc/mysql/my.cnfのbind-address = 127.0.0.1の行をコメントアウトします:

vi /etc/mysql/my.cnf

[...]
# skip-networkingの代わりに、デフォルトは現在localhostのみにリッスンすることです。
#これはより互換性があり、セキュリティが低下することはありません。
#bind-address           = 127.0.0.1
[...]

その後、MySQLを再起動します :

/etc/init.d/mysql restart

web1で

次に、web2.example.comがMySQLデータベースにアクセスできるように、レプリケーションユーザーslave2_userを設定します :

mysql -u root -p

MySQLシェルで、次のコマンドを実行します :

GRANT REPLICATION SLAVE ON . TO ‘slave2_user’@’%’ IDENTIFIED BY ‘slave2_password’;
FLUSH PRIVILEGES;
quit;

web2で

次に、web2.example.comで最後の2つのステップを再度実行します :

mysql -u root -p

GRANT REPLICATION SLAVE ON . TO ‘slave1_user’@’%’ IDENTIFIED BY ‘slave1_password’;
FLUSH PRIVILEGES;
quit;

web1およびweb2で

今、後でメールサーバーに使用されるデータベースを作成します :

mysqladmin -u root -p create mail

次に、MySQLシェルに移動します:

mysql -u root -p

MySQLシェルで、SELECT、INSERT、UPDATE、DELETE権限を持つユーザーmail_adminを作成します。これは、PostfixとCourierがメールデータベースに接続するために使用されます:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail. TO ‘mail_admin’@’localhost’ IDENTIFIED BY ‘mail_admin_password’;
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.
TO ‘mail_admin’@’localhost.localdomain’ IDENTIFIED BY ‘mail_admin_password’;
FLUSH PRIVILEGES;
quit;

10.2 レプリケーションの設定

次に、/etc/mysql/my.cnfでマスターマスターレプリケーションを設定します。マスターマスターレプリケーションの重要な設定オプションはauto_increment_incrementとauto_increment_offsetです:

  • auto_increment_incrementは、連続するAUTO_INCREMENT値間の増分を制御します。
  • auto_increment_offsetは、AUTO_INCREMENT列値の開始点を決定します。

N個のMySQLノードがあると仮定します(N=2の場合)、すべてのノードでauto_increment_incrementはNの値を持ち、各ノードはauto_increment_offsetの異なる値を持つ必要があります(1, 2, …, N)。

次に、2つのMySQLノードを構成します:

web1で

vi /etc/mysql/my.cnf

以下の行を”[mysqld]”のすぐ下に追加します:

server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
#eth1にクロスオーバーケーブルをインストールしていない場合は192.168.1.105を使用
master-host = 192.168.0.105
master-user = slave1_user
master-password = slave1_password
master-connect-retry = 60
replicate-do-db = mail
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = mail
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

“max_binlog_size”の行を修正します :

[...]
max_binlog_size         = 500M
[...]

/etc/init.d/mysql restart

web2で

vi /etc/mysql/my.cnf

server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2
#eth1にクロスオーバーケーブルをインストールしていない場合は192.168.1.104を使用
master-host = 192.168.0.104
master-user = slave2_user
master-password = slave2_password
master-connect-retry = 60
replicate-do-db = mail
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = mail
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

“max_binlog_size”の行を修正します :

[...]
max_binlog_size         = 500M
[...]

/etc/init.d/mysql restart

web1およびweb2で

今、レプリケーションを開始します :

mysql -u root -p

MySQLシェルで、次のコマンドを実行します:

reset master;
stop slave;
reset slave;

次に、次のコマンドを実行します :

web1で

CHANGE MASTER TO MASTER_HOST=’192.168.0.105’, MASTER_USER=’slave1_user’, MASTER_PASSWORD=’slave1_password’, MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=98;

start slave;
quit;

web2で

CHANGE MASTER TO MASTER_HOST=’192.168.0.104’, MASTER_USER=’slave2_user’, MASTER_PASSWORD=’slave2_password’, MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=98;

start slave;
quit;

これでレプリケーションが機能するはずです。

10.3 レプリケーションのテスト

web1およびweb2で

mysql -u root -p

MySQLシェルで、次のコマンドを実行します:

show slave status \G;

出力には、次のように見える3つの重要な行があります :

[...]
Slave_IO_State: Waiting for master to send event
[...]
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: mail
[...]

これでmysqlを終了できます :

quit;

web1で

テスト用にweb1.example.comにデータを挿入します。これは次の章でメールに使用されます :

mysql -u root -p

MySQLシェルで、次のコマンドを実行します:

use mail;

次のテーブルを作成します :

CREATE TABLE domains (
domain varchar(50) NOT NULL,
transport varchar(128) NOT NULL default ‘smtp:[192.168.1.104]’,
PRIMARY KEY (domain) )
TYPE=MyISAM;

CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;

CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT ‘10485760’,
PRIMARY KEY (email)
) TYPE=MyISAM;

CREATE TABLE transport (
domain varchar(128) NOT NULL default ‘’,
transport varchar(128) NOT NULL default ‘’,
UNIQUE KEY domain (domain)
) TYPE=MyISAM;

quit;

これらの新しく作成されたテーブルは、レプリケーションのおかげでweb2のメールデータベースにも表示されるはずです。

web2で

今、確認します :

mysql -u root -p

MySQLシェルで、次のコマンドを実行します:

use mail;
show tables;

出力は次のようになります :

+----------------+
| Tables_in_mail |
+----------------+
| domains         |
| forwardings    |
| transport        |
| users              |
+----------------+
4 rows in set (0.00 sec)

quit;

これでレプリケーションが機能していることが確認できます。

10.4 ldirectord用のユーザーの作成

今、ldirectord.phpファイルでデータベースに接続するユーザーを作成します。

web1およびweb2で

mysql -u root -p

MySQLシェルで、次のコマンドを実行します:

GRANT USAGE ON . TO ‘ldirectord’@’localhost’ IDENTIFIED BY ‘LDIRECTORD_PASSWORD’;
quit;

今、ブラウザで次のアドレスにアクセスすると :

http://192.168.1.104/ldirectord.php

および

http://192.168.1.105/ldirectord.php

次のように表示されるはずです :

MySQLに接続されました

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。