2013年11月11日月曜日

MySQL Pool Scanner(MPS) の仕組み

2013年の記事ですが・・・途中まで訳したので公開します。
Facebookでの、MySQL運用の話ですね。

https://www.facebook.com/notes/facebook-engineering/under-the-hood-mysql-pool-scanner-mps/10151750529723920


以下翻訳

Facebookは数多くのMysql database clustersを運用しているプロジェクトの一つだ。
このサーバ群は、2つの大陸にある様々なデータセンターの数千のサーバで構成されている。

小さなチームでこのサイズのclusterを運用することは、DBAがそうするようにclusterが自分自身で走るよう、ほぼすべてを自動化することによって達成される。
その自動化のための1つの仕組みに、私たちがMPS(MySQL Pool Scanner)と呼ぶものがある。

MPSは多くがPythonで書かれたstate machineだ。それはDBAのルーチンワークに変わる物で、人間の介入をなくしてくれる。

クラスターはシングルデータベースノードをみる
数千のサーバの一つ一つはいくつかのMysql Instanceを格納できる。
Instanceは分割されたProcesである。それぞれのデータセットをもち、別のポートで動く。シンプルにするために1つのサーバに2つインスタンスがあると仮定する。

データセットは数千のシャードに分割されている。それぞれのインスタンスはいくつかのシャードを保持している。
Facebookユーザのプロファイルは作成時にいずれかのシャードに割り当てられる。それぞれのシャードは数千のユーザのプロファイルを持つ。

簡単に図を用いて説明する。





すべてのインスタンスは、他のサーバ(通常の場合、他のデータセンター)で持っているデータのコピーをいくつか持っている。
これは2つの目標を達せうするために行われる。


  1. 高可用性 サーバがダウンした場合。我々はどこかに提供可能なデータを持っている。
  2. パフォーマンス 地理的に異なる読み込みが近くで行われるように、独自のレプリカを持っている。
これを実現させるための方法は、単純なMySQLのマスター/スレーブだ。すべてのインスタンスはレプリカセットの一部である。レプリカセットは1つのマスタと複数のスレーブを持つ。レプリカセットへのすべての書き込みは、マスターで発生している必要がある。

スレイブは、書き込みイベントがきてすぐにそれらを書き込みストリームに予約する。
マスターとスレーブはほぼ同じデータを持っているので、読み込みはレプリカセットのいずれかに行われる。

次の図は、それぞれが1つのインスタンスをホストし、他のインスタンスは空である。(我々はこれをスペアと呼ぶ。)


サーバーはインスタンスのコンテナであり、実際にはもっと複雑だ。
例えば、マスターインスタンスをホストしているサーバーは、他のマスターのスレイブインスタンスをホストしていることがあります。




2つの重要な「ビルドブロック」操作にMPSは依存している。


1. サーバ配置、コピー
1つ目の「ビルドブロック」操作は、他のホストにコピーを作成する。我々はもっともパフォーマンスよくコピーをするために、Xtrabackupの改良版を使用している。付け替えは、コピーが完了した後、削除を行うのと同じ作業である。

最初にシステムは、操作のために新しい予備のインスタンスを割り当てます。スレーブまたはマスターを一つ選択し、割り当てられた新しい予備のインスタンスに、データをコピーします。下の図は付け替え作業を示しています。コピーが完了したあと、インスタンスが削除されます。


2. マスターインスタンス昇格

2つ目のビルディングブロックは、レプリカセット内のインスタンスをマスターに昇格させるアクションである。
昇格の間、昇格させるターゲットをきめて、レプリカセットへの書き込みを止める。新しいマスターからレプリケーションするようにスレイブを変更する。そして書き込みを始める。下記の図では、プロモーション完了後、古いマスターが削除される操作をしめす。単純にするために、レプリカセットは3つのインスタンスのみを含む物とする。



これらの2つの操作は完全に自動化されている。人間の介入無しに、日に100回、1000回実行することができる。

ホストマネジメントと状態

基礎的なところを理解したところで、ビルディングブロックの抽象的概念をみてみよう。

現在の状態、メタデータ、現在過去のMPSコピー操作を保持しているリポジトリーとMPSは協力して動く。それらはデータベース自体で管理され、スケールする。そしてMPSは複雑なアプリケーションのインストールを必要としない。

