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