tanacasinoのメモ

what are you waiting for ?

日本OpenStackユーザ会 第16回勉強会に行ってきました

というわけで参加報告するまでが勉強会ということで。

まずはじめに勉強会の準備・会場の準備をしていただいた方、発表者の方、お疲れ様です。 本当にありがとうございました。

では、私の記憶と手元のメモを晒します。 意外とメモが役に立たなくてなんのメモかもう思い出せない・・・ あと、発表者が言ったことなのか?自分の感想・メモなのかが思い出せない・・・

誰かこれを読んで間違いに気づいた方いれば教えて下さいませ。

勉強会について

テーマ

資材

  1. ソースコード

    • https://github.com/openstack/nova
    • GitHubにソースあるしご自由に準備してくださいとのことでしたが、講師の @boot_vmlinuz さんが、GNU Globalを使用したHTML資材を準備してくれいました
  2. GNU GlobalでHTML化した novaのソースコード

  3. 発表スライド

内容

発表スライド読んだほうが正しいですが、なんとなく。

  • ディレクトリ構造
  • nova-* のブートストラップ
  • RPC(プロセス間通信)
  • DB
  • 定期実行処理(Periodic Tasks)

ディレクトリ構造 編

発表スライドに書いてます。こんなメモよりそれを見るのが正解。

何となくとっていた and スライドに書いてない気がする メモをとりあえず

  • hacking : なんだっけ?知ってる人います?に誰も反応せず
  • objects
    • サービス間のデータ受け渡し用(RPC)
    • instance_id とか渡してたけど、それだとinstance_id使ってDBの情報を引くことになる。DBへの負荷高いから、objects の objects に突っ込んで渡そうになっているとのこと
  • servicegroup: 死活監視
    • 昔は DBで管理してた
    • それは負荷が高い
    • 死活監視をモジュール化した。DB以外使える
    • 3種類
      • DB
      • zookeeper
      • memcacched
    • DBドライバは @boot_vmlinuz さんが書いたから不具合あれば教えてくださいとのこと
  • storage: ストレージ操作関連 multipathとかも

この辺でファイルの話もあったけどなぜかメモも記憶も飛んでいる・・・

  • requirements.txt

    • novaが依存する pythonのライブラリが記載される。バージョン指定がきもいやついる
    • RHELが提供する rpm や、Ubuntuが提供する debで入れる人は、これらもパッケージングしてくれてるのであんま気にしないかも
    • ソースから直接入れる人は使うかも(devstackみたいな?)
  • etc に設定ファイルにサンプルあるのでのぞいてみる

    • 設定の数は超絶多いとのこと
    • @ishikawa84g さんがエクセルにまとめてくれているそうな

