GNU/Linux >> Linux の 問題 >  >> Debian

Debian 8でMySQLを使用してマスターマスターレプリケーションを設定する(Jessie)

このチュートリアルでは、2つのノードを使用して複製されたMySQLセットアップ(Mater / Masterレプリケーション)について説明します。この場合、データの読み取りと書き込みを両方のノードに同時に行うことができます。 MySQLはデータを他のノードに複製するように注意し、プライマリ自動インクリメントキーが衝突しないようにします。

バージョン5以降、MySQLにはマスターマスターレプリケーションのサポートが組み込まれており、自己生成キーで発生する可能性のある問題を解決します。以前のMySQLバージョンでは、マスターマスターレプリケーションの問題は、ノードAとノードBの両方が同じテーブルに自動インクリメントキーを挿入した場合にすぐに競合が発生することでした。従来のマスタースレーブレプリケーションに対するマスターマスターレプリケーションの利点は、マスターにのみ書き込みアクセスを行うようにアプリケーションを変更する必要がないことと、マスターに障害が発生した場合に高可用性を提供するのが簡単なことです。あなたにはまだ他のマスターがいます。

1予備メモ

このチュートリアルでは、データベースexampledbをIPアドレス192.168.1.101のサーバーserver1.example.comからIPアドレス192.168.1.102のサーバーserver2.example.comに、またはその逆に複製する方法を示します。各システムは、同時に他のマスターのスレーブであり、同時に他のスレーブのマスターでもあります。どちらのシステムもDebian8を実行しています。ただし、この構成は、ほとんどまたはまったく変更を加えずに、ほとんどすべてのディストリビューションに適用する必要があります。

2MySQL5.5のインストール

MySQLがserver1とserver2にまだインストールされていない場合は、今すぐインストールしてください:

server1 / server2:

apt-get -y install mysql-server-5.5 mysql-client-5.5

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

server1 / server2:

nano /etc/mysql/my.cnf
[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
[...]
>

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

server1 / server2:

service mysql restart

次に、

で確認します

server1 / server2:

netstat -tap | grep mysql

MySQLが実際にすべてのインターフェースでリッスンしていること:

netstat -tap | grep mysql
tcp 0 0 *:mysql *:* LISTEN 15437/mysqld
server1:~#

次に、server2がserver1のMySQLデータベースにアクセスするために使用できるレプリケーションユーザーslave2_userを設定します。

server1:

MySQLシェルにログインします:

mysql --defaults-file=/etc/mysql/debian.cnf

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

server1:

GRANT REPLICATION SLAVE ON *.* TO [email protected]'%' IDENTIFIED BY 'secretpassword';
FLUSH PRIVILEGES;
quit;

secretpassword」という単語を置き換えます "選択した安全なパスワードを使用します。ここで、server2で最後の2つの手順を再度実行します:

server2:

mysql --defaults-file=/etc/mysql/debian.cnf
GRANT REPLICATION SLAVE ON *.* TO [email protected]'%' IDENTIFIED BY 'secretpassword';
FLUSH PRIVILEGES;
quit;

secretpassword」という単語を置き換えます 「ここにも安全なパスワードを使用します。後で必要になるので、パスワードを書き留めておきます。

3つのメモ

以下では、両方のMySQLサーバーが空であると想定します(「mysql」データベース以外のデータベースはまだ含まれていません)。

サーバーでそうでない場合は、続行する前に、最初のサーバーでデータベースをロックしてダンプし、2番目のサーバーにインポートする必要があります。レプリケーションをセットアップする前に、データベースのロックを解除しないでください。 「クリーンな」MySQLセットアップから始めない場合に備えて、すべてのデータベースを新しいサーバーにコピーする方法を示すいくつかのコマンドを以下に示します。

MySQLデータベース内のすべてのデータベーステーブルをロックする方法の例。

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;

すべてのデータベースをファイルall_databases.sqlにダンプする方法の例。

mysqldump --defaults-file=/etc/mysql/debian.cnf -cCeQ --hex-blob --quote-names --routines --events --triggers --all-databases -r all_databases.sql

2番目のサーバー上のすべてのテーブルをファイルall_databses.sqlからインポートする方法の例。

mysql --defaults-file=/etc/mysql/debian.cnf < all_databases.sql

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

ここで、/ 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ノードを構成しましょう:

server1:

nano /etc/mysql/my.cnf

[mysqld]で始まるセクションを検索し、次のオプションをそのセクションに追加します(既存の競合をすべてコメントアウトします) オプション):

[...]
[mysqld]

# Unique Server ID
server-id = 1

# Do not replicate the following databases
binlog-ignore-db = mysql
replicate-ignore-db = mysql

# Auto increment offset
auto-increment-increment = 2

# Do not replicate sql queries for the local server ID
replicate-same-server-id = 0

# Beginne automatisch inkrementelle Werte mit 1
auto-increment-offset = 1

# Delete binlog data after 10 days
expire_logs_days = 10

# Max binlog size
max_binlog_size = 500M

# Binlog file path
log_bin = /var/log/mysql/mysql-bin.log

[...]

次に、MySQLを再起動します:

server1:

service mysql restart

次にserver2でも同じことを行います:

server2:

nano /etc/mysql/my.cnf
[...]

# Unique Server ID
server-id = 2

# Do not replicate the following databases
binlog-ignore-db = mysql
replicate-ignore-db = mysql

# Auto increment offset
auto-increment-increment = 2

# Do not replicate sql queries for the local server ID
replicate-same-server-id = 0

# Beginne automatisch inkrementelle Werte mit 1
auto-increment-offset = 2

# Delete binlog data after 10 days
expire_logs_days = 10

