MySQLからMongoDBへのデータ複製



外出先でシステムアーキテクチャを変更する必要がある場合があります。 おそらく、プロジェクトでボトルネックを発見したか、現在の成長率ではスケーリングまたはフォールトトレランスの問題がすぐに発生する可能性があると判断した可能性があります。 そのような場合のために、タングステンレプリケーターがあります。

Tungsten Replicatorは、MySQL DBMSレプリケーション機能を拡張する無料のオープンソースのJavaベースのアプリケーションです。 タングステンの機能は幅広く、マルチマスターレプリケーション、パラレルレプリケーション、MySQLとOracle間の異種データレプリケーション、PostgreSQL、MongoDBなどがあります。 この記事では、MySQLウィザードと従属MongoDBサーバーの異種レプリケーションを検討し、CentOS 6.5がOSとして機能します。



依存関係のインストール



Tungsten ReplicatorはJavaで記述されているため、少なくともOpenJDK 1.6またはOracle Java 6をインストールする必要があります。また、一部のスクリプトはrubyで記述されているため、まだインストールしていない場合はインストールする必要があります(バージョン=> 1.8):

# yum install java-1.6.0-openjdk ruby







MySQLのインストール



MySQLサーバーが既にインストールされている場合は、以下で説明するように構成を調整するだけで、ユーザーに複製を取得することができます。

MySQLがまだインストールされていない場合は、ここをクリックしてください。
必要なリポジトリを接続します。

# rpm -Uvh download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm





# rpm -Uvh rpms.famillecollet.com/enterprise/remi-release-6.rpm







MySQL Server 5.5をインストールします。

# yum --enablerepo=remi install mysql mysql-server







レプリケーションのニーズに合わせてMySQL構成を調整します。

# vim /etc/my.cnf







 #   “” server-id = 1 #     log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 #    MongoDB       “ROW” binlog_format = ROW #     max_binlog_size = 256M #         sync_binlog = 1 ...
      
      





システムの起動時にMySQLの自動起動をアクティブにし、サービスを開始します。

# chkconfig --level 35 mysqld on





# service mysqld start







最初のMySQLインストールスクリプトを実行し、rootパスワードを設定します。

# mysql_secure_installation







 Enter current password for root (enter for none): Change the root password? [Y/n] y New password: SomeSecretPasswD Re-enter new password: SomeSecretPasswD Remove anonymous users? [Y/n] y Disallow root login remotely? [Y/n] y Remove test database and access to it? [Y/n] y Reload privilege tables now? [Y/n] y
      
      





レプリケーションの場合、別のユーザーがいることが望ましいです:

# mysql -u root -p





# mysql > grant all on *.* to tungsten identified by 'password' with grant option;





Query OK, 0 rows affected (0.01 sec)









MongoDBをインストールする



すでにMongoDBがある場合は、次の手順に進むことができます。

そうでない場合は、Mongoのインストール手順がここにあります。
MongoDBリポジトリを接続します。

# vim /etc/yum.repos.d/mongodb.repo







 [mongodb] name=MongoDB Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/ gpgcheck=0 enabled=1
      
      





そして、MongoDBサーバー2.4パッケージをインストールします。

# yum install mongo-10gen mongo-10gen-server







システムの起動時にMongoDBの自動起動をアクティブにし、サービスを開始します。

# chkconfig --level 35 mongodb on





# service mongodb start







サービスの正常性を確認するには、データベースのリストを参照してください。

# mongo





MongoDB shell version: 2.4.3





connecting to: test





> show dbs





local 0.078125GB





デフォルトでは、認証は必要ありません。



Master Replicator for MySQLのインストール



執筆時点でのレプリケーターの現在のバージョンは、このリンクにあります。

はじめに、レプリケーター用のディレクトリをいくつか作成します。たとえば、/ opt:

# cd /opt





# mkdir replicator





# cd replicator





# mkdir mysql # -





# mkdir mongodb #







レプリケーターアーカイブを現在のディレクトリにダウンロードします。

# wget tungsten-replicator.googlecode.com/files/tungsten-replicator-2.2.0-292.tar.gz





# tar -xzf tungsten-replicator-2.2.0-292.tar.gz





