Redisのマスター・スレーブ原理ディープコピー

記事のディレクトリ:

1、2複製プロセス、3つの同期データ、4コピーの全体量は、コピー部5、6心拍、非同期レプリケーション

レプリケーションの動作

1.コピー処理

以下のプロセスステップをコピーします。

1は、slaveof 2を実行するノードからのコマンドは、ノードは、単にマスターノードに情報slaveofコマンドを保持し、次に複製3を開始しない、発見情報は、ノード内のタスクのタイミングからマスターノードを有し、ソケット接続マスターノード4を使用して起動します接続が確立された後、マスターノードセットの権限は、あなたが検証を実行するための許可が必要な場合は、それ以外の場合は、さえ5重くなり、ピンポンコマンド応答を得ることを期待して、pingコマンドを送信し、検証は、レプリケーションの終了に失敗した場合。6、権限検証によって、データ同期、最長の動作である、マスターノードは、すべてのスレーブ・ノードへのすべてのデータを送信します。図7に示すように、現在のマスターノードがノードからのデータを同期する、レプリケーションを確立するプロセスを完了します。次に、マスターノードは、スレーブノードへの書き込みコマンドを送信し、マスタからのデータの整合性を確保していきます

 

2との間のデータ同期を

上記の複製プロセス、「同期データ収集」、「「これが今話している間のデータ同期であるステップは語りました。

Redisの同期は、2つのコマンドがあります。

同期とPSYNC、前者は新しい同期の設計を最適化するために、コマンドのRedis 2.8で2.8 Redisの前に同期コマンドです。我々は2.8 PSYNCコマンドに焦点を当てます。

PSYNCコマンドは、次の3つのコンポーネントのサポートが必要です。

1、オフセット2からコピーされた各々のマスターノード、3バッファバックログは、マスターノードIDをマスターノードを複製します

各ノードからのオフセットプライマリコピー:

独自のコピーを維持するために、レプリケーションマスタに関わる1は、ノードからオフセットされています。

2、マスターノード書き込みコマンドを処理した後、コマンドのバイト長が蓄積されるレコードは、統計は、情報の複製で指標をmasterreploffset。

図3に示すように、マスタノードにオフセット自身の第2のコピーあたりのノードレポートは、マスタノードは、このように、ノードの保存されたコピーから相殺します。

図4に示すように、マスタノードからコマンドを受信したノードは、自身が情報の複製に蓄積された統計情報を相殺します。

図5は、オフセット複製マスタノードは、マスタノードから決定することができる比較することにより、同じデータです。

マスターノードのレプリケーションバックログバッファ:

複製バックログは、固定長キューのマスターノードのFIFOバッファに格納されます。1メガバイトのデフォルトサイズ。2は、スレーブ接続のキューが作成されます。このとき、書き込みコマンドに応答して、マスターノード、コマンドはまた、コピーバッファに書き込まれたスレーブノードに送信されます。3、彼の役割の一部が失われたデータ回復のためのコマンドをコピーし、コピーすることです。あなたは、情報複製を通じて関連情報を見ることができます。

マスターノードID:

各Redisのは、彼らが40ビット動作IDを生成することを開始します。図2に示すように、主機能操作IDは、Redisのノードを識別するために使用されます。マスターノードは、次いでオフセットに基づいて、ノードからコピー修飾RDB / AOFデータを、再起動した場合、IP +ポート道場合、安全でないであろう。IDの変更を実行しているときに、ノードからの全額がコピーされます。言い換えれば、再起動後のRedis、コピーの全額からデフォルトのノードで。

あなたがIDを変更しない場合は、再起動時にそれを実行しますか?

RDBは、デバッグreloadコマンドによってリロードされ、同じIDを実行し続けることができます。効果的に全額の不必要な複製を避けるために。、閉塞を許容できないマスタノードまたはノードへの大量のデータのためにデバッグリロードコマンドは、メインスレッドのRedis現在のノードをブロックする注意して使用する必要があります2は、彼の欠点があります。一般的には、フェールオーバーメカニズムによってこの問題を解決することができます。

PSYNCは、次のコマンドを使用します。

コマンド形式 psync{runId}{offset}

RUNID:実行IDは、ノードからコピーされたマスターノードをオフセット:現在のデータがコピーされたノードからのオフセット

PSYNC実行プロセス:

プロセスの説明:

デフォルトは-1でない場合、マスターノードからノードへ送信されるPSYNCコマンド、ターゲットIDがRUNIDマスタノードは、それが最初のコピーである場合、または、ノードに格納されたコピーからオフセットされるオフセット、-1。

マスターノードはRUNIDとオフセットに基づいて結果を返すように決定します。

返信+ FULLRESYNC {RUNID}は{}オフセット場合1は、ノードは、複製プロセスの全体量をトリガします。

2.返信+が続けば、ノードは、部分的なコピーがトリガされます。

3.返信+ ERRは、マスターノードが完全な同期複製ボリュームを実行するために使用される2.8のPSYNCコマンドをサポートしていない場合は説明。

ここでは、について話をするデータ同期、および長さの間ではかなり長いです。主にPSYNC関連のコマンド間の導入のために。

 