事実、MPS自体はステートレスである。ホスト独自のプールで実行され、状態管理されているリポジトリーを使用して動く。状態は別々に、並列に処理される。

2013年11月3日日曜日

HipHop for PHP 調査

Facebook のエンジニアが開発したオープンソースソフトウェアである、「HipHop for PHP」について調査した。

情報源

Wikipedia
hhvm blog

Wikipediaの情報

  • PHPの実行エンジンで、速度を上げるために作られた。
  • サーバのリソース削減のために作られた。
  • Zend PHPとの高い互換性をめざしている。
  • HPHPcはPHPをC++に変換するコンパイラー
  • ピークではZend PHP x6のパフォーマンスがでた。
  • PHPでインタラクティブにデバッグできるHipHop debugerがある。
  • HPHPcは成功した、特にFacebookで。
  • しかし、Facebookは2013年に廃止予定だ。
  • 理由は、パフォーマンスの向上が頭打ちになったこと、完全な互換性がないことなど。
  • それらの問題を解決するために、PHP virtual machineの開発を決めた。HipHop Virtual Machine(HHVM)
  • PHPを高水準のバイトコードに変更する。
  • そのバイトコードは実行時にJITコンパイラーによって、x64機械語に翻訳される。
  • JavaのJVMみたいなもの。
  • ほとんどPHP5.4をサポートする。
  • パフォーマンスではHPHPcと同等の性能がでた。

hhvm blogの情報

  • 有名なDistoributionにはパッケージングされている
  • CakePHPのUnitテストは動かない。※Stringという名前のClassが許されない
  • CodeIgniterのテストは19%はfail
  • Drupalは2%fail, Facebook SDKは100%成功
  • どれが完全に動くかは明確
  • 6-12 monthの計画として、ドキュメントの充実、簡単なインストール等を目指している



2013年10月31日木曜日

Flashcache 調査

Facebookの作成したLinux cacheシステムであるFlashhcacheについて、調べているので調査結果を。

まずは英語で情報収集を行った。


  • 2010年に作成され、日々更新されている。
  • MySQLのカンファレンスで、DBサーバに対して使用していると発表。
  • 遅いメディアへの読み込み、書き込みをSSDなどの早いメディアにキャッシュするシステム。
  • MYSQLをスケールさせるために作った。
  • Linux Device Mapperを使っている。
  • NAND memory devicesにHDDの情報をキャッシュさせる。
  •  random IOのみをキャッシュさせ、sequential IOは無視する設定もできる。
  • version 3系では、パフォーマンスが上昇し、average hit rateが60%から80%、ディスクIOが半減した。



参考
Flashcache at Facebook: From 2010 to 2013 and beyond

2013年8月12日月曜日

MySQL vs Maria DB


MySQLと互換性を保ち、完全なオープンソースとして存在しており、これから主役になるといわれているMariaDBについての面白い記事。翻訳と感想を。訳せないところは英文のまま


MariaDBは有名なリレーショナルDBであるMySQLのフォークプロジェクトで、遅いながらも確実に、強いコミュニティを作りMySQLのユーザをとりこんでいる。その明確な証拠は、The Registerの本日のレポートから来ている。それはGoggleがMariaDB Fundationに常勤のエンジニアをアサインしたことだ。

オラクルは、それはMysqlの多様性を生み出す想定内の計画だと答えている。
Googleが開発者を一人送る。それ自体は大きなニュースに見えないかもしれません。しかし、それはMysqlとの戦いのトレンドを成長させていくことを指しています。

MySQLはOracleに買収されて以来、ますます孤立しているオープンソースプロジェクトとなっている。
『孤立している』このケースで言うと、オラクルが外部の寄与を受け付けていないという認識だ。

MysqlはGNU Public Licenceの元2つのデュアルライセンスで提供されている。
GPLが鍵だMysqlをフォークして作られたあらゆるプロジェクトは、ソースコードを公開することを要求される。おそらくそれがMysqlチームの利益になる。これはフリーソフトウエァの"copyleft(ソフトウェアの自由許諾権)"の本質だ。それは、改善が多数のプロジェクト間で共有されることを保証する。
しかし、MySQL、MariaDBのオリジナル製作者であるMonty Wideniusのような人は関係が続いている。オラクルは慎重にいくつかの変更を受け付けている。
GPLに親プロジェクトにコードの変更が受け付けられなければならないというルールはない。

