Yugabyte SQL統計を収集するための使節プロキシのPostgreSQLとTCPフィルタの使用


注:これはもともと公開された私の同僚のブログのクロスポストですhere .
NginxとHaproxyのような7層のプロキシは2000年代半ば以来人気がありました.「プロキシ」という用語は、アプリケーションクライアントとアプリケーションサーバとの間のトラフィックの仲介者としての役割を指します.「Layer 7」分類は、これらのプロキシがURL、IP、TCP/UDPポート、クッキー、またはAに送られたメッセージに存在するどんな情報に基づくルーティング決定をするという事実から来ますlayer 7 (aka application layer) networking protocol HTTPとGRPCのように.最新のアプリケーションでは、負荷分散、セキュリティ、およびWebアクセラレータを含むさまざまなニーズにこれらのプロキシを使用します.

何が使節代理?
特使は、レイヤ7のプロキシと通信バスは大規模な近代的なサービス指向アーキテクチャのために設計されます.ITShome page は以下の定義を持っている:
もともとリフトで構築された、特使は、大規模なマイクロサービス“サービスメッシュ”アーキテクチャのために設計された通信バスと“ユニバーサルデータプレーン”と同様に、単一のサービスやアプリケーションのために設計された高性能C++分散プロキシです.nginx、haproxy、ハードウェア負荷バランサ、およびクラウド負荷のバランサのようなソリューションの学習に組み込まれて、特使は、すべてのアプリケーションと一緒に実行し、ネットワークのプラットフォーム不可知論的な方法で共通の機能を提供することによって説明します.インフラストラクチャ内のすべてのサービストラフィックが特使メッシュを介して流れるとき、一貫した観測可能性を介して問題領域を可視化し、全体的なパフォーマンスを調整し、単一の場所に基板の機能を追加することが容易になります.
最近出版されるようにDropbox’s migration from NGINX 使節ハイライトには、特使は急速に高いパフォーマンス、可観測性、拡張性、セキュリティ、建築、テストを必要とする雲ネイティブアプリケーションの既定のプロキシになり、そして最後に、しかし、少なくとも、深い機能(HTTP/2、GRPC、および出口のプロキシなど).それは、第3のCNCFプロジェクトでしたgraduated status , KubernetesとPrometheusに続いて、比較的短い期間で広範囲にわたる養子縁組を得ました.

