初心者はredisを練習します:redis-migrate-toolを使ってredisのオンラインデータの移行をします


目次
一、問題提起
二、redis-migrate-toolについて
三、実験
1.推奨クラスタredis
2.単一インスタンスredisの作成
3.ソースコードインストールredis-migrate-tool
4.redis-migrate-toolの構成
5.テスト
四、業務の切り替え
五、注意事項
参照先:
一、問題提起
トラフィックの増加に伴い,レプリケーションされたredisアーキテクチャからプライマリスレーブのOPSがピークに近づき,データレベルスライスが自然に考えられる.redis 3.0版の大きな特性は、データスライスのクラスタ機能をサポートすることです.クラスタは、単一のインスタンスと同様のパフォーマンスを備え、ネットワークパーティション化後にアクセス性とプライマリ・ライブラリの障害復旧をサポートできることを特徴としています.哨兵とクラスタは2つの独立した機能であるが、特性から見ると哨兵はクラスタのサブセットと見なすことができ、データスライスを必要としない場合やクライアントがスライスを行うシーンで哨兵を使用すれば十分であるが、水平拡張が必要な場合、クラスタはより良い選択である.
新しいredisクラスタが構築された後、元の単一インスタンスredisのデータをredisクラスタにオンラインで移行する必要があり、移行プロセスで既存のサービスに影響を与えることはできません.具体的なニーズは次のとおりです.
  • オンラインデータ移行で、ライブラリを停止することはできません.
  • サービス中断時間を最小化する、すなわち0または0に近い.
  • ビジネスは影響を受けません.つまり、パフォーマンスが低下していません.
  • 移行データの完全性を保証します.
  • 適用変更量は極めて小さい. 

  • 以上のニーズを満たすために、redis-migrate-toolツールがこのデータ移行に適していることが調査されました.
    二、redis-migrate-toolについて
    Redis-Migrate-Tool(RMT)は、唯品会オープンソースのredisデータ移行ツールで、主に異機種redisクラスタ間のデータオンライン移行に使用されます.つまり、データ移行中にソースクラスタはビジネス読み書き要求を正常に受け入れることができ、ビジネス中断サービス時間がありません.現在、このプロジェクトはGitHubにオープンしています(https://github.com/vipshop/redis-migrate-tool).
    RMTには次の機能があります.
  • 快速.
  • マルチスレッド.
  • redisレプリケーションに基づく.
  • リアルタイム移行
  • 移行中、ソースクラスタはサービスの提供に影響しません.
  • 異機種間の移行
  • Twemproxyクラスタ、redis clusterクラスタ、rdbファイル、aofファイルをサポートします.
  • フィルタ機能.
  • ターゲットクラスタがTwemproxyの場合、データはTwemproxyをスキップしてバックエンドのredisに直接インポートされます.
  • 移行ステータス表示.
  • 完全なデータサンプリング検査.

  • RMTは異機種redis相互間の移行をサポートし、データソースは、個別のredisインスタンス、twemproxyクラスタ、redis cluster、rdbファイル、aofファイルであってもよい.ターゲットは、個別のredisインスタンス、twemproxyクラスタ、redis cluster、rdbファイルです.
    RMTが起動するとredis slaveにシミュレートされ、masterの全量データと増分データが要求される.RMTは,データを受信してredisプロトコル形式のoplog(書き込み操作)に解析し,ターゲットライブラリに送信する.2つのリクエスト方式があります.source_safe:trueは、同じip上のredisに対して、全量のデータ(RDB)を1つずつ要求する.source_safe:false、パラレル要求全量データの同期.source_safe:falseの場合、複数のソースredisが存在する同じホストに十分なメモリとRDBが同時にドロップダウンした場合のIOPS性能があるかどうかに注意する必要があります.
    RMTでは、バックアップされたAOFファイルとRDBファイルからターゲットライブラリにリカバリできます.
    三、実験
    6インスタンスredisクラスタと1つの単一インスタンスredisを確立し、テストデータを単一インスタンスredisに挿入し、redis-migrate-toolでクラスタに移行します.注意redis-migrate-toolは現在redis 4をサポートしていない.xであるため,本実験ではredis 3.2.3バージョンを用いた.
    1.推奨クラスタredis
    クラスタは、3ノード6の例からなる、IPおよびポートは、172.16.1.127:20001、20002 172.16.1.126:20001、20002 172.16.1.125:20001、20002(1)準備プロファイルredis.confプロファイルは、次のようなものです.インスタンスごとにポートが異なります.
    rename-command flushAll ""
    daemonize yes
    port 20001
    dir "/var/redis/20001"
    pidfile "/var/redis/20001/redis.pid"
    logfile "/var/redis/20001/redis.log"
    dbfilename "dump.rdb"
    save 900 1
    appendonly no
    appendfilename "appendonly.aof"
    appendfsync always
    maxmemory 1gb
    maxmemory-policy volatile-lru
    maxmemory-samples 3
    slowlog-log-slower-than 10000
    repl-backlog-size 64mb
    timeout 0
    repl-timeout 240
    cluster-enabled yes
    
    requirepass "123456"
    masterauth "123456"
    protected-mode no
    
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit slave 2gb 1gb 300

    (2)すべてのクラスタインスタンスを起動し,3つのノードでそれぞれ以下のコマンドを実行し,6つの単一インスタンスを作成する.
    ~/redis-3.2.3/src/redis-server /var/redis/20001/redis.conf
    ~/redis-3.2.3/src/redis-server /var/redis/20001/redis.conf

    起動後、redisコマンドラインクライアントを使用して任意のノードに接続し、infoコマンドを使用してクラスタが正常に有効になっているかどうかを判断できます.
    [root@hdp4/var/redis]#~/redis-3.2.3/src/redis-cli -p 20001 -a 123456 info cluster
    # Cluster
    cluster_enabled:1
    [root@hdp4/var/redis]#

            cluster_enabledが1の場合、クラスタが正常に有効になっていることを示します.各ノードは完全に独立しており、次は同じクラスタに追加されます.
    (3)redis-tribを実行する.rbスクリプトがクラスタを作成するには、redisがパスワードを設定しているので、redis-tribを変更する必要があります.rbソースは、"@r=Redis.new"行にパスワードを追加します(クラスタ内のすべてのredisは同じパスワードを使用します):
    @r = Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60, :password => "123456")

    次に、次のコマンドを実行してクラスタを作成します.
    ~/redis-3.2.3/src/redis-trib.rb create --replicas 1 172.16.1.127:20001 172.16.1.127:20002 172.16.1.126:20001 172.16.1.126:20002 172.16.1.125:20001 172.16.1.125:20002

    ここでcreateパラメータはクラスタを初期化することを示し、replicas 1は各プライマリ・ライブラリが持つスレーブ数が1であることを示すため、クラスタ全体に3つのプライマリ・ライブラリと3つのスレーブ・ライブラリがあり、プライマリ・スレーブのノード割り当てはredis-tribである.rbで制御します.
    2.単一インスタンスredisの作成
    (1)プロファイルの準備
    redis.conf        ,            cluster-enabled yes:
    rename-command flushAll ""
    daemonize yes
    port 20001
    dir "/var/redis/20001"
    pidfile "/var/redis/20001/redis.pid"
    logfile "/var/redis/20001/redis.log"
    dbfilename "dump.rdb"
    save 900 1
    appendonly no
    appendfilename "appendonly.aof"
    appendfsync always
    maxmemory 1gb
    maxmemory-policy volatile-lru
    maxmemory-samples 3
    slowlog-log-slower-than 10000
    repl-backlog-size 64mb
    timeout 0
    repl-timeout 240
    
    requirepass "123456"
    masterauth "123456"
    protected-mode no
    
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit slave 2gb 1gb 300

    (2)イニシャルインスタンス
    ~/redis-3.2.3/src/redis-server /var/redis/20001/redis.conf

    3.ソースコードインストールredis-migrate-tool
    unzip redis-migrate-tool-master.zip
    cd redis-migrate-tool-master
    autoreconf -fvi
    ./configure
    make

    4.redis-migrate-toolの構成
            rmt.confプロファイルの内容は次のとおりです.
    [source]
    type: single
    servers : 
    -172.16.1.124:20001
    redis_auth: 123456
    
    [target]
    type: redis cluster
    servers:
    -172.16.1.127:20001
    redis_auth: 123456
    
    [common]
    listen: 0.0.0.0:8888

    ターゲットはクラスタ内の任意のノードであればよい.
    5.テスト
    (1)単一インスタンスでいくつかのテストkeyを生成する
    ~/redis-3.2.3/src/redis-cli -p 20001 -a 123456 set foo bar
    ~/redis-3.2.3/src/redis-cli -p 20001 -a 123456 set foo1 bar1
    ~/redis-3.2.3/src/redis-cli -p 20001 -a 123456 set key1 123

    (2)redis-migrate-toolの起動
    ~/redis-migrate-tool-master/src/redis-migrate-tool -c rmt.conf -o log -d

    redis-migrate-toolのリスニングポートは8888です.
    [root@hdp1~/redis-migrate-tool-master]#lsof -i:8888
    COMMAND      PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
    redis-mig 126471 root    9u  IPv4 137161329      0t0  TCP *:ddi-tcp-1 (LISTEN)
    [root@hdp1~/redis-migrate-tool-master]#

    (3)クラスタデータの表示
    [root@hdp4/var/redis]#~/redis-3.2.3/src/redis-cli -p 20001 -a 123456 get foo
    (error) MOVED 12182 172.16.1.125:20001
    [root@hdp4/var/redis]#~/redis-3.2.3/src/redis-cli -h 172.16.1.125 -p 20001 -a 123456 get foo
    "bar"
    [root@hdp4/var/redis]#~/redis-3.2.3/src/redis-cli -p 20001 -a 123456 get foo1
    (error) MOVED 13431 172.16.1.125:20001
    [root@hdp4/var/redis]#~/redis-3.2.3/src/redis-cli -h 172.16.1.125 -p 20001 -a 123456 get foo1
    "bar1"
    [root@hdp4/var/redis]#~/redis-3.2.3/src/redis-cli -p 20001 -a 123456 get key1
    (error) MOVED 9189 172.16.1.126:20001
    [root@hdp4/var/redis]#~/redis-3.2.3/src/redis-cli -h 172.16.1.126 -p 20001 -a 123456 get key1
    "123"
    [root@hdp4/var/redis]#

    3つのテストキーがクラスタにコピーされていることがわかります.以降、単一インスタンス上のデータの変動はクラスタにコピーされます.(4)遷移状態を観察redis-cliを用いてrmtを接続する.confで構成されたポートは、infoコマンドを実行すると、移行の状態を観察できます.total_msgs_outqueueは、total_msgs_outqueue>0、待ち続けてください.
    [root@hdp1~/redis-migrate-tool-master]#~/redis-3.2.3/src/redis-cli -p 8888 info
    # Server
    version:0.1.0
    os:Linux 3.10.0-327.el7.x86_64 x86_64
    multiplexing_api:epoll
    gcc_version:4.8.5
    process_id:126471
    tcp_port:8888
    uptime_in_seconds:141
    uptime_in_days:0
    config_file:/root/redis-migrate-tool-master/rmt.conf
    
    # Clients
    connected_clients:1
    max_clients_limit:100
    total_connections_received:2
    
    # Memory
    mem_allocator:jemalloc-4.0.4
    
    # Group
    source_nodes_count:1
    target_nodes_count:3
    
    # Stats
    all_rdb_received:1
    all_rdb_parsed:1
    all_aof_loaded:0
    rdb_received_count:1
    rdb_parsed_count:1
    aof_loaded_count:0
    total_msgs_recv:3
    total_msgs_sent:3
    total_net_input_bytes:305
    total_net_output_bytes:96
    total_net_input_bytes_human:305B
    total_net_output_bytes_human:96B
    total_mbufs_inqueue:0
    total_msgs_outqueue:0
    [root@hdp1~/redis-migrate-tool-master]#

    (5)クラスタとターゲットの違いの検証
    [root@hdp1~/redis-migrate-tool-master]#src/redis-migrate-tool -c rmt.conf -o log -C "redis_check 10000"
    Check job is running...
    
    Checked keys: 10000
    Inconsistent value keys: 0
    Inconsistent expire keys : 0
    Other check error keys: 0
    Checked OK keys: 10000
    
    All keys checked OK!
    Check job finished, used 0.136s
    [root@hdp1~/redis-migrate-tool-master]#

    四、業務の切り替え
    異機種クラスタの移行であれば、redisドライバ/クライアントを変更し、コードを変更し、再配布することは必然的です.同構造クラスタであれば,構成パブリケーションを行えばよい.再起動パブリケーションが行われていない場合、ソースクラスタが接続されていないのを待ってから、REDIS-MIGRATE-TOOLプロセス(killまたはredis-cli shutdown)を閉じることができます.またはアプリケーションを再起動し、強制的に長い接続を切断します. 
    五、注意事項
  • REDIS-MIGRATE-TOOLはtwemproxyにデータを移行し、rmtを維持する必要がある.confの[target]hash、distribution、serversの3つのパラメータとターゲットクラスタのtwemproxy構成は厳密に一致している.
  • 移行中と業務切替前に、「-o redis-migrate-tool.log」ログ情報を繰り返し観察し、異常がないか確認してください.
  • 業務の切り替えの前に、特にデータの整合性を十分にチェックしてください.
  • REDIS-MIGRATE-TOOLは、同じ目的のクラスタが同じネットワークセグメント(マシンルーム間でデータを移行し、移行速度を向上させることができる)に配置されることを提案しています.メモリ、帯域幅、IOPSなどのリソース不足を防ぐために、ソースクラスタにあるマシンを配備しないでください.
  • RDB送信がタイムアウトしたかどうかに注意してください.
  • redis client bufのslave項目は、十分なbuffer sizeとタイムアウト時間を設定します.
  • このツールを実行する前に、redisソースマシンが少なくとも1つのRDBファイルを生成するのに十分なメモリを持っているかどうかを確認してください.redisソースマシンに十分なメモリがある場合、すべてのredisがRDBファイルを同時に生成することを許可する、プロファイルrmt.confの追加構成項目source_safe: false
  • 次のコマンドは、keysがこれらのコマンドを使用すると、異なるターゲットredisノードにまたがる可能性があるため、ターゲットredisグループへの伝播はサポートされません.RENAME、RENAMENX、RPOPLPUSH、BRPOPLUSH、FLUSHALL、FLUSHDB、BITOP、MOVE、GEORADIUS、GEORADIUSBYMEMBER、EVAL、EVALSHA、SCRIPT、PFMERGEEです.

  • 参照先:
  • redis-migrate-tool
  • Redis異機種クラスタデータオンライン移行ツールRedis-Migrate-Tool
  • redis-migrate-tool移行ツール