そのような政策によって、MariaDBのようなMySQLから派生したDBが、MySQLと互換性を保つことを難しくしている。
While some forked projects in the open source world don't give a flying fig about compatibility  MariaDB most certainly does—otherwise, it would not be able to be a one-to-one replacement for existing MySQL databases.

WideniusとMariaDBチームはグーグルの参入によって、開発はギアアップされると思っている。彼らは多様性がMariaDBをよりよいプロジェクトにし、 そして商業的な1つにコントロールされなくなると信じている。
 確かにレジスターの記事はなぜグーグルが開発に開発に参入したか推測する。
グーグルのクラウドSQLプロダクトは、MySQLをベースにしている。そのためオラクルの気まぐれに運命を縛られるからである。

SkySQLのCEO Patrik SallnerはThe Regに「なぜGoogleが参加しているか?」かれの理論を述べている。彼らが、金銭面のスポンサーになっていないが、リソースを提供している会社はたくさんある。なぜならば彼らはコミュニティーの一員であることに価値を見るので。
That's another thing we learned from MySQL, to make sure there are enough contributors. At MySQL there were not that many externally,' he said.
'None, none,' Widenus [sic] chipped in during our conversation.
Did Oracle Pick Up The Clue Phone?
Widenius may have gotten ahead of himself with that statement to the Register, as Oracle may be wising up to the fact that if it wants to keep interest going in MySQL as an open source project, it has better start opening the shell a little.

MySQLのコミュニティーマネージャーである、Dave Stokes は外部のコントリビューターに呼びかけを行った。Stokesのリクエストは嘲笑と、苦情を受けた。それは、Oracle Contributors Agreementに同意を求めるものだ。そららは知的財産権の放棄などに関する物で、開発コミュニティーをイライラさせた。

以前のMySQL CommunityのマネージャGiuseppe Maxia は数日後に、オラクルの援護に現れた。

私はそれが好みではないが、私がオラクルを去ったときはそれはビジネスの一部でそれが残っていると思う。この機能はオープンソースを造るために、開発者を助けると思う。合理的なトレードオフだと思う。
それにMontyProgramも同じことを求めているし、ApacheもCanonicalも同じだとMaxiaは書いている。

Myxiaは彼の経験から、MySQLのコントリビューターになることは他のプロジェクトよりも難しいと挙げている。それはデータベースのソースコードの複雑さに起因することだ。


もしオラクルの取り組みがうまくいけば、プロジェクトの多様性を増加させる。
しかし、MariaDBのmore open than Mysqlからくる動きを止めることはできない。

もめてるようですねー。しかし長い目でみると、オラクルが面倒なことを続ける限りコントリビューターが減って、トーンダウンしそう。
ただ、世の中のMySQLがMariaDBに変わって行くかといわれると、なかなかその動きは見えないですね、少なくとも日本では。まあ、DBというシステムの根幹に関わるミドルウェアだと慎重になりますよね。
私的には引き続き、付かず離れずですね。

2013年6月25日火曜日

Memcache のSlab Reassign, Slab Automoveについて

Memcache1.4.5を使用しているのだが、アプリケーションにとって不都合な点がでている・・・
具体的に言うと、メモリは余裕があるのに、Evictionが発生してしまっているのだ。
検索したところ、ちょいと記事が古いがMemcachedのメモリ使用方法について詳しいものを見つけた。

これらを見ると一度確保されたチャンクのページは、他のチャンクに割り振られることがないので、最初に容量を確保されてしまったら、開放されることがない模様。

しかし、 version 1.4.11からは「Slab Reassign」、「Slab Automove」と言う、使っていないチャンクのページを、頻繁に使っているチャンクに割り振り直す機能があるようなので、公式ページを見てみた。

以下要約

Slab Reassign

 

 長い間稼働しているmemcahedインスタンスは、すべての利用可能なメモリが特定のスラブクラスに割り当てられている問題に直面するかもしれない。
100バイトのリクエストがたくさんあり、その後200バイトのリクエストが、異なるチャンクに保存された。その場合Memcachedは100バイトのチャンクを使うことができず、200バイトのデータは少ししか保持できない。

 1.4.11はスラブページを再割り当てする機能をもつ。 この機能、コマンドはベータです。近々のリリースで変わるかもしれません。覚えておいてください。コマンドが確定したとき、リリースノートにかかれるでしょう。