なぜ使者のPostgreSQLフィルタを使うのですか?
使者は複数のトラフィック・リスナーの構成をサポートします.個々のフィルタ・チェーンは、フィルタmatch criteria (宛先ポート/IP、トランスポートプロトコル名、ソースポート/IPなどの接続パラメータが含まれます.新しい接続がリスナーで受信されると、一致するフィルターチェーンが選択され、インスタンス化されます.その後、フィルタはその後のイベントを処理し始める.この一般的なリスナーのアーキテクチャは、代理人がレート制限、TLSクライアント認証、HTTP接続管理、RAW TCPプロキシ、および多くを含むために使用されるさまざまなプロキシタスクの大部分を実行するために使用されます.データベース展開に関連するそのようなタスクは、MySQL、MongoDB、Kafka、およびAmazonのダイナモのような一般的なデータベースの有線プロトコルを計る能力です.このリストからPostgreSQLが見つかりませんでしたがv1.15 リリース2020年7月からの問題を解決するPostgreSQL proxy filter . このフィルタはPostgreSQL frontend/backend protocol version 3.0 , これはPostgreSQL 7.4で導入されました.
PostgreSQLフィルタの主な目的は、データベースサーバーに完全に透明なままで実行時統計情報をキャプチャすることです.これらの重要な統計情報を収集するために展開または管理する追加の監視ソフトウェアはありません!に記載されているofficial docs , このフィルタは現在、次の機能を提供しています.
  • 非SSLトラフィックをデコード
  • セッション情報をデコード
  • コミットとロールバックを含むトランザクション情報をキャプチャ
  • 異なる種類の文のためのカウンタを公開します(挿入、選択、削除、更新など).
  • フロントエンド、バックエンド、および不明なメッセージ
  • エラーとバックエンドレスポンスを識別する
  • YugabyteDBはPostgreSQLのワイヤプロトコルとSQL構文と完全に互換性があります.SQLクエリ層はPostgreSQL 11.2のクエリ層のフォークに基づいています.結果として、yugabytedbはどんな変更もなしに使節からPostgreSQLフィルタを活用することができます.このポストの残りの部分は、Dockerの構成を使用して、Engailyセットアップ(PostgreSQLとTCPフィルタを含む)で最も基本的なyugabytedbを実行するための指示を概説します.オフィシャルEnvoy sandboxes 別の機能とハイライトのサンプル構成をテストするために、同じアプローチを使用します.

    活動中の使節をもつユガッティテブ

    インストール
    あなたのローカルマシンにインストールされているDockerとDockerを持っていることを確認してください.Docker Desktop この目標を達成する最も簡単な方法である.

    を作成して、“使者とyugabytedb”のスタックを使用してスタックを構築

    ワーキングディレクトリの作成
    mkdir yugabyte-envoy
    

    使節を作る.ヤル
    以下の内容をファイル名にコピーしますenvoy.yaml .
    static_resources:
      listeners:
      - name: yb_listener
        address:
          socket_address:
            address: 0.0.0.0
            port_value: 1999
        filter_chains:
        - filters:
          - name: envoy.filters.network.postgres_proxy
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.network.postgres_proxy.v3alpha.PostgresProxy
              stat_prefix: ysql
          - name: envoy.tcp_proxy
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.network.tcp_proxy.v3.TcpProxy
              stat_prefix: tcp_ysql
              cluster: yb_cluster
    
      clusters:
      - name: yb_cluster
        connect_timeout: 1s
        type: strict_dns
        load_assignment:
          cluster_name: yb_cluster
          endpoints:
          - lb_endpoints:
            - endpoint:
                address:
                  socket_address:
                    address: ysql
                    port_value: 5433
    
    admin:
      access_log_path: "/dev/null"
      address:
        socket_address:
          address: 0.0.0.0
          port_value: 8001
    
    上記のように、PostgreSQLとTCPの2つのフィルタを持つフィルタ・チェーンを持つ1999年に、使節リスナーを設定しました.

    使者Dockerfileを作成します
    以下の内容をファイル名にコピーしますDockerfile-proxy . 組み込みおよびインスタンス化された場合、使節を使用するEnvoproxyプロキシコンテナがあります.YAML設定を前の手順で作成します.
    FROM envoyproxy/envoy-dev:latest
    
    COPY ./envoy.yaml /etc/envoy.yaml
    RUN chmod go+r /etc/envoy.yaml
    CMD /usr/local/bin/envoy -c /etc/envoy.yaml -l debug
    

    yugabytedb dockerfileを作成する
    以下の内容をファイル名にコピーしますDockerfile-yugabyte . ビルドとインスタンス化が行われた場合、PostgreSQL互換のysql APIがport 5433で利用可能な単一のGibabyteDBコンテナがあります.
    FROM yugabytedb/yugabyte:latest
    
    CMD ["/home/yugabyte/bin/yugabyted","start","--daemon=false"]
    

    Dockerを作成します.ヤル
    以下の内容をファイル名にコピーしますdocker-compose.yaml .
    version: "3.7"
    services:
    
      proxy:
        build:
          context: .
          dockerfile: Dockerfile-proxy
        networks:
          envoymesh:
            aliases:
              - envoy
        expose:
          - "1999"
          - "8001"
        ports:
          - "1999:1999"
          - "8001:8001"
    
      yugabyte:
        build:
          context: .
          dockerfile: Dockerfile-yugabyte
        networks:
          envoymesh:
            aliases:
              - ysql
        expose:
          - "5433"
        ports:
          - "5433:5433"
    
    networks:
      envoymesh:
        name: envoymesh
    

    Dockerの作成スタックを作成する
    docker-compose pull
    docker-compose up --build -d
    docker-compose ps
    
    からの出力ps コマンドを以下に示す.
    Name                      Command                     State                Ports                                              
    ---------------------------------------------------------------------------------
    yugabyte_proxy_1      /docker-entrypoint.sh /bin ...   Up      ... 0.0.0.0:1999->1999/tcp, 0.0.0.0:8001->8001/tcp                                                                    
    yugabyte_yugabyte_1   /home/yugabyte/bin/yugabyt ...   Up      ... 0.0.0.0:5433->5433/tcp, ...
    
    我々が見ることができるように、2つのコンテナは、一般的な使節ネットワークで紡績されました.
  • Yugabytestra YogabyTeank 1は、ポート番号533のPostgreSQLクライアントと対話する準備ができているyugabytedbコンテナです.
  • Supgresqlプロキシは、1999年のポートでPostgreSQLプロキシを実行している使節プロキシコンテナです.このポートへの要求は、自動的にYugabyteDBコンテナのポート5433にリダイレクトされます.

  • 使節リスナーを介してysqlshを使用して接続します
    現在、我々はYugabyteDBクラスタに接続する準備ができていますysqlsh . しかし、5433 YugabyteDBコンテナのポートは、我々は使節プロキシに接続されます1999 ポート.
    docker run --rm -it --network envoymesh yugabytedb/yugabyte /home/yugabyte/bin/ysqlsh "sslmode=disable" -h envoy -p 1999
    
    で強調表示されるようにEnvoy docs , 現在のPostgreSQLフィルタは非SSL(別名非暗号化)トラフィックのみをデコードし、SSL/暗号化されたトラフィックを無視します.The sslmode=disable 上記のオプションは、暗号化なしでクラスタが設定されていても、暗号化されていないPostgreSQLトラフィックを扱う使節に必須です.この動作はPostgreSQL 12と11.2の両方で再現可能であるため、このバージョンのforkに対応しています.

    基本的なysqlコマンドを実行する
    テーブルを作りましょう.
    CREATE TABLE links (
        id SERIAL PRIMARY KEY,
        url VARCHAR(255) NOT NULL,
        name VARCHAR(255) NOT NULL,
        description VARCHAR (255),
          last_update DATE
    );
    
    では、作成したテーブルに4行を挿入します.
    INSERT INTO links (url, name)
    VALUES('https://www.postgresqltutorial.com','PostgreSQL Tutorial');
    
    INSERT INTO links (url, name)
    VALUES('https://www.oreilly.com','O''Reilly Media');
    
    INSERT INTO links (url, name)
    VALUES('https://docs.yugabyte.com','YugabyteDB Docs');
    
    INSERT INTO links (url, name)
    VALUES('https://blog.yugabyte.com','YugabyteDB Blog') 
    RETURNING id;
    
    我々は、現在Aを走らせることができますSELECT ステートメントを挿入したすべての行を取得します.
    SELECT * FROM links;
    
    我々はまた、実行することができますSELECT ステートメントを挿入する行の数を取得します.
    SELECT count(*) FROM links;
    

    使節フィルタによって収集されたysql統計のレビュー
    構成された2つのフィルタのそれぞれは、彼らが観察するデータに関連する統計を提供します.すべてのこれらの統計は、使節統計ページで利用できますhttp://localhost:8001/stats.
    PostgreSQLフィルタの使用
    統計情報をYSSQLとして与えたので、全体の接頭辞をPostgresとしてすべての統計情報を参照します.yqlで実行した問い合わせに基づいて簡単に検証できるものysqlsh 我々が作成したセッションは“**”で強調表示されます.
    postgres.ysql.errors: 0
    postgres.ysql.errors_error: 0
    postgres.ysql.errors_fatal: 0
    postgres.ysql.errors_panic: 0
    postgres.ysql.errors_unknown: 0
    postgres.ysql.messages: 45
    postgres.ysql.messages_backend: 37
    postgres.ysql.messages_frontend: 8
    postgres.ysql.messages_unknown: 0
    postgres.ysql.notices: 0
    postgres.ysql.notices_debug: 0
    postgres.ysql.notices_info: 0
    postgres.ysql.notices_log: 0
    postgres.ysql.notices_notice: 0
    postgres.ysql.notices_unknown: 0
    postgres.ysql.notices_warning: 0
    **postgres.ysql.sessions: 1**
    postgres.ysql.sessions_encrypted: 0
    **postgres.ysql.sessions_unencrypted: 1**
    **postgres.ysql.statements: 7**
    postgres.ysql.statements_delete: 0
    **postgres.ysql.statements_insert: 4**
    **postgres.ysql.statements_other: 1**
    postgres.ysql.statements_parse_error: 2
    postgres.ysql.statements_parsed: 5
    **postgres.ysql.statements_select: 2**
    postgres.ysql.statements_update: 0
    **postgres.ysql.transactions: 7**
    **postgres.ysql.transactions_commit: 7**
    postgres.ysql.transactions_rollback: 0
    

    TCPフィルタの使用
    YSQLに関連するTCP統計はTCPで利用可能です.tcphash ysqlプリフィックス.私たちが見ることができるように、統計は、送信されたバイトと受信されたバイトを含むネットワークレベルにあります.
    tcp.tcp_ysql.downstream_cx_no_route: 0
    tcp.tcp_ysql.downstream_cx_rx_bytes_buffered: 33
    tcp.tcp_ysql.downstream_cx_rx_bytes_total: 693
    tcp.tcp_ysql.downstream_cx_total: 1
    tcp.tcp_ysql.downstream_cx_tx_bytes_buffered: 0
    tcp.tcp_ysql.downstream_cx_tx_bytes_total: 991
    tcp.tcp_ysql.downstream_flow_control_paused_reading_total: 0
    tcp.tcp_ysql.downstream_flow_control_resumed_reading_total: 0
    tcp.tcp_ysql.idle_timeout: 0
    tcp.tcp_ysql.upstream_flush_active: 0
    tcp.tcp_ysql.upstream_flush_total: 0
    

    スタック内のすべてのコンテナを削除する
    以下のコマンドを使用して以前に展開したコンテナを削除できます.
    docker rm -f $(docker ps -aq)
    

    概要
    最近発表された使節プロキシからのPostgreSQLフィルタは、開発者やオペレーションエンジニアにとって非常に簡単なので、YSSQL、YugabyteDBのPostgreSQL互換の完全リレーショナル分散SQL APIからSQL統計を収集することができます.フィルタは、使節プロキシサイドカーコンテナ内で実行し、単にデータベースサーバーに完全に透明な方法でネットワークトラフィックをsnniffingで動作します.その結果、開発者と操作エンジニアは、どんな追加のソフトウェアも配備して、管理することなく統合を活用することができます.
    我々は、今日試してみて、私たちにフィードバックを提供する統合を与えるためにすべてのユーザーを歓迎しますGitHub and Slack .