MySQLレプリケーションワンスレーブマルチマスター

まえがき



すべてのデータが1つのスレーブサーバーにロードされるように、mysqlを使用して複数のマスターサーバーでレプリケーションを行う必要がありました。 標準的な手段による既製のソリューションはありませんでした。 しかし、問題が関連するままであったため、時間が経つにつれて、mysql自体のツールを使用して、少し複雑で実行可能なオプションが到着しました。



実際には、解決策。

マスターサーバーは、通常の複製と同様に構成されます。 奴隷を持つすべての魔術。

各マスターからのレプリケーションは、個別のmysqldヘルパープロセスによって行われます。 ターゲットデータベースのテーブルはFEDERATEDエンジンで実行され、メインのmysqldプロセスのベースに接続されています。

mysql_multiに精通しており、連携している場合は、基本的にそれです。 次に、実装のいくつかの微妙さと有用性。



ubuntu-server 10.04のスレーブが設定されました。



mysqld_multi


mysqld_multiのメインセットアップについては説明しませんが、何もありません。 /usr/share/mysql/mysqld_multi.serverにinit.dスクリプトがあります。

mysqld_multiの設定は、個別のファイルで行うのが最適です。これは、デーモンを管理するために、スクリプトがサーバーにアクセスするためにユーザー名とパスワードを必要とするためです。

また、すべてのレプリケーションプロセスの一般的な設定を行うために、mysqldセクションを残します。

複製されたデータベースごとに、サーバーと複製の設定を使用してmysqldNセクションを作成します。 また、フェデレーションを有効にすることを忘れないでください。



$sudo cp /etc/mysql/my.cnf /etc/mysql/my_multi.cnf

$sudo chmod 600 /etc/mysql/my_multi.cnf



:

[mysqld_multi]

log = /var/log/mysql/mysqld_multi.log

mysqld = /usr/sbin/mysqld

mysqladmin = /usr/bin/mysqladmin

user = root

password = pass



[mysqld1]

datadir = /var/lib/mysql_multi/mysql1

#datadir = /var/lib/mysql_multi

socket = /var/run/mysqld/mysqld1.sock

port = 33061

tmpdir = /var/tmp/mysql/mysqld1

pid-file = /var/run/mysqld/mysqld1.pid

log_error = /var/log/mysql/error1.log

federated

#skip-innodb



server-id = 101

replicate-do-db = db

#replicate-do-db = my_db1

#replicate-rewrite-db = db->my_db1

master-info-file = mysql1-master.info

relay-log = mysql1-relay-bin

relay-log-index = mysql1-relay-bin.index

relay-log-info-file = mysql1-relay-log.info

replicate-wild-ignore-table = mysql.%



[mysqld2]

....









データベースを保存するには、2つのオプションがあります。1つのディレクトリにまとめて(行のコメントを外して)、または各サーバーでdatadirを指定します。

最初は、より少ないディレクトリと一般的なmysqlシステムスキーム(その中のパスワード)がありますが、innodbは機能しません。

2番目の方法は、より柔軟で安定しており、innodbで機能します。 私はそれに落ち着きました。 はい、そしてクエリブラウザは、結局のところ、フルネームをテーブルに追加しますが、書き換えを伴うレプリケーションはこれを理解しません。



--defaults-extra-file=/etc/mysql/my_multi.cnf



してmysqld_multiを起動する必要があり--defaults-extra-file=/etc/mysql/my_multi.cnf





init.dスクリプトでは、それも追加します。



apparmorが機能する場合、設定を修正する必要があります。

/etc/apparmor.d/usr.sbin.mysqld:

....

/usr/share/mysql/** r,

/var/log/mysql.log rw,

/var/log/mysql.err rw,

/var/lib/mysql/ r,

/var/lib/mysql/** rwk,

/var/lib/mysql_multi/ r,

/var/lib/mysql_multi/** rwk,

/var/log/mysql/ r,

/var/log/mysql/* rw,

/var/run/mysqld/mysqld.pid w,

/var/run/mysqld/mysqld.sock w,

/var/run/mysqld/mysqld?.pid w,

/var/run/mysqld/mysqld?.sock w,

/var/run/mysqld/mysqld??.pid w,

/var/run/mysqld/mysqld??.sock w,

....



$sudo service apparmor reload








データベースのディレクトリを作成します。 メインデータベースがまだクリーンな場合は、コピーできます。それ以外の場合はmysql_install_dbを使用します

$sudo mkdir -pm700 /var/lib/mysql_multi/mysqlN

$sudo chown -R mysql:mysql /var/lib/mysql_multi

$sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql_multi/mysqlN







起動して確認します。

$sudo service mysqld_multi start

$mysql -uroot -p -h127.0.0.1 -P33061







フェデレーション。


メインサーバーで、フェデレーションによってテーブルに接続するユーザーを作成します。

mysql>CREATE USER 'fdrt_local'@'localhost';

mysql>GRANT SELECT, UPDATE, DELETE ON 'rpl_%' TO 'fdrt_local'@'localhost';







始める前に。


現在のデータベースをプライマリサーバーに展開します。


マスターに

$mysqldump --opt bd | gzip > dbN_full.sql.gz

$mysqldump --opt -d bd | gzip > dbN_nodata.sql.gz







アーカイブをサーバーに転送してから、

$zcat bd_full.sql.gz | mysql repl_dbN





また、一般化されたテーブルを作成するために、ターゲットデータベースのいくつかのテーブルにトリガーを追加しました。



スレーブサーバー上にフェデレーテッドテーブルを使用してデータベースを作成します。


次の規則を使用して、dbN_fdrt.sqlファイルを作成し、スレーブサーバーにアップロードします。

#(CREATE[\s\w]*)`(\w*)`((.|[\n\r])*?ENGINE\s*=\s*)(\w)+((.|[\n\r])*?;)#iu



$1`$2`$3FEDERATED CONNECTION=\'mysql://fdrt_local@localhost/%db_name%/$2\'$6








定期的にベース名を指定するか、復元する前に変更を加えます。

$sed 's/%db_name%/repl_dbN/g' bd_fdrt.sql | mysql -h127.0.0.1 -P33061 dbN









または、CREATE SERVERコマンドをベースごとに1つ使用する方がより簡単で便利です。



UPD: CREATE SERVERを使用すると、mysqld 5.1.41-3ubuntu12.7で機能しませんでした。



次に、スレーブを構成し、レプリケーションを開始します。 できた



修正済み:いくつかの小さなスクリプトが、レプリケーションの管理、ステータスの確認などに役立ちます。 誰か興味があれば、喜んで共有します。



All Articles