Slab Reassignを有効にするには、スタート時に以下オプションをつける必要がある。
$memcached -o slab_reassign
一度すべてのメモリが割り当てられてしまった場合は、以下コマンドでリアサインできる。

$ echo "slabs reassign 1 4" | nc localhost 11211
それは成功を表すエラーコードを返す、または後でリトライするひつようがある。
成功はスラブが移動したことを意味してはない。しかし、 バックグラウンドスレッドがメモリ移動を試みることを意味している。


Slab Automove

slab reassignは手動実行の機能である。Slab Automoveは自動できに実行されるアルゴリズムだ。
$ memcached -o slab_reassign, slab_automove
 上記はスタートアップ時に有効にする。slab_automoveは slab_reassignが最初に有効になっていなければならない。

automoveは起動中にも変更可能
$ echo "slabs automove 0" | nc localhost 11211
 このアルゴリズムは遅くて、古くさい。10秒のあいだに3回Evictionが発生すると、30秒の間Evictionが発生していないスラブクラスからページを移動させる。このアルゴリズムは十分出ないです。コミュニティを助けてください!改修したらパッチを送ってください!

Slab Reassign Implementation

スラブページのリアサインはトレードオフがある。
  • 500kより大きなすべてのアイテムが、1MBのスペースをとる。
  • メモリをリアサインしたとき、 1MBのページにいたすべてのアイテムは追い出される。
  • スラブリアサインが有効な時、追加のバックグラウンドスレッドが使われる。 
1つめのものは、のちのバージョンで改修される。そして、 -o slab_reassignオプションをつけなければ回避されます。


ふむふむ。あまり洗練された機能ではなさそうだな。
先のバージョンで改修があるかもしれないので、見てみよう。
1.4.14 で機能に改修があるのを見つけた。以下要約。

slabs reassign -1 15と与えると、どこかのスラブから、クラス15に対してページが移動される。

slabs automoveはアグレッシブなページリアサインアルゴリズムになった。
追い出し発生後とに、移動ができるか試みる。あなたが何が起こっているか本当に理解していないと、決して動かすべきでない。ほとんどの人は、ヒットレートがさがる。
緊急時には使える。

警告します。


結論

緊急時意外使わない方がいいのでは。

2013年6月11日火曜日

オープンソースの経験はあなたに仕事をみつけてくれる?

 『オープンソースに参加すると、キャリアにどのような影響を与えることができるか?』という興味深いテーマについて言及した記事を見つけたので要約する。

原文はこちら。

新卒にとっては就職状況が厳しくなっている。だが、オープンソースプロジェクトに参加していると、キャリアのスタートを加速することができる。

仕事を得るときに、実務の経験があなたのキャリアの武器になる。オープンソースプロジェクトに参加することは、あなたに実務の経験を与えてくれる。
オープンソースへの貢献は公的に見ることができる。事実採用の際に、レジュメの代わりにgithubのアカウントを尋ねる。

オープンソースに関わると、世界中の技術者と一緒に仕事ができる。

どこから始めていいかわからなければ、Openhatch.orgを見てスキル、興味から探してください。
おすすめは以下
  • Drupal
  • Python
  • LiberaOffice
 オープンソースに参加することの最良の事は、人々と出会えること、その人々と一緒に経験できること、そして世界中の人とプログラムを学べることだ。
オープンソースに参加する機会を得て、スキル向上と人的ネットワークの構築をしてください。
やはりオープンソースへの参加は得るものがおおそうですね。
私はまずLinux Mintのコミュニティでも覗いてみよう!

2013年5月28日火曜日

あなたが貢献を始める7つのオープンソースプロジェクト

オープンソースコミュニティに貢献することに興味があるので、検索していたら英語の面白い記事を見つけた。要約しそのコミュニティが日本でどうなのか調べてみる。

(原文) 7 open source projects to cut your teeth on (and the ones to avoid)

最初の貢献にフレンドリーな7つのプロジェクトはどこか?

 

Drupal

オープンソースのCMS。日本ではあまり使われていないが、世界的には有名らしい。コミュニティは初心者に寛容で、フレンドリー。PHPで書かれているようだ。Drupal Gardensでアカウントを作れば自前サーバがなくても、動作させることができる。
貢献者向けのドキュメントもある。Getting Involved Guide
日本のコミュニティもあるが、投稿日時をみるとそれほど活発でなさそう。日本だとwordpressのほうが活発かな?

