まえがき
すべてのデータが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で機能しませんでした。
次に、スレーブを構成し、レプリケーションを開始します。 できた
修正済み:いくつかの小さなスクリプトが、レプリケーションの管理、ステータスの確認などに役立ちます。 誰か興味があれば、喜んで共有します。