NginxとTarantoolに基づく構築サービス

このアーキテクチャを知っていますか? Webサーバー、キャッシュ、ストレージ間で踊る悪魔のラウンドダンス。



このようなアーキテクチャの欠点は何ですか? このようなアーキテクチャのフレームワーク内の問題を解決するために、多くの質問に直面しています:どの言語(および?)を取るか、どのI / Oフレームワークを選択するか、キャッシュとストレージを同期する方法は? インフラストラクチャの問題の束。 問題を解決する必要があるのに、なぜインフラストラクチャの問題を解決するのですか? もちろん、特定のテクノロジーXとYが好きで、これらの欠点をイデオロギーに変換すると言うことができます。 ただし、データがコードから一定の距離にあるという事実(上の写真)を否定することはできません。これはレイテンシを追加し、RPSを削減する可能性があります。

この記事の目的は、Webサーバー、バランサーとしてのNginxと、アプリケーションサーバー、キャッシュ、ストレージとしてのTarantoolに基づいて構築された代替案について話すことです。

キャッシュとストレージの改善




Tarantoolにはいくつかの興味深い特性があります。 Tarantoolは効果的なメモリ内DBであるだけでなく、本格的なアプリケーションサーバーでもあり、アプリケーションはLua(luajit)、C、C ++、つまり 任意の複雑さのロジックを作成できますが、1つの制限があります:ファンタジー。 使用可能なメモリよりも多くのデータがある場合、一部のデータはSophiaエンジンを使用してディスクに保存できます。 Sophiaが適合しない場合は、何か他のものを取り込んで「冷たい」データをドロップすることができます。 タランツールから別のストレージに現在必要のないデータ、および「ホット」部分はタランツールに保存されます。 メモリ内。 これにはどのような利点がありますか?



Webサーバーの改善




データのエンドユーザーはユーザーです。 通常、ユーザーはNginxを介してバランサー/プロキシとしてApplication Serverからデータを受け取ります。 TarantoolとHTTPの両方と通信できるデーモンを作成するオプションは適切ではありません。最初の描画につながり、再び開始点に戻るからです。 したがって、私たちは反対側から状況を見て、別の質問をします:「データとユーザーの間の仲介者を取り除く方法?」 この質問に対する答えは、Tarantool Nginx Upstream Moduleの実装でした。

Nginxアップストリーム


Nginx Upstreamは、パイプ/ソケットを介したバックエンドへの永続的な(アップストリームキープアライブを参照)接続です。以降、これを「プロキシ」と呼びます。 Nginxは、アップストリームルールを記述するための多くの多様な機能を提供します。TarantoolでHTTPをプロキシするには、次の機能が特に重要です。

  1. Nginxが負荷を分散する複数のバックエンドを指定する機能。
  2. バックアップを指定する機能、つまり アップストリームが機能しない場合の行き先を示します。

これらの機能により、次のことが可能になります。

  1. たとえば、シャーディングと組み合わせて、N Tarantoolに負荷を分散すると、ノード全体で均一な負荷を持つクラスターを構築できます。
  2. レプリケーションを使用してフォールトトレラントシステムを作成できます。
  3. アイテムa)とアイテムb)を使用して、フェールオーバークラスターを取得します。

オプションを部分的に示すNginxの設定例:

#    Tarantool upstream tnt { server 127.0.0.1:10001; #     localhost server node.com:10001; #  -  server unix:/tmp/tnt; #   unix socket server node.backup.com backup; #   backup } # HTTP- server { listen 8081 default; location = /tnt/pass { #  Nginx    Tarantool Upstream Module #    Upstream tnt_pass tnt; } } 

Nginx Upstreamの設定の詳細については、 http//nginx.org/en/docs/http/ngx_http_upstream_module.html#upstreamをご覧ください。

Nginx Tarantoolアップストリームモジュール(v0.1.4安定)




主な機能:


入力データ


 [ { "method": STR, "params":[arg0 ... argN], "id": UINT }, ...N ] 

