高性能nosql ledisdbの設計と実現(2)

3375 ワード

ledisdbは現在replicationメカニズムをサポートしており、ledisdbの高可用性を保障しています.
使用
マスターのipが10.20.187.100、ポート6380、slaveのipが10.20.187.101、ポート6380とする.
まず、masterがbinlogサポートを開き、プロファイルで指定する必要があります.
use_bin_log : true

slaveのマシンでは、プロファイルを使用してslaveofがreplicationを開くか、コマンドslaveofで表示されるオンまたはオフを指定できます.
slaveof 10.20.187.100 6380

ledisdbのreplicationメカニズムはredisおよびmysqlに関する実装を参照し,以下で簡単に説明する.
redis replication
redisのreplicationメカニズムは主にここで紹介されており,すでに詳細に説明されている.
  • slaveはsyncコマンド
  • をmasterに送信する.
  • masterは、現在のデータをファイルにdumpし、新しい変更コマンド
  • をメモリにキャッシュする.
  • データdumpが完了するとmasterはslave
  • に送信する.
  • slaveは、dumpが完了するデータを受信した後、自機の以前のデータを空にし、dumpにインポートするデータ
  • に格納する.
  • masterは、以前にキャッシュするコマンドをslave
  • に送信する.
    redis 2.8以降、断線によるdumpの再生成を防止するため、redisはpsyncコマンドを追加し、断線時にmasterが現在の同期状態を記憶し、次回に断点再送を行うことができます.
    mysql replication
    mysqlのreplicationは主にbinlogの同期によって行われる.masterのデータ更新ではbinlogが書き込まれますが、binlogのフォーマットについてはここでは説明しません.
    binlogのbasenameがmysql、indexファイル名がmysql-binと仮定する.index、現在のbinlogファイルをすべて記録します.
    binlogにはmax file sizeの構成があり、binlogが書き込むファイルサイズがこの値を超えるとmysqlは新しいbinlogファイルを生成します.mysqlサービスが再起動されると、新しいbinlogファイルも生成されます.
    Perconaのmysqlバージョンではbinlogにmax file numの設定があり、binlogのファイル数がこの値を超えるとmysqlが最初のbinlogを削除します.
    slaveにはmasterがありますinfoのファイルは、現在同期しているmasterのbinlogの情報を記録するために使用され、主に現在同期しているbinlogファイル名とデータオフセット位置であり、次回の再同期時にその位置から継続することができる.
    slave同期のデータはrelay logに書き込まれ、バックグラウンドにrelay logのデータがmysqlに格納される別のスレッドがあります.
    マスターのbinlogが削除される可能性があるため、slave同期時にbinlogが失われる可能性があります.mysqlはdump+binlogで解決されます.つまり、slaveの完全なdumpマスターデータは、生成されたdumpにも現在のbinlog情報が同時に記録され、次回の同期を継続するのに便利です.
    ledisdb replication
    ledisdbのreplicationメカニズムはredisおよびmysqlを参照し、fullsyncおよびインクリメンタルsyncをサポートする.
    masterはaofメカニズムではなくbinlogを使用し、max file sizeおよびmax file numを指定してbinlogの全体的なサイズを制御することで、aofファイルが増大し続けるために再rewriteを必要とするプロセスに関心を持つ必要はありません.
    binlogファイル名のフォーマットは次のとおりです.
    ledis-bin.0000001
    ledis-bin.0000002

    binlogファイル名の接尾辞は数値的に増加し,その後indexを用いて表す.
    slave端子にもmasterがあります.infoファイルは、ledisdbがbinlogファイルの接尾辞の増加を厳格に保証するため、現在同期しているbinlogファイルの接尾辞のindexを記録するだけでよい.
    Replicationプロセス全体は次のとおりです.
  • 初回同期または記録されたbinlog情報がmaster側binlog削除により一致しない場合、slaveはfullsyncを送信して全同期を行う.
  • masterはfullsync情報を受信すると、現在のデータおよびbinlog情報をファイルにdumpし、slaveに送信します.
  • slaveはdumpファイル全体が完了したことを受け入れた後、すべてのデータを空にし、同時にdumpのデータをleveldbにインポートし、現在のdumpのbinlog情報を保存する.
  • slaveはsyncコマンドによりインクリメンタル同期を行い、syncコマンドフォーマットは以下の通りである:
      sync binlog-index binlog-pos
    masterはindexを介して指定したbinlogファイルに位置決めし、seekはpos位置に移動し、その後のbinlogデータをslaveに送信する.
  • slaveはbinlogデータを受信し、leveldbをインポートします.syncが新しいデータを受信していない場合は、1 s後に再びsyncします.

  • 最後に、masterに追加されたbinlogがslaveを同期させる方法について最も主要な問題です.これは2つのモデル、pushとpullにほかならない.
    pushにとって、任意の新しいデータはslaveに非常にタイムリーに取得するように通知することができますが、pullモデルは性能を考慮するために、あまり頻繁にポーリングすることはできません.少し遅延します.
    mysqlはpush+pullのモードを採用しており、binlogが更新された場合、slaveが更新されたことを通知するだけで、slaveはpullを通じて実際のデータを引き出します.しかしpushをサポートするために、masterはslaveのいくつかの状態情報を維持しなければならない.これは少し複雑さを増した.
    ledisdbは非常に簡単な方法を採用しており、タイミングpullは、1 sの間隔を使用しており、ポーリングが頻繁すぎるためにパフォーマンスオーバーヘッドが増大することはなく、リアルタイムのデータ損失のリスクを最小限に抑えることができます.
    まとめ
    ledisdbのreplicationメカニズムは完成したばかりで、その後はまだ多くの改善が必要ですが、高可用性のnosql選択になるのに十分です.
    ledisdbのURLはこちらですhttps://github.com/siddontang/ledisdbああ、興味のある子供靴が一緒に参加してほしいです.