2台のサーバに2台のPT3で運用する構成を考える。主目的は冗長化でどちらのサーバでも2並列までは録画できるようにする。また、通常運用時は2台のPT3で4並列まで録画できるようにするのが理想だ。ネットワーク越しに2つのPT3を透過的に扱いたいので、チューナーを抽象化してくれるmirakurunはどうしても導入したい。バックエンドがmirakurunだとすると、普通に考えれば録画管理もchinachuに任すのが順当。実際にchinachuも使ってみたんだけど、UI的にはepgrec UNAの方がわかりやすいような。
アースソフト★地デジチューナーカード PT3 Rev.A★ by Yahoo! ショッピング |
それに加えて、epgrec UNAは自分好みにかなりの改造を加えてきたので、それが失われるのが惜しい。同じような修正をchinachuに行えばいいんだけど、データモデルがDBとして分離していない分、epgrecより修正が面倒なんだよね。もっとも大きな変更が録画ファイルのpriorityで出し分けをしている点で、予約や録画ファイルなど、アクセスしたユーザーに合わせてフィルターされる。つまり子供は子供向けの録画データしか見えなくなっている。これをchinachuに移植するのが、ちょっと骨なんだよね。
具体的にはドメイン別でHTTPヘッダにpriorityを設定し、priority以下のレコードしか見えないように各テーブルのSQLを修正した。対象となるSQLは7箇所くらいで意外と何とかなる。メインメニューもメンテナンスや環境設定が見えなくなるように変更。以前は2つのepgrec UNAを運用してた時期もあったんだけど、予約は分散するし、障害には気付きにくいし、いろいろ不便。極め付けは冗長構成を取ろうとすると予約データを一時的にマージする必要があり、ロジックが複雑化してしまう。冗長化を実現するにはシングルインスタンス化が必須と言える。
さて、やっと本題。mirakurunの導入に当たって、ポイントは以下2点。
- LXCコンテナに入れる
- チューナー管理以外の処理を止める
mirakurunのインストールはいつも通りで問題ないが、LXCコンテナ上では起動させることができなかった。以下のようなエラーが記録されいていた。
renice: failed to set priority Permission denied
よくよくコードを追ってみると、mirakurunは起動時にreniceで自分のpriorityを引き上げているようだ。この処理がLXCコンテナでは失敗してしまう。もちろんrootで起動しているのだが権限が足りない。あちこち調べてみると、ホストOS側にあるLXCの設定ファイル『 /usr/share/lxc/config/centos.common.conf 』で権限が落とされていることがわかった。『lxc.cap.drop = sys_nice』と書かれている箇所のsys_niceを削除してコンテナを再起動すればmirakurunを起動できるようになる。
続いて番組更新処理の停止。epgrec側で録画管理のすべてを行うので、mirakurunが無駄にチューナーを使うのは避けたい。master側のmirakurunがrivarun経由でslave側のmirakurunにアクセスするので、slave側のmirakurunが勝手にチューナーを使うと解放されるまで待ってしまう。少なくとも番組表更新はepgrec側で行っているので、mirakurunで実行する必要はない。とはいえ、『/usr/local/var/db/mirakurun/services.json』がないと動作しないので、一度だけ番組表更新処理を行い、このファイルを生成しておく。
【中古】アースソフト★地デジチューナーカード PT3 Rev.A☆【即納】
|
あとは番組表更新を止めるように以下の設定を『/usr/local/etc/mirakurun/server.yml』に追記して再起動。
programGCInterval: 86400000
epgGatheringInterval: 864000000
この設定を加えてもプロセス起動時のEPGスキャンは発生してしまうので注意。運用に入ってしまえば、そうそう再起動することもないので放っておいても良いかもしれないが、どうしても止めたい場合はコードを修正する以外にない。『/usr/lib/node_modules/mirakurun/lib/Mirakurun』にあるChannel.jsのgetEPG()発行箇所を1つ、ChannelItem.jsのserviceScan()発行箇所を3つコメントアウトすれば起動時のscanも回避できる。録画処理は数分の遅延で泣きを見ることもあるので、止めておくに越したことはないだろう。
ただ、services.jsonの更新も完全停止してしまうので、万一内容に差が出てしまった場合は変化したチャンネルの録画に失敗してしまうはず。仕様をよく理解した上で変更するよう注意されたい。epgrec UNA側のEPGスキャンデータを元に動的生成するのが理想かなあ。以上の変更で多少無理やりな部分もあるが、epgrec UNAで利用するためのmirakurunが準備できた。もう少し簡単に番組表更新を停止できるようになるといいのになあw 次回はepgrec UNAからmirakurunへ繋ぐ部分を設定していく。お楽しみに!