「方法」
ストアドプロシージャの名前。 名前は、Tarantoolのプロシージャの名前と一致する必要があります。 たとえば、lua関数do_something(a, b)を呼び出すには、 “method”: “do_something”が必要です。

「パラム」
ストアドプロシージャの引数。 たとえば、引数をlua関数do_something(a, b)に渡すには、 “params”: [ “1”, 2 ]が必要です。

Id
クライアントによって設定された数値識別子。

インプリント


 [ { "result": JSON_RESULT_OBJECT, "id":UINT, "error": { "message": STR, "code": INT } }, ...N ] 


「結果」
ストアドプロシージャによって返されるデータ。 たとえば、lua関数do_something(a, b)return {1, 2}返しreturn {1, 2}次に“result”: [[1, 2]]返します“result”: [[1, 2]]

Id
クライアントによって設定された数値識別子。

「エラー」
エラーが発生した場合、このフィールドには理由に関するデータが含まれます。

プロトコルの詳細はこちら: https : //github.com/tarantool/nginx_upstream_module/blob/master/README.md

ハローワールド


Nginxを起動します


ソースからnginxを収集します:

 $ git clone https://github.com/tarantool/nginx_upstream_module.git $ cd nginx_upstream_module $ git submodule update --init --recursive $ git clone https://github.com/nginx/nginx.git $ cd nginx && git checkout release-1.9.7 && cd - $ make build-all-debug 

build-all-debugの目標はデバッグバージョンです。 Nginxの構成が少なくなるようにします。 すべてをゼロから設定したい人には、 build-allbuild-all目標があります。

ファイルtest-root/conf/nginx.conf

 http { #   Tarantool  backend upstream echo { server 127.0.0.1:10001; } server { listen 8081 default; # Nginx   *:8081 server_name tnt_test; location = /echo #  *:8081/echo  'echo' Tarantool Upstream { tnt_pass echo; } } } 


 $ ./nginx/obj/nginx #  nginx 

タランツールを起動する


Tarantoolは、パッケージから配送するか、組み立てることができます。

hello-world.lua

 --      ,       Tarantool  DB. --     -     1- . function echo(a) return {{a}} end box.cfg { listen = 10001; --    Tarantool } 

パッケージからTarantoolをインストールした場合、次のように起動できます。

 $ tarantool hello-world.lua #     lua-. 

ストアドプロシージャを呼び出します


任意のHTTPコネクタでechoストアドプロシージャを呼び出すことができます。必要なのは、127.0.0.1 / echoでHTTP POSTを実行し、本文に次のJSONを渡すことです(入力データを参照)。

 { "method":"echo", //  ,       Tarantool "params":[ {"Hello world": "!"} // 1-  -  ], "id":1 // ID  } 

このプロシージャをwgetと呼びます

 $ wget 127.0.0.1:8081/echo --post-data '{"method":"echo","params":[{"Hello world": "!"}],"id":1}' $ cat echo {"id":1,"result":[[{"hello world":"!"}]]} 


さらにいくつかの例:
https://github.com/tarantool/nginx_upstream_module/blob/master/examples/echo.html
https://github.com/tarantool/nginx_upstream_module/blob/master/test/client.py

まとめると


Nginx Tarantoolアップストリームモジュールを使用する長所:


短所:


計画:



ベンチマーク結果は非常に興味深いものであり、別の記事に掲載されます。 Tarantoolは、アップストリームモジュールのように、すべてを試してみたい、使用したい、または新しいアイデアを表現したい場合は、常に新しいユーザー向けに開いています。github、googleグループに連絡してください。

参照資料


Tarantool Webサイト-http : //tarantool.org
Git Tarantool- https://github.com/tarantool/tarantool
Git Tarantool Nginxアップストリームモジュール-github.com/tarantool/nginx_upstream_module
Googleグループ-https://groups.google.com/forum/#!forum/tarantool

PS次の記事では、Tarantoolを使用して解決できるタスクを示します。

Source: https://habr.com/ru/post/J272141/


All Articles