page_adsence

2015年1月30日金曜日

Windwosマシンからsambaへのアクセスでハマった

vagrant + ansibleを使ってVMのセットアップをして、いざ共有ディレクトリにアクセスしたら、アクセス拒否。
原因がいまいちよくわからなかった。
結論から先に言うと、全ての原因はSELinuxだったということ。
playbookにSELinuxをオフにする記述を追加して、設定ファイルを確認。

$ view /etc/selinux/config
SELINUX=disabled

と書かれていたので、安心しきっていたのですが、実際には設定ファイルだけ書き換わっていて再起動されていなかったため、
SELinuxが普通に動いている状態でした。

$ getenforce



$ sestatus

で確認した所、ガンガン動いていた。
以下、ハマった事象に関しての詳細。

起こっていた現象

\\サーバのIP

にはアクセス出来る。

\\サーバのIP\public

にもアクセス出来る。

\\サーバのIP\vagrant

にはアクセス出来ない。

sambaの設定色々いじったり、VM側のディレクトリのパーミッション弄ってみたりと色々試しましたが全てダメ。
何がダメなのかわからなかったのですが、こんな記事を教えてもらって試してみた。
VM上で、下記のコマンドを実行したら見れる様になりました。

$ setsebool -P samba_enable_home_dirs on

これで問題なくなったと思っていたら、今度はフォルダとシェルスクリプトだけsamba上で見えていて、ファイルが一切見えないという状態に。
VM上で同じディレクトリを参照すると、特に問題なくファイルもあり、中身も閲覧出来る。
何が原因なんだと思って調べていた所、このサイトが引っかかった。
原因はSELinuxだと書かれていて、SELinuxはオフにしてあるはずなのになぁと思いつつ、確認してみた。

$ getenforce
Enforcing

普通に動いてました・・・。
なので

$ setenforce 0

で一時的に無効化してから、もう一度samba経由で対象のディレクトリにアクセス。
普通に見れました。

2015年1月23日金曜日

MySQLからMongoDBへのデータ移行 まとめ

MySQLからMongoへのデータ移行手法に関してはほぼFixしたのでメモ。
過去記事に関しては以下を参照。

MySQLからMongoDBへのデータ移行
MySQLからMongoDBへのデータ移行 その2
MySQLからMongoDBへのデータ移行 その3

今回移行対象のデータ件数は4000万件程度。
件数としてはビックデータとは言えない微妙な件数・・・。

まず結論から。
  • MySQLからデータを抽出する方法に関してはeオプションを使って、標準出力をファイルにリダイレクトさせる。BSON形式っぽいTSVファイルにして出力する。
  • ちゃんとしたBSON形式に変換する。ダブルクォーテーションのエスケープとか、改行コードをCRLFに変換とか、変な文字列の削除とか諸々必要
  • mongoimportは決して早くない。と思う。(チューニングしてないので。)
  • BSON形式以外のインポートはお勧めできない。型変換に異常に時間がかかるため。
  • mongoimport中に重複があったとしてもエラーメッセージは出てこない。すでに重複するデータがmongoに入っていた場合はエラーが出る。

mongoimportの速度に関して

これに関してはあまり書くことはないが、とりあえず4000万件のデータを入れるのに7.5時間位掛かりました。
2.1系から2.6.5にバージョンアップしたら倍位遅くなりました。原因はまだ不明です。
上の時間はバージョンアップ後の時間です。
ちなみにサーバ構成はこんな感じです。
mongos×3台、mongod×6台(うちマスター3台、スレーブ3台)

mongoimportのファイル形式に関して

結果的にはファイル形式に関してはBSON形式一択でした。
CSVやTSV形式だと、データ型を定義することが出来ないため、
純粋な数値以外は全てテキスト型になってしまうので、日付のデータやNULLに関しては書き換えが必要になる。
データ量が多くなるとその書き換えに非常に時間がかかる。

mongoimportのエラーに関して

これに関しては色々調べたんですけど、結局良くわからず・・・。
エラーが出たらインポート止めるっていうオプションもあるらしいのですが、そのオプションをつけても重複エラーに関しては止まらないらしいです。

MySQLからMongoDBへのデータ移行 その3

前回MySQLの標準をファイルに出力する方法を採っていたが、
これより更に楽になるというか、処理が終わったかどうか分かるようになるやり方があったので紹介する。

mysql --quick -u root --password=password -h localhost mysql_databasename -e "SET NAMES utf8;" > "output.tsv"

このような記述で処理を実行すると、前回同様のメリットを得られる上に、デメリットだった処理の終わりが分かりづらいということも解消される。

ちなみに、「--quick」というオプションは出力結果をメモリ上に溜めずに、どんどんファイルに書き出す様にするためのオプション。
でかいデータを抽出する場合は、メモリ不足で処理が途中で終わってしまうことがあるので、このオプションをつけた。

「-e」オプションはMySQLにログイン後に実行するSQLを書くことが出来る。
ここに必要なSQLを書いておき、実行結果をファイルに出力することが可能になる。
セミコロン区切りで何個もSQLを記述することも可能なので、下記のような方法も可能。

mysql --quick -u root --password=password -h localhost mysql_databasename -e "SET NAMES utf8;
SELECT * FROM table_name_A;
SELECT * FROM table_name_B;" > "output.tsv"