Closed noda50 closed 4 years ago
(もしかしたら私が質問の意図を正しく理解していないかもしれませんが、) Result_developmentだけを別の場所に移動するのは無理ですが、oacisディレクトリ自体を別の場所に移動するだけでよいのでは?
まぁ、そうなのだけれど、使用量の変わるデータディレクトリと、実行ファイルの格納(あるいは開発・改良作業)場所が同じというのは、unix 的には居心地悪いなぁと。
/var 以下に全部持っていくのかなぁ、、、
好みの問題なのでご自分の環境に合わせてシンボリックリンク貼って運用してもよいと思います。 とりあえずoacisの変更は必要ないと思いますのでこのissueはクローズします。
どうも、コピーとかしても、作業用の oacis の dicectory をうまく独立させられない。
github と連動させた(git clone したままの) oacis dicrectory を dir-A としておく。 dir-A は、動作させたときに作られてしまうファイルを作らせないようにしておきたい。 この状態では、dir-A には "tmp" という directory は存在しない。
そこで、別 directory (dir-B)を作り、public 以外のファイルを、.git まで含めて dir-A から dir-B へ symbolic link (あるいは copy)する。また、public は、dir-A から dir-B に再帰的にコピーしておく。
その上で、dir-B でbundle exec ... と行うと、 dir-A の方に、 tmp が作られてしまい、なにかの cache が保存されてしまう。
うーん、悩ましい。
上記の考察、少し勘違いが入っているかもしれない。
現象としては、oacis を起動した directory (dir-B) と、oacis_watcher (bin/oacis_ruby) を動かした directory (dir-A) が異なると、いろいろとおかしくなっている。
おそらく、dir-A の oacis_watcher は、dir-A の下の public/Result_development 以下に run 用の sub directory を造って、ジョブを投げる。それを受けて、dir-B の oacis が計算ノードに job を ssh で投げる。計算が終わると、dir-B の observer は計算ノードからファイル群を scp しようとする。その宛先は、 dir-B の下の public/Result_development の下の sub directory。当然、そういう directory は存在しないので、scp でエラーが起きる。
public/Result_development の絶対 path を mongoDB に書いておくなどして、dir-A の oacis-watcher と dir-B の oacis が同じ作業 directory を参照するようにはできないか?
そもそもの話としてdir-A,dir-Bと2箇所にoacisをcloneしても、参照しているDBは同一なので独立になりませんよ。 どうしても2つの独立したoacisを起動したいなら参照しているDBをそれぞれ別にして(config/mongoid.yml, config/cable.yml)、別のポートで起動すればうまく行くかもしれません。(未検証)
directory を分けたい理由は、
現在、どうなっているかというと、
と、3つの階層(データ・プログラム・管理フレームワーク)で変な分断が置きてしまってる。これが気持ち悪い(というより、数年後までこの構造を覚えていられる自身がない)
oacisの話というよりは使い方の問題のような気がしますが、厳密に分けたいのであればdockerを使えば解決しそうです。
docker は docker で問題があって、巨大なジョブを流すと、public/Reult_development があふれて、docker ファイルが巨大になる。 速度の観点から、docker は速度の速いストレージ(SSDとか)に置きたいが、そうすると容量がそれほど大きくできないので、結構すぐにあふれた。
実は、このデータディレクトリを分けたい、と思い始めたのは、docker で溢れてしまったから。
docker runの時に,特定のディレクトリをマウントできます.
docker run -d -v /mnt/raid_array/project1:/home/oacis/oacis/public/Result_development oacis/oacis
この利用方法の問題点は,dockerのイメージの中にDBがあるので,うっかりdocker rm
してしまうと普及できないことです.
また,Result_developmentがどのdocker コンテナのものだったかも忘れてしまう可能性があります.
私の独自の運用ルールですが,定期的にResult_development以下にDBをダンプしています. これで,少なくともResult_developmentとDBは紐付いているので,内容を忘れてしまっても,OACISを立ち上げ直せば思い出せます.
ご参考まで.
dockerでvolumeをマウントする方法はこちらにも記載がありますので参考にしてください。
https://github.com/crest-cassia/oacis_docker/tree/master/oacis
ただ、やはり、OacisWatcher をつかったものを開発している時に、docker 環境ではうまくできない(docker に、開発環境を全て持ち込まないと、まともに開発できない)ので、無理だなぁ。
OacisWatcher を使ったライブラリを、以下で作り始めています。興味あったら、contributor に加えます。
https://github.com/crest-cassia/ItkOacis
で、こういうのを開発しようとすると、docker 環境では面倒で、かつ、 data directory がわかれてないと、かなり面倒、ということです。
本番環境をdockerにしてはどうですか? 開発環境をdockerにするというのも、私はやったことはないですが標準的なプラクティスなのでできると思いますよ。oacisのイメージは最小限にしていますので、必要なパッケージを追加した自分用の開発イメージを作る必要がありますが。
申し訳ないですが「データベースの中にファイルパスを入れる」というのは複雑化してバグの温床になる可能性が濃厚なのでやるつもりはないです。それこそデータディレクトリを移動できなくなってしまいますし。 APIを使った開発のベストプラクティスみたいなものはあるとよいですね。Runの実行完了待ちとかを開発で実際にやると時間がかかってしまいがちです。
本番環境と開発環境がうまく切り分けられないのが、難しいところ。特に、社会シミュレーションとかしていると、あれやこれや試行錯誤するところも研究のうちなので、「プログラムはこれで完成、設定もこれで十分」にならない。
さらに、これは私だけの問題かもしれないが、複数箇所・複数マシンで開発していると、データ領域が切り離されていないと、管理が困難になる。 現在、職場2箇所(つくばとお台場)+自宅+手持ちPCで継続的に開発している。しかし、職場2箇所では各々2台使って並行して開発していたりする。その間の開発環境の同期は rsync にしている。つまり、完全に上書きコピー。なのでデータ領域(マシンごとに異なることになる)を切り分けれないと、おかしくなっていく。開発の効率化したいけど、そのために逆にトラブルが多くなって、開発スピードが落ちてるなぁと。で、その原因が、データ領域が切り分けられてないところ。
社会シミュレーションに限らず試行錯誤が研究のほとんどですよね。 複数マシンがあっても一つの本番用oacisを起動しておいてそこからネット越しにつなげばいいんじゃないですか?私を含めそういう運用をしている人が多いです。 rsyncでもResult_developmentをクローンすれば何も問題はないはずです。データのバックアップや共有用のoacisにデータを同期するのに使っています。 データ領域の切り分けが何を意味しているのかよくわからないですが、仕様に手を入れるつもりはないnおで、どうしても必要であればご自分の環境でコードを書き換えてください。
本番OACIS方式ができない理由が2つ。
本番用をどこかで動かすとして、oacis_watcher はどこで動かすのか? 基本、開発しているところで動かす。「試行錯誤」というのは、シミュレータの試行錯誤だけでなく、oacis_watcher 使った部分の試行錯誤も含めています。oacis_watcher を1つしかない本番oacisマシンでしか動かせなければ、開発環境としては劣悪。
研究環境上、常時つながっていて容易に行き来できるマシン群ではない。 お台場は企業とやっていて、同じ産総研内だが、つくばとはデータレベルで切り分けが必要。自宅とつくばは、ネット環境が安定出来るとは限らない(いちいち VPN を張る必要がある)ので、不具合の原因の大半がそちらになりかねない。
要は、データ領域とプログラム領域を切り分けて、データ領域は環境変数なりデータ領域の設定ファイル(oacis.config.json みたいなファイルを置いておく) とかできないか、ということなんだが。 今現在は、public/Result_development とか tmp とかに散らばっている、unix 系では /var に置いておくようなファイル群を、明示的に指定したい、ということ。
バックアップ、レストアができるということはご存知ですよね?(これを知っているという前提で話していました) http://crest-cassia.github.io/oacis/ja/tips.html データの切り分けは「環境1でバックアップして、環境2に持って行ってレストアする」というのでは実現できていませんか?
データの方を持ち運びたいのではなくて、(開発中のコードを含めた)プログラムの方を持ち運びたい、という要望。
つまり、
~/work
/program <- ここは作業してるマシン間で rsync させたい。
| /oacis
| /ItkOacis
| /MySimulator
| ...
/data <- ここはマシンごとに別々
/workData0
| /public/Result_development
| /tmp/...
| いろいろデータ
/workData1
/public/Result_development
/tmp/...
いろいろデータ
programの下はgitで管理してますよね?普通に環境1でgit push
してから、環境2でgit pull
ではダメでしょうか?
workData0/1の切り替えはbackup,restoreの手順を同一のマシンで行うだけでできますよ
git では管理しているけれど、github にしていないのも多い(全部 git に持って行くと、private があっという間にあふれるので)。また、産総研のネットで、github にアクセスできないマシンがある(固定IPのマシンは基本、外に出れない)。なので、rsync を基本にせざる得ない。
それと、github に頼ると、ネットにつながらない or 弱い環境で作業できない。飛行機とか、移動中とか、田舎の宿とか。
rsyncでもscpでも.gitignore
しているファイル以外をコピーすれば同じです。さらに言うとoacis自体のコードは直接触ってないと思いますので、oacisディレクトリの同期が不要です。
ItkOacis, MySimulator 以下のディレクトリをコピーしてください。
現状、ほぼそういう環境で開発を進めています。
つまり、oacis はデータ領域にあって、使い捨て扱い。 なので、開発(oacisの改良・改造)は行わない、という扱い。
あと、ItkOacis などの開発において、どうしてもデータ領域にあるoacisを参照するという歪な部分がどうしても残ることも残念なところ。
public/Result_development を、public ディレクトリ以外のところにもっていくことは可能か?
web server からのアクセス制限のためか、このディレクトリを、~/var とかにもっていくことができない様子。
データがどんどん貯まる場所なので、できればそれなりの所(例えば backup 用の drive) とかにもっていきたいけれど、無理かな?