# mv tungsten-replicator-2.2.0-292/ tungsten-replicator/







次に、マスターレプリケーターのインストールスクリプトを準備します。

# vim master-installer.sh







 cd /opt/replicator/tungsten-replicator ./tools/tungsten-installer --master-slave -a \ --datasource-type=mysql \ --master-host=127.0.0.1 \ --datasource-user=tungsten \ --datasource-password=password \ --datasource-mysql-conf=/etc/my.cnf --datasource-log-directory=/var/log/mysql/ --datasource-port=3306 \ --service-name=mongodb \ --home-directory=/opt/replicator/mysql \ --cluster-hosts=127.0.0.1 \ --thl-port=10001 \ --rmi-port=11001 \ --java-file-encoding=UTF8 \ --mysql-use-bytes-for-string=false \ --mysql-enable-enumtostring=true \ --mysql-enable-settostring=true \ --svc-extractor-filters=colnames,pkey \ --svc-parallelization-type=none --start-and-report
      
      





この構成では、すべてが複製されます。 各ベースとすべてのテーブル。

厳密に定義されたテーブルを複製する必要がある場合は、スクリプトの最後から2番目の行(svc-extractor-filters)を次のように置き換えることで、すぐにフィルターを識別できます。

  --svc-extractor-filters=replicate \ "--property=replicator.filter.replicate.do=db1.table1,db2.table2,dbN.tableN" \
      
      



したがって、db1.table1などの代わりに、複製する必要があるデータベースとテーブルを示します。

ウィザードの準備はすべて整いました。インストールスクリプトを実行できます。

# sh master-installer.sh





情報>> 127_0_0_1 >>サービス一覧の取得

情報>> 127_0_0_1 >> ...

処理サービスコマンド...

NAME VALUE

--applyLastSeqno:0

適用遅延:1.218

役割:マスター

serviceName:mongodb

serviceType:ローカル

開始済み:true

状態:オンライン

終了したサービスコマンド...
ウィザードの準備ができました。これで、1つ以上のスレーブ(MySQLやPostgreSQLなど)を接続できます。 しかし、私たちの目標はMongoDBを使用したレプリケーションです。次に進みましょう。



MongoDBのスレーブレプリケーターをインストールする



MongoDBにデータを送信するスレーブレプリケーターをインストールするためのスクリプトを準備します。

# vim slave-installer.sh





 cd /opt/replicator/tungsten-replicator tools/tungsten-installer --master-slave -a \ --datasource-type=mongodb \ --master-host=127.0.0.1 \ --service-name=mongodb \ --home-directory=/opt/replicator/mongodb \ --cluster-hosts=127.0.0.1 \ --datasource-port=27017 \ --master-thl-port=10001 \ --thl-port=10002 \ --rmi-port=11002 \ --java-file-encoding=UTF8 \ --skip-validation-check=InstallerMasterSlaveCheck \ --svc-parallelization-type=none --start-and-report
      
      



別のホストに複製する必要がある場合は、1つのホストに複製することに注意してください。マスターがある正しいホストアドレスを指定し、ファイアウォールの対応するポート(thl-port、rmi-port)を開くことを忘れないでください。

すべての条件が満たされている場合、インストールスクリプトを実行できます。

# sh slave-installer.sh





警告>> 127.0.0.1 >>現在、mongodbのTHLスキーマを確認できません

情報>> 127_0_0_1 >>サービス一覧の取得

情報>> 127_0_0_1 >>処理サービスコマンド...

NAME VALUE

--applyLastSeqno:0

applyLatency:0.5

役割:奴隷

serviceName:mongodb

serviceType:ローカル

開始済み:true

状態:オンライン

終了したサービスコマンド...

「状態」の行にステータス「オンライン」が表示されている場合、インストールは成功しており、レプリケーションが機能しているかどうかを確認できます。



複製チェック