nova-* プロセスのブートストラップ

  • プロセスのエントリーポイントとなるコードは、nova/cmd/*.py ですよ
  • 昔は、binディレクトリ以下にあったけど変わった
  • setup.cfg でスクリプトになるように書かれてる

簡単なサンプルとして nova/cmd/consoleauth.py を見てみた。

novaは3種類に分けれるよん

  1. 単一プロセスのサービス
    • nova-consoleauthなど。ここが多い
  2. 複数プロセスのサービス
    • nova-conductor
    • workers で設定できる
  3. RESTful APIサービス

nova/cmd/*.py から始まりソースを順番に読む。このあたりで、迷子の参加者多数。

そしてなぜか自分のメモがここだけ だぜ口調。

  • nova.service.Service の解説だぜ
  • nova.service.Service.create で作るんだぜ
  • つまりは、 nova-compute だけ db_allowed=False だぜ
  • nova-compute はDBアクセス禁止だぜ
  • 今までDBからとっていたような情報が欲しい場合は、nova-conductor に問い合わせるぜ

この辺は1行ずつ読んで解説をしていただいたと思いますが、ソース追いかけてて断片的にしかメモがないので、記憶で読んだ気がするコードやキーワードを並べときます。

  • nova/cmd/*.py
  • nova/service.py
    • class Service
    • def create
    • def start
  • nova/openstack/common/service.py
  • nova/manager.py
    • def start の init_hostの話
    • nova-computeの場合 nova/compute/manager.py
  • additional_apisがあるのはのnova-conductorのみ(たぶん)
  • post_start_hook は nova-cells だけ
  • backdoor_port の話

RPC用 consumer の話

Sercice の startの解説で

  • consumer 3つ
  • topic = computeとかみたいにサービスの種類を表す
  • host = サービスが動作するホスト

  • topic and fanout=False : 複数ある同一topicのサービスのうち1つだけが、メッセージ受け取る

  • topic.host and fanout=False : 自分宛てのメッセージを受け取る
  • topic and fanout=True: topic関係者全員が受け取る

RPCの話

発表スライドの13枚目。

  • サービスBのAPIでも rpcしないケースもあり。
    • 例: DBみるだけのときなど
  • RPC送信部 impl_kombuなど
    • nova/openstack/common/rpc/__init__.py
    • nova/openstack/common/rpc/amqp.py
    • nova/openstack/common/rpc/impl_kombu.py
      • RabbitMQ
    • nova/openstack/common/rpc/impl_qpid.py
    • nova/openstack/common/rpc/impl_zmq.py
      • ZeroMQ
    • nova/openstack/common/rpc/impl_fake.py
      • UnitTest向け。
  • dispatcherにより適切なモジュールを呼び出し
    • B/manager.py or baseapi.py
  • check_for_lock

    • よくわかんなかった・・・
  • rpc の データのserialize/desirialize => MQに突っ込むために、JSON形式の文字列データにしたり、受信側でそれを pythonのプリミティブ型(int,str,dict,list)に戻したりする

nova/conductor/ 以下の例(スライド 14)

  • manager.py nova-conductor 自身の本体
  • api.py => 他のサービスからの nova-conductor の呼び出しコード
  • rpcapi.py => 他のサービスからの nova-conductor のRPC呼び出しコード

おまけ編

DB呼び出し

スライド 16

サービスA => nova/db/api.py => nova/db/sqlalchemy/api.py => DB

  • impl は sqlalchemy だけ。
  • zookeeper かなんか別のドライバ作る?って話もあるとか。
    • 作る話は止まってたけど、最近動き出した?みたいな話もありんすた
  • DB操作のメソッドを追加する場合は、両方にメソッドを足しましょう
    • nova/db/api.py
    • nova/db/sqlalchemy/api.py
  • すべての APIが context を渡すようになっている
    • context には、ユーザの権限をチェックしている
    • デコレータでチェック @requires_admin_context
    • DBのAPIで、わざわざ権限チェックとかいらないんじゃないの?という話になっているらしい
      • そもそものHTTP APIリクエスト来てすぐにに権限チェックしてるやん的な
      • 廃止されるかも?

periodic tasks

ユーザからのリクエストイベントからの処理じゃなくて、定期的に実行する処理。periodic_task

  • nova/openstack/common/periodic_task.py
  • nova/compute/manager.py
    • デコレータがついてるやつがperiodic_taskになりんす
    • @periodic_task.periodic_task
    • いろいろあるよねーな話。ザクッと解説していただけましたがメモなし
    • shelved => havanaからできた
      • 停止に近い
      • VMの定義を残したまま、ハイパーバイザー上のリソースを開放する
    • デコレータに引数も付けれるよ
      • interval を個別にコントールできたりする?
      • spacing

まとめ

今日まだまだ読んでないところあるよん。virt のところとか。 でもまあプログラムのエントリーポイントとか、どこにコードがあるかわかったはずなので、今日の説明を足がかりに処理を追いかけれるよ。みんながんばれ。

その他宣伝

  • クラウドマネジメントツール勉強会 第二回
    • 12/4 水曜日
    • みんなくるよね?
  • OpenStack Advent Calendar 2013
    • 小ネタでもなんでも歓迎
    • Glance の代わりに Walrus を使おうとしている人や、イジメ抜く、許さない、絶対な人もいる
  • 沖縄 OpenDays
    • 沖縄でやる。丸一日は、OpenStackのみ。マジチャレンジャー。
  • OpenStack Days Tokyo 2014
    • 2/13,14
    • 今年は二日間だから day ではなく days だよ

おしまい!意外とメモしてないとこ多いけどもう覚えてません! その他の情報は、 Twitter のハッシュタグ #opst16 でどうぞ。