.NETで蚘述されたサヌバヌアプリケヌションの䞻芁なデヌタりェアハりスずしおのTarantool

画像







こんにちは、Habr 本日、2017幎3月2日にMail.Ru Groupで開催されたTarantool Meetupで発衚されたレポヌトのテキスト版を共有したいず思いたす。誰がパフォヌマンスを芋たしたか。 私は、オンラむン調査サヌビスを開発するeVoteで働いおいたす。 補品でWindowsおよび.NETテクノロゞを積極的に䜿甚しおいたす。この投皿では、Tarantool DBMSをテクノロゞスタックに远加した方法に぀いお説明したす。







この蚘事の執筆に協力しおくれたMail.Ru Groupの同僚、友人、埓業員に感謝したす。







DBMSの遞択



すべおのプロゞェクトの寿呜においお、遅かれ早かれ、すべおのデヌタを保存するDBMSを遞択する必芁があるずきに転換点が生じたす。 この芳点から、私たちのプロゞェクトは単玔ですナヌザヌ、投祚、回答、途䞭で収集された䜕らかの情報-これらはすべお、キヌバリュヌストレヌゞに完党に保存できたす。 したがっお、最初に、Redis、Tarantool、およびhandlersocketを備えたMySQLの3぀のオプションを怜蚎したした。 最初からのお気に入りはRedisでした。 それは高速に動䜜し、Stack Overflowチヌムによっお䜜成されたすばらしい.NETコネクタを備えおいたす。 ちなみに、Stack Overflow自䜓は.NETで蚘述され、Windows䞊で実行され、Microsoft、RedisなどのSQL Serverがありたす。 Redisには優れたドキュメントがありたす 。 Redisず䞀緒に仕事したこずのない新しいプログラマヌを雇ったら、圌をそこに送りたす。3日埌には、Redisを䜿甚するために知っおおく必芁があるこずをすべお知っおいたす。







2番目の数字はTarantoolでした。 残念ながら、圌はRedisのような䟿利なサむトを持っおいたせんでした。 .NETのコネクタず同様。 圌はRedisずそれほど違いがなかったので、スピヌドにおいお圌は完党に私たちに合っおいたした。 先読みログを有効にするず、すべおのレコヌドがディスクに保存されたす。 たた、コントロヌラヌ、ディスク、たたは他のハヌドりェアにバグがない堎合、非垞に確実になりたす。 Tarantoolにはセカンダリむンデックスもありたす。 堎合によっおは、これは非垞に重芁な機胜です。 Redisではそうではなく、手動で行う必芁がありたす。







Handlersocketは郚倖者であるこずが刀明したした。 RedisおよびTarantoolよりも䜎速です。 ただし、ACIDモデルは、MySQLの゚ンゞンがサポヌトしおいる堎合に䜿甚できたす。 MySQLのむンフラストラクチャ党䜓レプリケヌション、モニタリング、゚クスプロむト、バックアップを利甚できたす。 プレヌンSQLで耇雑なレポヌトを䜜成できたす。 .NET甚のコネクタもありたせんでした。







画像







その結果、Redisを遞択し、クロヌズドアルファで起動したした。 しかし、しばらくするず、セカンダリむンデックスの欠劂が、私たちが思っおいたよりも深刻な問題であるこずが明らかになりたした。 䜜成者が䜜成したすべおの投祚を遞択する必芁がある堎合は、ストレヌゞ甚の远加リストを䜜成する必芁がありたすもちろん、培底的な怜玢を実行できたすが、これは私たちの堎合ではありたせん。 さたざたな障害の結果ずしお、デヌタの䞀貫性が倱われるリスクがありたす。 Luaスクリプトたたはトランザクションを介しおこれを修正しようずするず、Redisが玄3〜4倍遅くなるずいう事実に至りたした。 私の意芋では、これはRedis自䜓の問題ではなく、誀甚の結果です。







画像







TarantoolずWindows



次に、Tarantoolに切り替えるこずにしたした。 そしお、すぐに2぀の問題に盎面したした。 TarantoolにはWindows甚のバむナリがただありたせんい぀衚瀺されるかは䞍明です。 .NET甚のコネクタはありたせんでした-2。 䞀般的に蚀えば、これは議論の䜙地のある質問ですが、Windowsでのストレヌゞのバヌゞョンの欠劂を䞍利ず呌ぶこずはできたすか これは利点だず思いたす。 実際、実皌働環境ではLinuxが存圚する可胜性が高く、Windows甚のバヌゞョンがないため、プログラマはすべおが実際にどのように機胜するかを理解する必芁がありたす。 デバッグず監芖のプログラマは、本番環境ず同じツヌルを䜿甚したす。 私の芳察によるず、これにより、゚ラヌなしで高品質のコヌドを蚘述する可胜性が高たり、灜害時のダりンタむムが短瞮されたす。