3.全額をコピーします。

早い方法Redisのサポートの全額をコピーするだけでなく、最初の段階からコピーするときに、メインの確立が通過しなければならない。コピー コマンドは、レプリケーションの全額が同期してPSYNCでトリガします。前に述べた、バージョン流域これら2つのコマンドは2.8の後、同期と部分同期の全額を支持しながら2.8のRedisのみ、異なる全額を実行する前に同期を使用して、2.8です。

次のようにプロセスは以下のとおりです。

 

フィギュアの手順について教えてください:

図1に示すように、送信コマンドPSYNC(spyncは?-1)2、マスターノードID及びノードレコードは4、オフセットマスターノードからの指令に応じFULLRESYNC 3を返しRDB bgsaveマスタノードとにローカルに保存された図5に示すように、マスタノードは、ノードRBDにファイルを送信する 6 、RDBノードから文書を受信し、メモリにロード完了した後、過去に送信されたRDBノードからロードされたときに、「クライアントバッファをコピーする」ために新しいデータを保存するためにノードからデータを受信しながら、7、マスターノード。、8(ノードは、同期失敗の最後の全額を、バッファオーバーフローが発生します、時間がかかりすぎている場合は)RDBファイルが大きい場合、ノードデータから空にRDBファイルをロードし、このステップはまだ時間がかかり、この時間であればクライアントアクセスは、 、一貫性のないデータにつながる、あなたは、コンフィギュレーション・スレーブ・サーバー・古くなったデータが閉じ使用することができます。9を、成功しRBDロードされたノードの完了後、AOF開いた場合、bgrewriteaofすぐに行います

もっと大胆な部分は、同期に時間がかかり、全体の場所の全体量です。

注意:

1、如过 RDB 文件大于 6GB,并且是千兆网卡,Redis 的默认超时机制(60 秒),会导致全量复制失败。可以通过调大 repl-timeout 参数来解决此问题。 2、Redis 虽然支持无盘复制,即直接通过网络发送给从节点,但功能不是很完善,生产环境慎用。

4.部分复制

当从节点正在复制主节点时,如果出现网络闪断和其他异常,从节点会让主节点补发丢失的命令数据,主节点只需要将复制缓冲区的数据发送到从节点就能够保证数据的一致性,相比较全量复制,成本小很多。

步骤如下:

 

1、当从节点出现网络中断,超过了 repl-timeout 时间,主节点就会中断复制连接。 2、主节点会将请求的数据写入到“复制积压缓冲区”,默认 1MB。 3、当从节点恢复,重新连接上主节点,从节点会将 offset 和主节点 id 发送到主节点 4、主节点校验后,如果偏移量的数后的数据在缓冲区中,就发送 cuntinue 响应 —— 表示可以进行部分复制 5、主节点将缓冲区的数据发送到从节点,保证主从复制进行正常状态。


5.心跳

主从节点在建立复制后,他们之间维护着长连接并彼此发送心跳命令。

心跳的关键机制如下:

 

1、中从都有心跳检测机制,各自模拟成对方的客户端进行通信,通过 client list 命令查看复制相关客户端信息,主节点的连接状态为 flags = M,从节点的连接状态是 flags = S。 2、主节点默认每隔 10 秒对从节点发送 ping 命令,可修改配置 repl-ping-slave-period 控制发送频率。 3、从节点在主线程每隔一秒发送 replconf ack{offset} 命令,给主节点上报自身当前的复制偏移量。 4、主节点收到 replconf 信息后,判断从节点超时时间,如果超过 repl-timeout 60 秒,则判断节点下线。

注意:为了降低主从延迟,一般把 redis 主从节点部署在相同的机房/同城机房,避免网络延迟带来的网络分区造成的心跳中断等情况。

6.异步复制

主节点不但负责数据读写,还负责把写命令同步给从节点,写命令的发送过程是异步完成,也就是说主节点处理完写命令后立即返回客户度,并不等待从节点复制完成。

异步复制的步骤很简单,如下:

 

1、主节点接受处理命令 2、主节点处理完后返回响应结果 3、对于修改命令,异步发送给从节点,从节点在主线程中执行复制的命令。

总结

本文主要分析了 Redis 的复制原理,包括复制过程,数据之间的同步,全量复制的流程,部分复制的流程,心跳设计,异步复制流程。

其中,可以看出,RDB 数据之间的同步非常耗时。所以,Redis 在 2.8 版本退出了类似增量复制的 psync 命令,当 Redis 主从直接发生了网络中断,不会进行全量复制,而是将数据放到缓冲区(默认 1MB)里,在通过主从之间各自维护复制 offset 来判断缓存区的数据是否溢出,如果没有溢出,只需要发送缓冲区数据即可,成本很小,反之,则要进行全量复制,因此,控制缓冲区大小非常的重要。

引用

《Redis 开发与运维》

好了,关于redis 主从复制的原理就介绍到这里 ,篇幅有限,难免疏漏。

来源:http://t.cn/EJ24L7D

おすすめ

転載: www.cnblogs.com/veblen/p/10985359.html