ピピ+ redis +センチネル=高利用レッド


Pipy は、クラウド、エッジ、およびiOTのオープンソースプログラマブルプロキシです.Pipy用途が広い自然は、それが複数のユースケースで使われるのを許します.この記事の主な目的は、クライアントとアプリケーションの接続が常に楽しまれるようにREDISマスターとスレーブ(エージェント)の複製の前にTCP負荷バランサーとしてPIPYの実装を示すことです.

目標

  • 我々は、プロセス終了、ハードウェア障害、ネットワークしゃっくりまたはいくつかの既知の理由のために指定されたRedisマスターノード停止が指定された場合、自動フェイルオーバー機能を実装して、達成したいです、そして、sentinelは残りのエージェントノードのうちの1つに自動的に失敗します.
  • クライアントとアプリケーションRedisに接続するフェイルオーバーメカニズムによって影響されていません.
  • 我々は、クライアントとアプリケーションの設定/設定の変更を必要とせずに全体フェイルオーバーメカニズムを完全に透明にする.
  • 我々は、すべての書き込み(Redisセットまたは他のユーザー設定コマンド)の要求をマスターノードによって処理されたクライアントとアプリケーションのない場所でのトポロジーを知っている.
  • 私たちは、すべてのリクエストが割り当てられたリソースのより良い使用をするために利用可能なノードに等しく分配されることを望みます.
  • ....
  • ロードバランシング、TCP接続をプロキシして、セット(または他のユーザー構成)Redisコマンドを確実にすることは常にマスターノードに送られます.
    マスターとエージェント実装を含むRedis展開のための高可用性は、Redis Sentinelを実装することによって達成されます.

    クイックテクノロジー入門


  • Pipy は、クラウド、エッジ、およびiOTのオープンソースプログラマブルプロキシです.

  • Redis オープンソースは、メモリのデータストア、ベンチマーク世界最速です.Redisパワーエッジアプリケーションを切断し、リアルタイム分析、高速高ボリュームトランザクション、アプリケーションの社会的機能、アプリケーションのジョブ管理、キューやキャッシュなどのユースケースを強化するために知られています.

  • Redis Sentinel Redisクラスタを使用しない場合はRedisに対して高可用性を提供します.
  • デモ高レベル展開アーキテクチャ


  • つのPIPYプロキシサーバはTCP負荷バランサとして動作し、REDISサーバが利用可能であり、リクエストを提供する準備ができているトラックを維持する.
  • つのREDISサーバは、マスターエージェント複製を提供します.
  • ロバスト展開のための3つのsentinelインスタンス
  • セットアップ


    デモンストレーション目的のために、デモコードは、Dockerを構成するスクリプトを回転させるようになります.
    デモの完全なソースが利用可能でありhttps://github.com/flomesh-io/pipy-demos/tree/main/pipy-redis-sentinel

    必要条件

  • Docker
  • docker-compose
  • redis-cli
  • クローンPipy Demos Repo またはデモコードをダウンロードpipy-redis-sentinel .

  • PIPYプロキシ、REDIS、Sentinelコンテナのスピンアップ
    $ docker-compose up -d
    
  • テスト

  • すべてのコンテナが稼働中であることを確認します.
  • $ docker ps
    
    CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                                                 NAMES
    0db7eba4f91d   sentinel                    "sentinel-entrypoint…"   6 seconds ago   Up 6 seconds   6379/tcp, 26379/tcp                                   redis_sentinel_3
    e4a7b6b99074   sentinel                    "sentinel-entrypoint…"   6 seconds ago   Up 6 seconds   6379/tcp, 26379/tcp                                   redis_sentinel_2
    4ec87846b1e3   naqvis/pipy-pjs:0.22.0-31   "/docker-entrypoint.…"   6 seconds ago   Up 5 seconds   6000/tcp, 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   pipy-proxy
    8e81ddc5eb07   sentinel                    "sentinel-entrypoint…"   6 seconds ago   Up 4 seconds   6379/tcp, 26379/tcp                                   redis_sentinel_1
    f1a533de6d41   redis:alpine                "docker-entrypoint.s…"   8 seconds ago   Up 6 seconds   6379/tcp                                              redis-slave2
    a522c208b236   redis:alpine                "docker-entrypoint.s…"   8 seconds ago   Up 7 seconds   6379/tcp                                              redis-slave1
    8065dec93c3d   redis:alpine                "docker-entrypoint.s…"   8 seconds ago   Up 7 seconds   6379/tcp                                              redis-master
    
    Pipyは3つのREDISコンテナ(1人のマスターと2人のスレーブ)の向こう側に標準的なRedisポートと荷天秤であるDockerホストの上でTCPポート6379を聞いています.強力な展開とRedisのための高い可用性を提供するための3つのRedis Sentinel contaners.
  • PIPYサービスがコマンド以下で実行することによってすべてのREDISノードにルーティングトラフィックであることを確認してください.ピピが6379のREDISデフォルトポートを公開しているので、DockerホストIPとポート情報を提供する必要はありません.
  • $ redis-cli info replication | grep role
    role:master
    $ redis-cli info replication | grep role
    role:slave
    $ redis-cli info replication | grep role
    role:slave
    
    Pipy負荷分散アルゴリズムとデモスクリプトが付属して使用するように設定されてRoundRobinLoadBalancer そして、上記の出力から、Pipyがすべての構成されたREDISノードにRequordeのファッションでリクエストを送っているのを見ることができます.
  • もっと赤のコマンドを試してみましょう
  • $ redis-cli set hello world
    OK
    
    $ redis-cli get hello
    "world"
    
    $ redis-cli set foo bar
    OK
    
    私たちは、プロキシをRolldrobinアルゴリズムを使用するように設定しましたSET リクエストは正常に実行されます.我々が単に各々のノードに等しくリクエストを転送するために丸いビンアルゴリズムに続いたならば、我々SET スレーブノードに到達するリクエストは以下のようにエラーに失敗しました:
    (error) READONLY You can't write against a read only slave.
    

    フェイルオーバーテスト

  • 休止しましょうredis-master 自動失敗をテストするコンテナ
  • $ docker pause redis-master
    
    Sentinelは自動的にマスターが行方不明であることを検出し、それはマスターとして推進するスレーブを選択します.ヘルスチェック中のPIPYは、マスターノードがダウンしていることを検出します.Pipy新しいマスターノードを検出し、すべてを転送しますSET 新しく昇進するコマンドmaster node .
  • 何らかの問題なしでREDISにアクセスできるかどうかを見るためにいくつかのREDISコマンドを実行します.
  • $ redis-cli set abc 1234
    OK
    
    $ redis-cli get abc
    "1234"
    
  • 一時停止コンテナを戻し、Sentinelはスレーブノードとしてマークされます
  • $ docker unpause redis-master
    
    
    それは、あなたが今使用する必要がない場合は、フォールトトレラントで高利用可能なredisを設定する必要があるすべてを持っている必要がありますRedis Cluster .

    性能試験


    我々は、Pipy、Happroxy、twemproxy、およびシングルRedisインスタンスで様々なテストを行いました.
    以下は、我々のMac M 1 MAXで動いているOS 20.04.4 LTS(焦点Fossa)ARM 64で、我々のVMで実行されるテスト結果です.

    Redisの前にどんなプロキシを加えても性能ペナルティを引き起こすということは明らかです、しかし、それは利益代理人が持ってくる利益を達成するために支払わなければならなかったコストです.

    結論


    インフラストラクチャサービスをソフトウェア構成と組み合わせることによって、REDISレプリケーションのためにRedis高可用性とどんな障害と災害に対しても最大の保護を達成することができます.Properyのインフラストラクチャの設定とデザインでは、異なるアベイラビリティゾーンを使用して、マスターとスレーブのREDISレプリケーションのための高い可用性を達成することができます.Redis SentinelはマスターからスレーブへのREDISレプリケーションのフェイルオーバを監視し、実行します.
    Pipyopen-source , 非常に高速で、エッジルータ、ロードバランシング&プロキシ(フォワード/リバース)、APIゲートウェイ、スタティックHTTPサーバ、サービスメッシュサイドカー、および他の多くのアプリケーションに至るまで様々な使用ケースで使用することができます軽量ネットワークトラフィックプロセッサ.Pipyは活発な開発において、フルタイムのコミットメントと誘因によって維持されます.