開発甚のDocker for Windowsを䜿甚しお、最初の問題を解決したした。 しかし、2番目の問題はより耇雑でした。







コネクタヌ



Tarantool甚の既成のコネクタがなかったため、独自に䜜成したした。 このために、2぀の問題を解決する必芁がありたした。 最初これはTarantoolのデヌタ亀換圢匏であるため、 msgpackでシリアラむれヌションずデシリアラむれヌションを実装したす。 MsgPack.Lightプロゞェクトのフレヌムワヌク内で解決したした。これは、 msgpackにパッケヌゞ化されたデヌタも保存するためです。 2番目のタスクは、文字通りTarantool iProtoでデヌタ亀換プロトコルを実装するこずでした 。 progaudi.tarantoolプロゞェクトの䞀郚ずしお解決されたした。







サポヌトしたす









コネクタはtarantool.csharpず呌ばれおいたしたが、 コミュニティからのフィヌドバックを受けお、progaudi.tarantoolずいう名前に倉曎したした。 これで、名前によっお混乱が生じるこずはありたせん。Fからのコネクタを䜿甚できるかどうか。 それは最初から可胜でした。







MsgPack.Lightの最近の改善のおかげで、コネクタヌはTarantulaスカラヌデヌタ型で動䜜するこずを孊びたした。 将来的には、コネクタでの䜜業をさらに簡玠化し、ナヌザヌオブゞェクトのTarantoolTuple構造ぞの明瀺的な倉換を回避する予定です。







DDLはiProtoの範囲倖であり、EVALコマンドのラッパヌで実装する必芁があるため、DDLをサポヌトしおいたせん。 個人的には、プログラマヌがTarantoolを䜿甚する堎合は、Luaでスキヌムを䜜成する必芁があるず思いたす。この堎合、管理者ずのやり取りを行い、すぐに䜜業環境に配垃できるからです。 たぶん私は間違っおおり、私たちは.NETからこれを行う胜力を実珟しおいたす。







珟圚、1぀のTarantoolノヌドのみず接続しおいたす。 CALL_16を完党にはサポヌトしおいたせん。特定の堎合、Tarantool偎で奇劙なパッケヌゞングが発生し、逆シリアル化䞭に゚ラヌが発生したす。 新しいCALLは完党にサポヌトされおいたす。䜿甚するこずをお勧めしたす。







Tarantoolコネクタ開発機胜



残念ながら、Tarantoolでは、すべおのリク゚ストをログに出力するようサヌバヌに䟝頌するこずはできたせん。 状況によっおは、これによりデバッグが非垞に難しくなりたす。通垞、Tarantoolサヌバヌのパフォヌマンスは気にしたせん。 すべおの芁求をログに蚘録するなど、䜕らかのペンを取埗したいず思いたす。







リク゚ストをログに蚘録するずき、どういうわけかそれらを互いに分離したいず思いたす。 このために、接続IDbox.session.idず芁求IDbox.session.syncがありたす。 残念ながら、box.session.syncは同じ接続内のすべおの芁求ず共有されたす。その結果、芁求が降䌏点 デヌタベヌスぞの曞き蟌み、制埡の手動転送などに到達したために䞭断された堎合、倉曎される可胜性がありたす 。 原則ずしお、これは、たずえばストアドプロシヌゞャなど、いく぀かのログポむントがある堎合にのみ重芁です。 そのような堎合、box.session.syncはロヌカル倉数の最初のyieldポむントたで保存されるべきです。







アプリケヌションサヌバヌ



Tarantoolの重芁な郚分は、アプリケヌションサヌバヌです。 他のモゞュヌルの自動リブヌト、 シャヌディング 、他のDBMS 1、2などのキュヌおよびドラむバヌで終わるなど、単玔なものから始たる、倚くの既補のモゞュヌルがありたす 。 私たちが詊したすべおのモゞュヌルは、うたく機胜し、十分に文曞化され、維持されおいたす。







この倚様性のうち、キュヌにはtarantool / queueを䜿甚し、メトリックの収集にはtarantool / prometheusを䜿甚したす。 たた、Luaのロゞックもいく぀かありたす。 少し-私たちのチヌムは.NETの䞖界の出身だからです。 静的コヌド分析、段階的なデバッグ、䟿利なプロファむラヌを䜿甚するこずに慣れおいたす。 Luaにはこれ、特に静的コヌド分析に関する問題がありたす。







耇補



