TiDBはMySQL Slaveとしてリアルタイムデータ同期を実現
9332 ワード
TiDB自体はほとんどのMySQL構文に対応しているため、ほとんどの業務にとって最も安全なデータベース切替方式は、TiDBを既存データベースのスレーブとしてメインMySQLライブラリの後ろに接続することで、業務側に侵入性が全くない状態でTiDBを使用して既存の業務をバックアップすることを実現し、将来のデータ量または同時増加による単一の障害リスクに対応し、TiDBをオンラインにする必要がある場合は、ビジネスのプライマリMySQLアドレスを簡単にTiDBに向けるだけでよい.
以下では、MySQLのデータをTiDBに移行し、TiDBをMySQLのSlaveとしてデータ同期する方法について詳しく説明します.
ここではMySQLおよびTiDBサービス情報を以下のように仮定します.
checkerによるSchemaチェック
移行する前に、TiDBのcheckerツールを使用することができます.checkerは、ターゲットMySQLライブラリのテーブルのテーブル構造がシームレスにTiDBに移行することをサポートしているかどうかを検出するために開発された小さなツールです.TiDBはほとんどのMySQLでよく使われるオリジナルデータ型をサポートしています.ほとんどの場合、checkerの戻りはokです.あるtable schemaのチェックに失敗した場合、TiDBが現在サポートされていないことを示し、table内のデータを移行できません.checkerはTiDBツールセットに含まれており、直接ダウンロードできます.
TiDBツールセットのダウンロード
Linux
checkerチェックの使用例 MySQLのtest databaseに数枚のテーブルを作成し、データを挿入します: checkerを使用してtest databaseのすべてのtable をチェック checkerを使用してtest databaseのtable をチェック
ここで、table t 1を移行するだけでよいと仮定する.
移行できないtableの例
MySQLでは、次の表を作成します.
checkerを使用してチェックすると、t_を移行できないことを示すエラーが表示されます.errorという時計.
mydumper/myloaderを使用してデータをフルインポート
mydumperを使用してMySQLからデータをエクスポートし、myloaderでTiDBにインポートします.
なお、MySQL公式のmysqldumpツールを使用したデータの移行作業もサポートしていますが、mydumper/myloaderに比べてパフォーマンスが遅く、大量のデータの移行に多くの時間がかかるため、ここではお勧めしません.
mydumper/myloaderは、より強力なデータ移行ツールです.具体的には、https://github.com/maxbube/mydumper .
Binaryのダウンロード
Linux
MySQLからのデータのエクスポート
mydumperを使用してMySQLからデータをエクスポートします.次のようにします.
以上,B testを用いてtestというdatabaseに対して動作することを示し,その後,−T 1,t 2を用いてt 1,t 2の2つのテーブルのみが導出されることを示した.
−t 16は、16個のスレッドを用いてデータを導出することを示す.-F 128は実際のtableをどれだけのchunkに分割するかであり、ここでは128 MBのchunkである.
注意:アリクラウドのsuper privilegeが必要なクラウドの上にmydumperは--no-locksパラメータを追加する必要があります.そうしないと、権限のない操作がプロンプトされます.
TiDBへのデータのインポート
myloaderを使用して、以前にエクスポートしたデータをTiDBにインポートします.
ここで-q 1は、各トランザクションに何個のqueryが含まれているかを示し、デフォルトは1000であり、ここでは1を使用すればよい.
インポートに成功したら、MySQLの公式クライアントでTiDBにアクセスして、次のことを確認できます.
syncerインクリメンタルインポートデータによるデータとMySQLのリアルタイム同期
mydumper/myloaderを使用してMySQLのデータを全量TiDBにインポートする方法について説明しましたが、後続のMySQLのデータが更新されている場合は、迅速にインポートしたいのですが、全量を使用する方法は適切ではありません.
TiDBはsyncerツールを提供し、MySQLのデータ増分を容易にTiDBにインポートできます.
syncerはTiDBツールセットにも属しており、どのように取得するかは参照できます.
以前にmydumper/myloaderを使用してt 1とt 2の2つのテーブルのいくつかのデータをインポートしたと仮定します.今、この2つのテーブルの更新は、リアルタイムでTiDBに同期することを望んでいます.
MySQLはbinlogを開きます
syncerを使用する前に、次のことを保証する必要があります. MySQL binlog機能を起動し、Setting the Replication Master Configuration を参照 Binlogフォーマットはrow formatを使用する必要があります.これもMySQL 5.7以降に推奨されるbinlogフォーマットです.次の文で開くことができます. bash SET GLOBAL binlog_format = ROW;
同期positionの取得
現在のbinlogのpositionをshow master statusにより得,syncerの初期同期位置はこの場所から始まる.
positionに関する情報をsyncerに保存します.metaファイルでsyncerの同期に使用されます.
注意:syncer.metaは初めて使用するときに構成するだけで、後続のsyncerが新しいbinlogを同期した後、自動的に最新のpositionに更新されます.
syncerの起動
syncerのプロファイルconfig.toml :
syncerの起動:
MySQLに新しいデータを挿入
TiDBにログインして表示:
syncerは30 sおきに現在の同期統計を出力します.以下のようにします.
syncerを使用すると、MySQLの更新を自動的にTiDBに同期できることがわかります.
変換元:http://www.zuimoban.com/jiaocheng/mysql/11005.html
転載先:https://www.cnblogs.com/mowei/p/7257851.html
以下では、MySQLのデータをTiDBに移行し、TiDBをMySQLのSlaveとしてデータ同期する方法について詳しく説明します.
ここではMySQLおよびTiDBサービス情報を以下のように仮定します.
+------------------+-------------+----------------------------------------+
| Name | Address | Port | User | Password |
+------------------+-------------+----------------------------------------+
| MySQL | 127.0.0.1 | 3306 | root | |
| TiDB | 127.0.0.1 | 4000 | root | |
+------------------+-------------+--------+-----------+-------------------+
checkerによるSchemaチェック
移行する前に、TiDBのcheckerツールを使用することができます.checkerは、ターゲットMySQLライブラリのテーブルのテーブル構造がシームレスにTiDBに移行することをサポートしているかどうかを検出するために開発された小さなツールです.TiDBはほとんどのMySQLでよく使われるオリジナルデータ型をサポートしています.ほとんどの場合、checkerの戻りはokです.あるtable schemaのチェックに失敗した場合、TiDBが現在サポートされていないことを示し、table内のデータを移行できません.checkerはTiDBツールセットに含まれており、直接ダウンロードできます.
TiDBツールセットのダウンロード
Linux
# tool
wget http://download.pingcap.org/tidb-tools-latest-linux-amd64.tar.gz
wget http://download.pingcap.org/tidb-tools-latest-linux-amd64.sha256
# , ok
sha256sum -c tidb-tools-latest-linux-amd64.sha256
#
tar -xzf tidb-tools-latest-linux-amd64.tar.gz
cd tidb-tools-latest-linux-amd64
checkerチェックの使用例
USE test;
CREATE TABLE t1 (id INT, age INT, PRIMARY KEY(id)) ENGINE=InnoDB;
CREATE TABLE t2 (id INT, name VARCHAR(256), PRIMARY KEY(id)) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1, 1), (2, 2), (3, 3);
INSERT INTO t2 VALUES (1, "a"), (2, "b"), (3, "c");
./bin/checker -host 127.0.0.1 -port 3306 -user root test
2016/10/27 13:11:49 checker.go:48: [info] Checking database test
2016/10/27 13:11:49 main.go:37: [info] Database DSN: root:@tcp(127.0.0.1:3306)/test?charset=utf8
2016/10/27 13:11:49 checker.go:63: [info] Checking table t1
2016/10/27 13:11:49 checker.go:69: [info] Check table t1 succ
2016/10/27 13:11:49 checker.go:63: [info] Checking table t2
2016/10/27 13:11:49 checker.go:69: [info] Check table t2 succ
ここで、table t 1を移行するだけでよいと仮定する.
./bin/checker -host 127.0.0.1 -port 3306 -user root test t1
2016/10/27 13:13:56 checker.go:48: [info] Checking database test
2016/10/27 13:13:56 main.go:37: [info] Database DSN: root:@tcp(127.0.0.1:3306)/test?charset=utf8
2016/10/27 13:13:56 checker.go:63: [info] Checking table t1
2016/10/27 13:13:56 checker.go:69: [info] Check table t1 succ
Check database succ!
移行できないtableの例
MySQLでは、次の表を作成します.
CREATE TABLE t_error (
c timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
checkerを使用してチェックすると、t_を移行できないことを示すエラーが表示されます.errorという時計.
./bin/checker -host 127.0.0.1 -port 3306 -user root test t_error
2016/10/27 13:19:28 checker.go:48: [info] Checking database test
2016/10/27 13:19:28 main.go:37: [info] Database DSN: root:@tcp(127.0.0.1:3306)/test?charset=utf8
2016/10/27 13:19:28 checker.go:63: [info] Checking table t_error
2016/10/27 13:19:28 checker.go:67: [error] Check table t_error failed with err: line 1 column 56 near ") ON UPDATE CURRENT_TIMESTAMP(3)
) ENGINE=InnoDB DEFAULT CHARSET=latin1"
github.com/pingcap/tidb/parser/yy_parser.go:111:
github.com/pingcap/tidb/parser/yy_parser.go:124:
/home/jenkins/workspace/WORKFLOW_TOOLS_BUILDING/go/src/github.com/pingcap/tidb-tools/checker/checker.go:122: parse CREATE TABLE `t_error` (
`c` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 error
/home/jenkins/workspace/WORKFLOW_TOOLS_BUILDING/go/src/github.com/pingcap/tidb-tools/checker/checker.go:114:
2016/10/27 13:19:28 main.go:68: [error] Check database test with 1 errors and 0 warnings.
mydumper/myloaderを使用してデータをフルインポート
mydumperを使用してMySQLからデータをエクスポートし、myloaderでTiDBにインポートします.
なお、MySQL公式のmysqldumpツールを使用したデータの移行作業もサポートしていますが、mydumper/myloaderに比べてパフォーマンスが遅く、大量のデータの移行に多くの時間がかかるため、ここではお勧めしません.
mydumper/myloaderは、より強力なデータ移行ツールです.具体的には、https://github.com/maxbube/mydumper .
Binaryのダウンロード
Linux
# mydumper
wget http://download.pingcap.org/mydumper-linux-amd64.tar.gz
wget http://download.pingcap.org/mydumper-linux-amd64.sha256
# , ok
sha256sum -c mydumper-linux-amd64.sha256
#
tar -xzf mydumper-linux-amd64.tar.gz
cd mydumper-linux-amd64
MySQLからのデータのエクスポート
mydumperを使用してMySQLからデータをエクスポートします.次のようにします.
./bin/mydumper -h 127.0.0.1 -P 3306 -u root -t 16 -F 128 -B test -T t1,t2 -o ./var/test
以上,B testを用いてtestというdatabaseに対して動作することを示し,その後,−T 1,t 2を用いてt 1,t 2の2つのテーブルのみが導出されることを示した.
−t 16は、16個のスレッドを用いてデータを導出することを示す.-F 128は実際のtableをどれだけのchunkに分割するかであり、ここでは128 MBのchunkである.
注意:アリクラウドのsuper privilegeが必要なクラウドの上にmydumperは--no-locksパラメータを追加する必要があります.そうしないと、権限のない操作がプロンプトされます.
TiDBへのデータのインポート
myloaderを使用して、以前にエクスポートしたデータをTiDBにインポートします.
./bin/myloader -h 127.0.0.1 -P 4000 -u root -t 16 -q 1 -d ./var/test
ここで-q 1は、各トランザクションに何個のqueryが含まれているかを示し、デフォルトは1000であり、ここでは1を使用すればよい.
インポートに成功したら、MySQLの公式クライアントでTiDBにアクセスして、次のことを確認できます.
mysql -h127.0.0.1 -P4000 -uroot
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1 |
| t2 |
+----------------+
mysql> select * from t1;
+----+------+
| id | age |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
mysql> select * from t2;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
+----+------+
syncerインクリメンタルインポートデータによるデータとMySQLのリアルタイム同期
mydumper/myloaderを使用してMySQLのデータを全量TiDBにインポートする方法について説明しましたが、後続のMySQLのデータが更新されている場合は、迅速にインポートしたいのですが、全量を使用する方法は適切ではありません.
TiDBはsyncerツールを提供し、MySQLのデータ増分を容易にTiDBにインポートできます.
syncerはTiDBツールセットにも属しており、どのように取得するかは参照できます.
以前にmydumper/myloaderを使用してt 1とt 2の2つのテーブルのいくつかのデータをインポートしたと仮定します.今、この2つのテーブルの更新は、リアルタイムでTiDBに同期することを望んでいます.
MySQLはbinlogを開きます
syncerを使用する前に、次のことを保証する必要があります.
同期positionの取得
現在のbinlogのpositionをshow master statusにより得,syncerの初期同期位置はこの場所から始まる.
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 1280 | | | |
+------------------+----------+--------------+------------------+-------------------+
positionに関する情報をsyncerに保存します.metaファイルでsyncerの同期に使用されます.
# cat syncer.meta
binlog-name = "mysql-bin.000003"
binlog-pos = 1280
注意:syncer.metaは初めて使用するときに構成するだけで、後続のsyncerが新しいbinlogを同期した後、自動的に最新のpositionに更新されます.
syncerの起動
syncerのプロファイルconfig.toml :
log-level = "info"
server-id = 101
# meta
meta = "./syncer.meta"
worker-count = 1
batch = 1
pprof-addr = ":10081"
[from]
host = "127.0.0.1"
user = "root"
password = ""
port = 3306
[to]
host = "127.0.0.1"
user = "root"
password = ""
port = 4000
syncerの起動:
./bin/syncer -config config.toml
2016/10/27 15:22:01 binlogsyncer.go:226: [info] begin to sync binlog from position (mysql-bin.000003, 1280)
2016/10/27 15:22:01 binlogsyncer.go:130: [info] register slave for master server 127.0.0.1:3306
2016/10/27 15:22:01 binlogsyncer.go:552: [info] rotate to (mysql-bin.000003, 1280)
2016/10/27 15:22:01 syncer.go:549: [info] rotate binlog to (mysql-bin.000003, 1280)
MySQLに新しいデータを挿入
INSERT INTO t1 VALUES (4, 4), (5, 5);
TiDBにログインして表示:
mysql -h127.0.0.1 -P4000 -uroot -p
mysql> select * from t1;
+----+------+
| id | age |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+----+------+
syncerは30 sおきに現在の同期統計を出力します.以下のようにします.
2016/10/27 15:22:31 syncer.go:668: [info] [syncer]total events = 1, insert = 1, update = 0, delete = 0, total tps = 0, recent tps = 0, binlog name = mysql-bin.000003, binlog pos = 1280.
2016/10/27 15:23:01 syncer.go:668: [info] [syncer]total events = 2, insert = 2, update = 0, delete = 0, total tps = 0, recent tps = 0, binlog name = mysql-bin.000003, binlog pos = 1538.
syncerを使用すると、MySQLの更新を自動的にTiDBに同期できることがわかります.
変換元:http://www.zuimoban.com/jiaocheng/mysql/11005.html
転載先:https://www.cnblogs.com/mowei/p/7257851.html