テストを開始する前に、データをリレーショナルデータベースからMongoDBなどの非リレーショナルデータベースに転送する方法を理解する必要があります。 実際、テーブルにデータを保存するMySQL、Oracleなどの従来のDBMSとは異なり、Mongoは単純化された形式-「キー値」でデータを保存します。 したがって、MySQLテーブルのデータは、MongoDBの「コレクション」に変換する必要があります。 この場合、「挿入」、「更新」、および「削除」テーブルのみを複製できます。残りの操作(CREATE / DROP / ALTER)はレプリケーターによって無視されます。

挿入がどのように複製されるかを確認しましょう。 これを行うために、テスト回路とテーブルを作成します。

mysql> create schema testdb;





mysql> use testdb;





mysql> create table testrepl (id int not null primary key, name char(20), date date);





Query OK, 0 rows affected (0.00 sec)





2つの任意の挿入を作成しましょう。

mysql> insert into testrepl values (1, 'Vasya', '1965-01-01');





Query OK, 1 row affected (0.00 sec)





mysql> insert into testrepl values (2, 'Petya', '1991-02-02');





Query OK, 1 row affected (0.00 sec)







次に、スレーブ側でレプリケーターが生成したものを見てみましょう。

> show dbs





local 0.078125GB





testdb 0.203125GB





tungsten_mongodb 0.203125GB





> use testdb





switched to db testdb





> show collections





testrepl





system.indexes





> db.testdb.find()





{ "_id" : “01”, "id" : "1", "name" : "Vasya", "date" : "1965-01-01" }





{ "_id" : “02”, "id" : "2", "name" : "Petya", "date" : "1991-02-02" }







更新の複製方法を確認しましょう。

mysql> update testrepl set name = 'Vasya P' where id =1;





Query OK, 1 row affected (0.01 sec)





Rows matched: 1 Changed: 1 Warnings: 0







Mongoの結果:

> db.testrepl.find()





{ "_id" : “01”, "id" : "1", "name" : "Vasya P", "d" : "1965-01-01" }





{ "_id" : “02”, "id" : "2", "name" : "Petya", "date" : "1991-02-02" }







レプリケーターは削除も処理します。

mysql> delete from testrepl where id =2;





Query OK, 1 row affected (0.00 sec)





受信機では、記録も消えました。

> db.myfirst.find()





{ "_id" : “01”, "id" : "1", "name" : "Vasya P", "d" : "1965-01-01" }







レプリケーションがどのように機能するかを示すいくつかの例を見てみました。 最終的にレプリケーターが仕事をしていることを確認するために、大きなダンプを埋めて、MySQLとMongoDBのテーブルとコレクションの数をそれぞれ数えます。



対応するサービスのディレクトリからtrepctlコマンドを使用して、レプリケーションステータスの確認、レプリケータの再起動、またはレプリケーションの停止を行うことができます。

# cd /opt/replicator/





スレーブ(MongoDB)の場合:

# ./mongodb/tungsten/tungsten-replicator/bin/trepctl status





マスター(MySQL)の場合:

# ./mysql/tungsten/tungsten-replicator/bin/trepctl status







レプリケーションサービスの管理方法の詳細については、「ヘルプ」オプションを使用してください。



なんで?



論理的な質問は、なぜMongoDBまたは他のDBMSとのレプリケーションが必要なのでしょうか? いくつかのシナリオがあります。 たとえば、非リレーショナルDBMSの利点を体験したい開発者の要望。 または、データを使用して、MongoDBを使用するように設計された新しいアプリケーションを作成することもできます。



タングステンレプリケーターアプリケーションオプション








結論として、タングステンレプリケーターは、さまざまなMySQLレプリケーションオプションに使用できるツールと同じツールであることがわかります。 その機能は幅広く、説明には複数の記事が必要になる場合があります。 ただし、公式Webサイトにはかなり詳細なドキュメントがあります。 誰かがContinuentの有料エンタープライズ版に興味があるかもしれません。 エンタープライズ版では、コミュニティバージョンの利点に加えて、自動復旧、フォールトトレランス、ダウンタイムなしのアップグレードなどの利点がありますが、かなりの費用がかかります。



タングステンレプリケータードキュメント:

異種複製

MySQLからMongoDBレプリケーション

運営

有用な記事:

タングステンレプリケーターのインストールと管理

MySQLからMongoDBへのレプリケーションの開始



MongoDBマニュアル



All Articles