K2HFTFUSEは、確実で高速なファイル/メッセージ転送を低コストで実現するために開発されたシステムです。Userspace)によるユーザースペースでのマウント機能を利用したファイル/メッセージ転送システムです。K2HFTFUSEは、仮想ファイルシステムを提供し、マウントしたディレクトリにファイルを書き込むだけで利用できます。既存プログラムの出力ファイルのディレクトリをK2HFTFUSEでマウントするだけで、既存プログラムの変更なしにファイル/メッセージ転送ができます。ファイル転送の一例として、ログファイルを転送する場合、既存のプログラムを変更することなく、ログを高速かつ確実に集約できます。類似したシステム(プログラム)では、fluentdがあります。fluentdと比較しても、高速であり、確実に転送を行うことができるシステムです。K2HFTFUSEは、テキストファイルへ1行分のデータを書き込んだタイミングで、そのデータを転送します。この他、転送する内容は、テキストだけではなく、バイナリデータ、メッセージ(1データを1メッセージとする)の転送ができます。転送するデータに対して、任意のフィルタリング、任意の処理を行うこともできます。背景ウェブサービスに限らず、ログファイルやデータなどを集約することは昨今当たり前のように必要となっています。大規模なログなどの集約を行うケースなどでは、Kafka(+Storm)で構築されたシステムが用いられていることと思われますが、小規模であれば簡単にfluentdで構築されたシステムもあるかと思います。Stormのように高速で確実な転送ができないかという試みで開発されました。libfuse(FUSE)をベースに基礎ライブラリ/システムを使った結果、期待以上の高パフォーマンスで可用性、スケーラビリティのあるシステムとなっています。K2HFTFUSEの構成まず、以下にK2HFTFUSEを利用したデータ(ファイル/メッセージ)転送の概要図を示します。上記に示すように、K2HFTFUSEシステムは、libfuse(FUSE)を利用したFUSE派生プログラムになっています。K2HFTFUSEプログラムが転送したデータ(ファイル/メッセージ)は、K2HFTFUSESVRプログラムで受信することができ、転送先で集約できます。転送するデータがテキストを対象とする(ログファイルなど)場合、テキストファイルであれば、1行単位で転送が行われます。FUSEを利用することにより、転送側のプログラムの変更は必要なく、出力ファイル(ログファイル)などのディレクトリをFUSEによりマウントするだけで、転送ができるようになっています。これにより、既存システムへの導入に対しての障壁はなく、fluentdと同様に簡単に導入できます。K2HFTFUSEでは、複数の転送元と複数の転送先を任意に構成できます。複数の転送元からのデータ(ファイル/メッセージ)を1つの転送元ホストに集約できます。複数の転送先ホストを準備して、分散転送させることも、同報転送もできます。この通信制御は、今回同時公開されたシステム(CHMPX)により実現される機能となっています。K2HFTFUSEの名前に含まれている”K2H”はK2HASHを意味しています。K2HASHは独自のKVS(NoSQL)ライブラリであり、このK2HASHを利用したシステムでもあります。このK2HASHライブラリを利用することで、転送するデータ(ファイル/メッセージ)のキューイングを実現しています。これにより、通信断、転送先ホストの高負荷などによる転送遅延が発生したとしても、転送データそのものはキューイングされ、ロストする確立を低下してくれています。転送元と転送先の構成は、上述したとおりCHMPXというプログラムに任せています。簡単な説明として、このCHMPXはSocketによるホスト間の常時接続を提供し、ホスト上のプログラム同士の透過的なコミュニケーションを提供する通信ミドルウエアです。K2HFTFUSEは、このCHMPXを利用することにより、転送元、転送先のホスト接続構成を構築しています。K2HFTFUSEでは、以下のような接続を提供します。転送先ホストを複数とした場合には、転送するデータを、1台のみに、または同報転送として全台に転送することが可能です(この機能はCHMPXの提供する機能です)。1台のみに転送する場合であっても、転送先ホストと通信できない(障害などで)ケースでは、自動的に補助ホストに転送もできます。これにより即時性を失わず、転送を継続することができ、障害耐性にも強い構成を作ることができます。多段転送K2HFTFUSEは、上記のように1段の転送のみではなく、多段の転送もできます。多段に組むことにより、各コロ(データセンターなど)で集約したデータをさらに集約するような用途にも利用できます。データの保全テータの転送を行うときに、利用者が気になるデータの保全について説明します。K2HFTFUSEでは、転送元でデータを書き込んだときに(FUSEでマウントしたディレクトリ以下のファイルへの書き込み)、いったんローカルシステム上のK2HASHにデータがキューイングされます。キューイングされたデータは、通信状況が正常であれば、CHMPXにより転送先に送り出されます。この処理におけるタイムラグはほとんどなく通信状況が正常であれば瞬時に行われます。障害などで通信できない状況の場合には、キューイングされ、通信状況が回復した時点で転送が再開されます。K2HFTFUSEのマウントが外れた場合には、あらかじめマウント時にマウントポイント以下にディレクトリを準備しておくなどすることでローカルファイルとしてK2HFTFUSE導入前と同じようにローカルファイルに出力されます。K2HFTFUSEを再マウントする前にこのファイルを転送することで再開も可能です(この場合オペレーションは必要です)。独自処理の組み込みK2HFTFUSEを利用する上で、提供されているプログラムで基本的なファイル/メッセージの転送ができます。用途によっては独自の処理を加えたい場合、ひとつの転送元から多種のデータを転送したい場合など、カスタマイズを加えたいケースがあります。ローカルファイルへの出力を行ったり、外部のプラグインプログラムに処理をさせることができます。これらは、K2HFTFUSEおよびK2HFTFUSESVRの設定ファイルで詳細に指定できます。外部のプログラムをプラグインとして起動し、受け取ったデータを引き渡すことができ、これにより独自の処理を行うことができます。外部のプログラムとK2HFTFUSEおよびK2HFTFUSESVRは、標準入出力をPIPEで接続しているため、パフォーマンスに不安のある場合には、K2HFTFUSESVR自体を自作できます。ソースコードk2hftfusesvr.ccを参考にして作成できます。こちらについては、次回以降でサンプルプログラムなど説明できればと思います。データのフィルターと加工についてデータを転送する場合、特定の文字列にマッチングした場合のみ転送したい、特定のデータだけを転送したくないなどのケースが存在します。これらは、転送元のK2HFTFUSEの設定にて指定することができ、データのフィルタリングを提供しています。複数の転送元からデータの集約を行う場合、どのホストから、何時作成されたデータなのか必要となる場合があります。K2HFTFUSEでは、デフォルトで、転送元ホスト、データを書き込んだプロセスID、データの書き込まれた時刻等々のデータに付随する情報も一緒に転送されています。転送先でデータを受信後に、どの付属情報を利用するか、どのように加工するかなどの設定もできます。スペックでK2HFTFUSEシステムを構築した場合を測定しました。RAID-1転送元が任意のプログラムで特定ファイル(K2HFTFUSEのマウントポイント以下にあるファイル)へ書き込みを行い、転送先は受信したデータを全てローカルファイル(ext4)に出力します。転送するデータは、テキストファイルであり、1行あたり4KBから10byteまでのデータです。475638テストの結果、4KB/行のテキストファイル転送において、20,000行/secの転送速度を記録しました。byte/sec)となっており、利用した試験環境のネットワーク上限となっていました。後日、報告の機会があれば、より詳細な計測結果を公開していきたいと思います。実際に、ログファイルを例にしてファイル内容を転送してみます。以下の例では、K2HFTFUSEでApacheのログファイルを転送するサンプルを以下に示します。いう10台のホスト上で、Apacheを使用してウェブサービスを実行します。Apacheはログファイルとして各ホストの/home/apache/logsディレクトリにaccess.logとerror.logを出力します。(access.logとerror.log以外のファイルは/home/apache/logsディレクトリに出力されないものとします。)設定ファイルApacheの動作しているホストで利用する設定ファイルとして、slave.yaml(YAML形式)ファイルを準備します。}次にログを集約するホストで利用する設定ファイルとして、server.yaml(YAML形式)ファイルを準備します。}起動まず、ログを集約するホストの準備をします。通信ミドルウエアCHMPXを起動します。MQ関連)のエラーがでる場合には、ホストで利用できるMQ数を大きくします。(下記で指定しているMQ数は余裕を持った数字です。特権ユーザーにて設定してください。/proc/sys/fs/mqueue/msg_maxK2HFTFUSESVRプログラムを起動します。server.yaml次は、Apacheの動作しているホストでプログラムを起動します。通信ミドルウエアCHMPXを起動します。slave.yamlK2HFTFUSEプログラムを起動し、マウントします。-fマウントできているか確認します。dfコマンドで確認します。/home/apache/logsApacheを起動して、ログを出力させ、集約するホスト上でファイル内容が転送されているか確認してみてください。tailコマンドで確認します。STRING”が上記のファイルに転送されていることを確認できます。Apacheを使わないで確認します。/home/apache/logs/logs/access.logテストを終えて以上のようにして、ファイル内容が転送できていることが確認できます。K2HFTFUSEの優れている点は、転送元(プログラム)の変更をする必要がなく、設定により集約ホスト、経路を決定でき、確実で高速なファイル/メッセージの転送ができる点です。転送先のホストで任意のプログラムを起動しておき、独自の処理(フィルタリングなど)も簡単にできます。Repeater)を利用しています。これらは、公開されたK2HFTFUSEリポジトリにsubmoduleとして登録されています。以下に、各プロダクトの簡単な説明をします。FULLOCK高速で安全な低レベルロックライブラリです。プロセス間共有ロックオブジェクトをマルチプロセス/マルチスレッドから簡単に、かつ安全な利用がでます。K2HFTFUSEを含む他のプロダクトから利用されています。Store)ライブラリです。高速、大容量でマルチプロセス/マルチスレッドからの安全な利用ができます。独自のトランザクション処理、キューイングなどもできるライブラリです。CHMPX、K2HFTFUSE、K2HTPDTORなどのプロダクトから利用される基礎ライブラリを提供します。CHMPX高速、大容量対応の通信ミドルウエアです。Hasingをベースにサーバーノードを構築できる高速なネットワーク越しのプロセス間を提供します。RPCの機能を提供します。K2HTPDTORK2HASHライブラリのためのK2HASHトランザクションプラグインプログラム(シェアードライブラリ)です。Userspace)によるユーザースペースでのマウント機能を利用し、これを基本構成としていますが、主要機能は上述の各プロダクトにより実現できてます。最後に今後もK2HFTFUSEの改良などを継続していく予定です。fluentdよりも重厚で、かつKafkaよりも簡単にデータ集約ができるシステムです。K2HFTFUSEをお試しください。今後もK2HFTFUSEについての技術情報、関連プロダクトについての技術情報も公開していきたいと思います。JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。JAPANのサービス開発を支える技術やデザイン、文化を発信しています。Reserved.このページの先頭へ。