Python

日本でもおなじみのよく知られたプログラミング言語。コミュニティは大きくて、フレンドリーかつ活発な模様。貢献者向けドキュメントあり。メンターシッププログラムあり。女性も活発に活動しているようだ。
日本だと翻訳プロジェクトがある。

LibreOffice

フリーのオフィスで2010から活動している。The EasyHacksのページから始めるとやりやすい模様。日本語でもメーリングリストやフォーラムで活動しているようだ。LibreOffice日本
Twitterのアカウントも発見

PostgreSQL

フリーのORM。C言語ベースのプロジェクトで、Cが得意な人には貢献しやすそう。ToDoページがある。日本のコミュニテイはなんとNPO法人があるようだ。

Ubuntu

大人気のLinuxディストリビューション。コミュニティの動きがかなり活発なようだ。使用している人が多いだけあって、国際的に様々な人が参加している模様。how to contributeなサイトもあり。もちろん日本コミュニティも存在し、フォーラムを覗いたが、活発にやり取りされていた。

PC-BSD

FreeBSDをベースに作られたOS。Ubuntuに興味があるけど、少し違ったものに貢献したい人におすすめらしい。プロジェクトに貢献をはじめるためのドキュメントも存在する。
日本のコミュニティは発見できず・・・

Documentation

正確に言うとオープンソースプロジェクトではないが、だいたいのプロジェクトにおいて弱い面であるので、最初の貢献にはおすすめらしい。ドキュメントは目に見えるところなので、貢献のインパクトは高い。

どのようなプロジェクトを探すべきか?

とにかく自分が使用していて、見つけたバグなど、小さな問題からとりかかるのがいいらしい。ほとんどの人は、自分が使用してもっと改良したいなど、自分のための理由から一歩を踏み出すことが多いようだ。 自分もLinux mint使用しているので、このへんから初めて見るかな。

避けたほうがよいプロジェクト

Linuxカーネルプロジェクト。へっぽこがヤンキースでプレイするようなものだと。
改善の兆しはあるが、あまり親切なコミュニティではないらしい。 カーネルのメンテナーたちは非常にコードにうるさいと。
まあ、プロジェクトの大きさなど考えると、綺麗なコードでないとメンテできないので、当然ですよね。
でもちょっと意外だった・・・

 wikipedia。なんか怖いらしい。

2013年5月19日日曜日

gemでインストールしたパッケージのダウンロード元、ライセンスについて

gemでcompass, sassをインストールしたが、「それのダウンロード元、ライセンスについて報告しろ」と言われ調べた。

まず、-v オプションをつけてsassをインストールしてみる。
sudo gem install -V sass
Password:
GET http://rubygems.org/latest_specs.4.8.gz
302 Moved Temporarily
GET http://production.s3.rubygems.org/latest_specs.4.8.gz
304 Not Modified
Installing gem sass-3.2.9
Downloading gem sass-3.2.9.gem
GET http://rubygems.org/gems/sass-3.2.9.gem
302 Moved Temporarily
GET http://tokyo-m.rubygems.org/gems/sass-3.2.9.gem
200 OK
/Library/Ruby/Gems/1.8/gems/sass-3.2.9/README.md
/Library/Ruby/Gems/1.8/gems/sass-3.2.9/VERSION_NAME
/Library/Ruby/Gems/1.8/gems/sass-3.2.9/VERSION_DATE
/Library/Ruby/Gems/1.8/gems/sass-3.2.9/REVISION
/Library/Ruby/Gems/1.8/gems/sass-3.2.9/MIT-LICENSE
/Library/Ruby/Gems/1.8/gems/sass-3.2.9/VERSION
/Library/Ruby/Gems/1.8/gems/sass-3.2.9/CONTRIBUTING
/usr/bin/sass
/usr/bin/sass-convert
/usr/bin/scss
Successfully installed sass-3.2.9
1 gem installed
Installing ri documentation for sass-3.2.9...
Installing RDoc documentation for sass-3.2.9...

ふむふむ、取得先は「http://tokyo-m.rubygems.org/gems/sass-3.2.9.gem」ということか。
ライセンスは「/Library/Ruby/Gems/1.8/gems/sass-3.2.9/MIT-LICENSE」に記述がある。

compassも同様に調べることが可能だ。

OSSといえど使用する際は、ライセンスに気をつけよう。