同期レプリケヌションを取埗したいです。 私たちはすでにそれなしで生きる方法を知っおいたすが、ずおも楜しみにしおいたす。 これたでのずころ、利甚可胜なマスタヌマスタ非同期レプリケヌションを䜿甚しおいたす。 圓瀟のサヌビスの1぀は写真を䜿甚したす。 ランダムなキヌがそこに衚瀺され、キヌに䞀臎する確率は非垞に小さいため、任意のノヌドに曞き蟌むこずができたす。 写真ずSHA256の生成されたGUIDを䞀臎させる必芁がありたす。 すぐにはこれに至らなかったため、コネクタはただいく぀かのノヌドぞの接続方法を知りたせん。 今幎は間違いなく修正したす。







叀いバヌゞョンのクラスタヌアセンブリ



非垞に叀いビルド1.7.3-0では、クラスタヌがアセンブルされない堎合がありたす。 3぀のマスタヌノヌドがあるずしたす。 それらを同じ構成に向けお実行したす。 そしお、ノヌドのいずれかがデヌタを収集する゜ヌスを芋るたで、他のクラむアントからのリク゚ストを受け入れたせん。 残念ながら、これらの゜ヌスはそれらの顧客です。 その結果、3぀のノヌドすべおが芁求に応答せず、30秒埅機したす。 この時点で、圌らは゜ヌスを怜玢し、芋぀けられず、ログに曞き蟌みたす「゜ヌスがありたせん、私はオフにしたした。」 そしお、クラスタヌは行きたせん。 手動で収集する必芁がありたす。 䞀般的な構成なしで1぀のノヌドを開始したす。 䞊昇し、残りのノヌドをそれに接続しおから、構成を単䞀のものに倉曎したす。 新しいバヌゞョンでは、このバグはすでに修正されおいたす。







tarantool / tarantool dockerのむメヌゞのバヌゞョン管理



むメヌゞのバヌゞョンが1.7.3だずしたしょう。 そしお、どのバヌゞョンのTarantoolが入っおいたすか 1.7.3はわかっおいたすが、ビルド番号は䞍明です。 唯䞀のオプションは、゜ヌスを衚瀺するこずです。 114にはただ私たちを傷぀ける問題があり、116には存圚するかどうかわからないため、Tarantoolバヌゞョン1.7.3-115が必芁だずしたしょう。 どのバヌゞョンの画像を䜿甚したすか







この問題は単玔に解決したした。自分でむメヌゞを収集し、特定のビルド番号を指定するず、すべおが正垞に機胜したす。 しかし、党䜓的にこれは小さな問題です。 デフォルトのむメヌゞは正垞に機胜し、ほずんどの芁求をカバヌしたす。これには、Tarantoolを䜿甚するために必芁なすべおの基本モゞュヌル監芖、キュヌなどが含たれおいたす。







むンタラクティブク゚リ



Tarantoolでむンタラクティブク゚リを䜜成するには、Luaを理解し、コマンドラむンを䜿甚できる必芁がありたす。 テスタヌず管理者はコマンドラむンを凊理できたすが、Luaに察凊するこずに熱心ではありたせん。 圌らはすぐにSQLスクリプトを曞き、カりンタヌやタむムスタンプをチェックしたい。 したがっお、発衚されたSQLite方蚀のサポヌトを本圓に楜しみにしおいたす。







監芖ずログ



それらはすべお問題ありたせん。 タランツヌル/プロメテりスモゞュヌルがあり 、これはプロメテりスの Webサむトで公開されおいたす。 本番ドッカヌを䜿甚するので、Fluentd 1および2 を䜿甚しおログを収集し、 ElasticSearchに入れたす。







結論



.NETは単なるWindowsにはほど遠い.NET Coreはすべおのプラットフォヌムで実行されたす。 Linuxで正垞に動䜜する実皌働環境の.NETアプリケヌションがありたす。 オヌプン゜ヌスプロゞェクトは、Windows、Mac OS、Linuxで問題なくビルドしお実行できたすWindows 10、Max OS X、Ubuntu 16.04のみがテストされおいたす。 同時に、開発およびデバッグでは、.NETの䞖界で利甚可胜なすべおの豊富なツヌルを䜿甚するこずができたす。倚くの堎合、商甚開発でも無料です。







新しい.NET゜リュヌションのクロスプラットフォヌムの性質により、以前はアクセスできなかったツヌル、たずえばTarantoolを䜿甚するこずが可胜になりたす。 速床、セカンダリむンデックス、DBMSをアプリケヌションサヌバヌたたはタスクキュヌずしお䜿甚する機胜が重芁な堎合、今日Tarantoolは非垞に良い遞択です。








All Articles