Castoro / RubyKaigi2010

2,561 views

Published on

Castoro - Distributed storage grid with Ruby.
Lang: Japanese only

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,561
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
26
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • かすろと 分散ストレージグリッド with Ruby と題しまして、発表させていただいます。
    私、てらした と申します。
  • 最初に簡単に自己紹介を。
    これまではOSのないプリンタファームウエアから
    データセンター内で動作させるミドルウエアまでを携わってきました。

    Ruby自体は2008年春頃からさわり始めたのですがRubyKaigi 2008で毒されまして、
    とうとう、今年の春に「鳥取Ruby会」とっとるびー を主催するに至りました。

    仕事としてはRICOHがサービスしているストレージサービス「quanp」の
    画像処理関連・ミドルウエアの設計をしつつ、
    CRuby拡張ライブラリやApacheモジュールを書いたりしています。


  • ここで少し、β時代を含めて、過去にどのようなストレージを
    バックエンドで利用してきたかをふりかえってみます。
    ここで出た課題がそのまま、Castoroでクリアしたい課題になります。

    まず、極初期のストレージです。
    いわゆるNAS箱をNFSマウントして使っていました。
    容量が足りなくなるとNAS箱を増やしてNFSマウントします。
    何処のNAS箱に余裕があるのかはゆるやかに変化しますので、
    欲しいファイルが何処にあるのか・何処に書くべきかをRailsアプリケーション
    が独自に探索していました。

    もちろん、管理も設計も運用も、面倒です。
    UnionFSを使っていたら多少楽できたかもしれません。
  • 次に現在進行形で利用しているストレージです。
    某社の「お高いエンタープライズストレージ」を使用しています。
    性能は悪くは無いですが、
    単一ノードであるために、色々と性能限界と問題が顕在化しています。
    コスト的にスケールアウトは出来ませんし、
    スケールアップもファイバーチャネルを使うようにする程度しかできません。
    そもそも、quanpをサービスするには高すぎます。
  • 過去のことと現在のquanpのシステム設計のことから、
    これから使うストレージは、
    まず、HDDを実際に格納するノードのスケールアップは考えないことにします。
    単独では性能が足りないので、これを数でカバーします。スケールアウトが前提ですね。
    現時点で約30台、近未来では150台程度の構成に達する予定です。

    このスケールアウトをサポートするのが、Castoroです。

  • 分散ストレージは既に幾つかありますが、
    Castoroを考える前にそれらの導入は考えました。
    ここでは2つ紹介して、それでも独自開発に至った理由をお話したいと思います。

    1つ目はモガイルFSです。
    Perl, Perlbal, MySQLで実装され、HTTPリクエストによりファイルを配置・アクセスします。
    最大の特徴は数個のレプリケーションが完了した時点で「ファイルの格納完了」としている為に、RAID構成が不要である点です。
    非常に魅力的な機能なのですが、この「バラ撒き終わるまで完了しない」という点がquanpで扱うファイルサイズとマッチしません。数10〜数100KBでは問題は無さそうですが、ギガバイト単位のファイルを扱う前提となると話が違ってきます。

    また、画像処理系のコンポーネントはHTTPではファイルアクセスできないためNFS経由で参照できる必要があるのですが、現時点では未実装のようです。


  • 2つ目はクモFSです。
    折しも「Castoroを本格的に着手するべ!」とした時に発表されまして、出鼻を挫かれた感があったのは良い思い出です。
    もちろんこちらも調査させて頂きました。

    結論としては小さなファイルを保持させるには便利そうですが、メガ・ギガバイトサイズのファイルを配置するには不向きに感じました。
    また、NFSアクセスが不可能な点もquanpでは課題になってしまいます。
    しかし、NFSアクセスが不要なメタデータの格納に利用できるんじゃないかと考えています。

    モガイルFSもクモFSも、色々と参考にさせて頂きました。



  • モガイルFS・クモFSの紹介でも繰り返しましたが、quanpで利用するには
    2つの絶対条件があります。
    1つは、最大100GBの単一ファイルを扱えること。
    1つは、NFSアクセスができることです。
    しかしHTTPアクセスで済むならそのほうが良いので、結果としてはHTTPとNFSの2つのファイルアクセス手段を提供します。
  • これらを前提に、Castoroでは
    幾つかの ファイルシステムでは一般的なこと を捨てています。

    1つはデータに対する名前「キー」に、任意の文字列は許可しません。
    数値に限定します。

    次に、Castoro内でのキーのユニーク性の保証も、Castoroではしません。
    Castoroを利用するアプリケーション側でさせます。
    各ストレージサーバーに分散配置されたデータに対して情報をかき集めて
    管理することをしません。

    最後に データの上書き更新 を認めません。
    常に新しいキーで再生成します。
    これは主にレプリケーションのアルゴリズムを簡略化するための制限です。
  • - Basket
    - File I/O
    - Multicast
    - DelayedReplication
    Castoroでは1つのPeerに保存された時点で「データの保存完了」とみなし、
    他のPeerへのレプリケーションはあとから実行します。
    即時にレプリケーションをしないことでスループットを稼ぎますが、
    その代わりに最初に受けるPeerにはRAID保護が必要になります。

  • Castoroのコンポーネントです。
    Webアプリケーションからrequireされる Castoro::Client、
    ストレージサーバーとなるCastoro::Peer、
    PeerとClientを橋渡しするGateway、
    大きくはこの3つから構成されます。

  • GatewayはPeerとBasketの関係を把握しています。
    把握しようとはしますがあくまでキャッシュ扱いです。
    キャッシュにあればClientへレスポンスを返します。
    無ければPeerにマルチキャストして問い合わせます。

    GCとメモリの空間効率を考慮して
    キャッシュモジュールだけ、CRuby-Extensionとして実装しています。
    おおよそ、1〜2GiBのメモリを利用します。
  • Peerはファイルの実体を保持します。
    Gatewayからのマルチキャストリクエストに対して必要ならレスポンスを返します。
    PeerからBasketの作成やファイナライズ、削除のリクエストを受けます。
    なにか変化があった場合、それをGatewayへマルチキャストで通知します。
    そして、遅延レプリケーションを行います。








  • Castoro / RubyKaigi2010

    1. 1. CASTORO DISTRIBUTED STORAGE GRID WITH RUBY Toshiyuki Terashita RICOH IT SOLUTIONS CO.,LTD. @suzumura_ss http://github.com/ToshiyukiTerashita/ http://github.com/suzumura-ss/ RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010
    2. 2. OS RubyKaigi 2008 (` ω ´) Ruby tottoruby Ruby(!Rails) CRuby-Extension Apache module RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 2
    3. 3. (´ ω `) RICOH www.quanp.com GB RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 3
    4. 4. quanp RailsApplication NAS fuse-UnionFS RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 4
    5. 5. FiberChannel RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 5
    6. 6. (Peer) Castoro RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 6
    7. 7. Inspired by ... MogileFS kumofs RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 7
    8. 8. MogileFS (1) Perl Tracker /RAID Versions 2.1.7(2007-07-03), 2.3.7(2010-08-13) RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 8
    9. 9. MogileFS (2) HTTP I/O NFS I/O fuse wrapper RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 9
    10. 10. kumofs (1) TokyoCabinet KVS kumo-gateway kumo-server TokyoCabinet Versions 0.3.0(2010-01-18), 0.4.11(2010-07-28) RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 10
    11. 11. kumofs (2) TokyoCabinet memcached I/O NFS I/O fuse wrapper RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 11
    12. 12. NFS? HTTP : ImageMagick, ghostscript/Xpdf X-SENDFILE HTTP Perlbal X-REPROXY-URL Apache RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 12
    13. 13. Castoro 100KB 100GB HTTP NFS 400 1 RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 13
    14. 14. Castoro Application RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 14
    15. 15. Castoro (1) Peer RAID I/O NFS HTTP Basket(Directory) RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 15
    16. 16. Castoro (2) Multicast Peer Basket Basket RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 16
    17. 17. Castoro components WebApp WebApp WebApp Castoro:: Castoro:: Castoro:: Client Client Client Create basket, Find or select peer, File I/O Delete basket Find basket Castoro:: Castoro:: Gateway Gateway Replication Discovery peers, Learn baskets Castoro:: Castoro:: Castoro:: Castoro:: Castoro:: Peer Peer Peer Peer Peer RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 17
    18. 18. Castoro::Client Ruby1.8.6, 1.9.1 Application Castoro Gateway Peer I/O FileUtils Net::HTTP RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 18
    19. 19. Castoro::Gateway Ruby1.9.1 1.9.2 Peer Basket Client Peer Multicast CRuby-Extension GC / GiB RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 19
    20. 20. Castoro::Peer Ruby1.9.1 Basket(Directory) I/O Apache/NFS Client/Gateway Gateway Multicast RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 20
    21. 21. Sample - create require “castoro-client” config = { Gateway } client = Castoro::Client.new(config) client.open key = Castoro::BasketKey.new(543, 2, 1) client.create(key) do |host, path| `curl #{host}#{path}/filename -T source` end : RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 21
    22. 22. Sample - get : peers = client.get(key) # => {“peer1”=>”/path1/to/543.2.1”, # “peer2”=>”/path2/to/543.2.1”, # “peer3”=>”/path3/to/543.2.1”} peers.each do |host, path| `wget #{host}#{path}/filename` break if $?.exitstatus==0 end client.close RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 22
    23. 23. For quanp User files Bitmap files meta NAS KVS kumofs … Gateway: 4 servers CentOS / Cache 1.5GiB Peer: 30 servers OpenSolaris(ZFS), CentOS(ext4) 3 replications RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 23
    24. 24. Impressions of ‘with Ruby’ (1) Version 0.0.0 ( ) Client, Gateway, Peer Multicast RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 24
    25. 25. Impressions of ‘with Ruby’ (2) Extension Critical C/C++ GB GC RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 25
    26. 26. Impressions of ‘with Ruby’ (3) NoMethodError rescue => e Typo rescue rescue NameError; raise rescue => e RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 26
    27. 27. github Castoro core components GNU Lesser General Public License http://github.com/ToshiyukiTerashita/ castoro/ Apache module, etc. Apache License 2.0 http://github.com/suzumura-ss/* RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 27
    28. 28. www.quanp.com RICOH IT SOLUTIONS CO.,LTD. / RubyKaigi 2010 28

    ×