# Max binlog size
max_binlog_size = 500M

# Binlog file path
log_bin = /var/log/mysql/mysql-bin.log

[...]

server2:

service mysql restart

次に、server1でexampledbデータベースをロックし、server1のマスターステータスを確認し、exampledbのSQLダンプを作成し(両方のデータベースに同じデータが含まれるようにserver2でexampledbにインポートします)、データベースのロックを解除してデータベースをロック解除します。再度使用できます:

server2:

次に、サーバー2でレプリケーションを開始します。MySQLシェルを開きます。

mysql --defaults-file=/etc/mysql/debian.cnf

そして、次のSQLコマンドを実行して、server1からserver2へのレプリケーションをアクティブ化します。

CHANGE MASTER TO MASTER_HOST='192.168.1.101', MASTER_USER='repl', MASTER_PASSWORD='secretpassword';

secretpasswordを置き換えます replのパスワードを使用 第2章で設定したMySQLユーザー。

次に、MySQLシェルでコマンド「showslave status \ G」を実行して、スレーブのステータスを確認します。

show slave status\G

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

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.101
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
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: 107
Relay_Log_Space: 410
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: NULL
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: 1
1 row in set (0.00 sec)

チェックする必要のある行は次のとおりです。

Master_Host: 192.168.1.101
Master_User: repl
Master_Port: 3306
Master_Log_File: mysql-bin.000001
Relay_Log_File: mysqld-relay-bin.000003
Slave_IO_Running: No
Slave_SQL_Running: No

次に、MySQLシェルで次のコマンドを使用してレプリケーションを開始します。

start slave;

次に、スレーブのステータスをもう一度確認します:

show slave status\G

次の2行は、「はい」と表示されているはずです。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

「Seconds_Behind_Master」が0でない場合は、数秒待ってからステータスをもう一度確認してください。このフィールドは、マスターとスレーブが同期しているかどうかを示します。

次のステップでは、「Master_Log_File」と「Read_Master_Log_Pos」の「showslavestatus\G」コマンドの値を知る必要があります。私の場合、これらは次のとおりです。

Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107

サーバーで取得した値を書き留めます。サーバー1の次のステップで必要になります。

その後、MySQLシェルを離れることができます:

quit

server1:

最初のサーバーで続行し、server1でMySQLシェルを開きます:

mysql --defaults-file=/etc/mysql/debian.cnf

そして、次のMySQLコマンドを実行します。

CHANGE MASTER TO MASTER_HOST='192.168.1.102', MASTER_USER='repl', MASTER_PASSWORD='secretpassword', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;
に変更

上記のコマンドでいくつかを置き換える必要があります:

  1. IPアドレスは、2番目のMySQLサーバーのIPである必要があります。
  2. パスワード「secretpassword」は、第2章でユーザー担当者用に選択したものである必要があります。
  3. MASTER_LOG_FILEとMASTER_LOG_POSは、最後の手順で書き留めた値である必要があります。

次に確認してください:

show slave status\G

エラーがない場合はMySQLシェルで。

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.102
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
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: 107
Relay_Log_Space: 107
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: NULL
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: 0
1 row in set (0.00 sec)

そして、スレーブを起動します。

start slave;

スレーブの状態をもう一度確認してください:

show slave status\G

次の2行は、「はい」と表示されているはずです。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

その後、MySQLシェルを離れることができます:

quit

何も問題がなければ、MySQLマスターマスターレプリケーションが機能しているはずです。そうでない場合は、/ var / log/syslogでserver1とserver2のMySQLエラーを確認してください。

5レプリケーションをテストする

次に、レプリケーションの設定をテストします。 server1にデータベースexampledb1を作成してから、server2でデータベースが2番目のサーバーに複製されているかどうかを確認します。

server1:

server1のMySQLコンソールにログインし、データベースを作成します。

mysql --defaults-file=/etc/mysql/debian.cnf
CREATE DATABASE exampledb1;

server2

次に、server2のMySQLコンソールにログインし、exampledb1がそこに存在するかどうかを確認します。

mysql --defaults-file=/etc/mysql/debian.cnf
show databases;

ご覧のとおり、新しいデータベースはserver2にも表示されます。

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| exampledb1 |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

次に、レプリケーションが他の方向でも機能するかどうかをテストします。まだserver2にログインしており、そこにデータベースexampledb2を作成します:

CREATE DATABASE exampledb2;

次に、server1に戻り、MySQLコンソールで「showdatabases」を実行します。

server1

show databases;

結果は新しいデータベースexampledb2を示しているため、レプリケーションは両方向で機能しています。

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| exampledb1 |
| exampledb2 |
| mysql |
| performance_schema |
+--------------------+
5 rows in set (0.01 sec)

  • MySQL:http://www.mysql.com
  • Debian:http://www.debian.org

Debian
  1. MySQLマスターをセットアップする方法-マスターレプリケーション

  2. Debian10でレプリケーションスロットを使用してPostgreSQLストリーミングレプリケーションを設定する方法

  3. Debian8Jessieでapt-getを使用してMySQLv5.7をインストールする方法

  1. Debian 10でMySQL(MariaDB)マスタースレーブレプリケーションを構成する方法

  2. PHP5とMySQLをサポートするLighttpdをDebianEtchにインストールする

  3. Debian 8(Jessie)にLighttpdを使用してWebDAVをインストールする方法

  1. DebianLennyでのPHP5とMySQLサポートを使用したLighttpdのインストール

  2. DebianSqueezeでのvsftpdとMySQLによる仮想ホスティング

  3. Debian Jessie/testingでnginxでngx_pagespeedを使用する