TiDBはMySQL Slaveとしてリアルタイムデータ同期を実現

9332 ワード

TiDB自体はほとんどのMySQL構文に対応しているため、ほとんどの業務にとって最も安全なデータベース切替方式は、TiDBを既存データベースのスレーブとしてメインMySQLライブラリの後ろに接続することで、業務側に侵入性が全くない状態でTiDBを使用して既存の業務をバックアップすることを実現し、将来のデータ量または同時増加による単一の障害リスクに対応し、TiDBをオンラインにする必要がある場合は、ビジネスのプライマリMySQLアドレスを簡単にTiDBに向けるだけでよい.
以下では、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チェックの使用例
  • MySQLのtest databaseに数枚のテーブルを作成し、データを挿入します:
  • 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");
  • checkerを使用してtest databaseのすべてのtable
  • をチェック
    ./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
  • checkerを使用してtest databaseのtable
  • をチェック
    ここで、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を使用する前に、次のことを保証する必要があります.
  • 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の初期同期位置はこの場所から始まる.
    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