Intellijで行番号が表示されなくなったときの対処
IdeaVimの0.38からの模様
下記の2行目
これが起こると「行番号を表示」にチェックしてもどこかをクリックすると行番号が非表示にされてしまう。
Hubotで実行したスクリプトの回数をカウントするスクリプト
qiitaに投稿した。
http://qiita.com/marshi@github/items/f8c370774d504158895c
実装
hubot-scriptのエイリアス - Qiita を参考にしてreceiveメソッドをフックして、いずれかのスクリプトが実行されるたびに実行回数のカウントアップを行う。
カウントにはrobot.brainの下記メソッドを使っている。
robot.brain.get robot.brain.remove robot.brain.set
これらのメソッドはrobot.brain.data["_private"]とのデータのやり取りを行う。
カウントの増加を行うために、robot.brain.data["_private"]に保存されているカウントデータ("script_#{script_name}"がkey、実行回数がvalue)の一覧から実行されたスクリプトに該当するデータを検索し、カウントを1上げている。この際、JSON.parseを使うとsyntax errorが出るためevalを使っている。
同様に、カウントデータ一覧から指定されたスクリプトを検索して、削除・任意のカウントへの更新を行う。
Hubotで which: no icu-config が出て失敗するときの対処
HubotとHipchatを連携させてつかうときに躓いた
これを実行時に失敗する
npm install
これをインストールして解決
yum install libicu-devel.x86_64
IntelliJ上でtomcat起動時にClassNotFoundExceptionがでるときの対処(Maven管理プロジェクト)
Eclipdeだと大概Assembly Deploymentでmavenを追加すれば直るわけですが、IntelliJだとそれに類する機能が見当たらないのでどうしましょっていう話
ClassNotFoundExceptionが出る原因
ビルドは通るくせにtomcat起動時にExceptionが出るもんだから「は?」となるがtomcatが参照するディレクトリにファイルが生成されていないことが原因
対処法
.javaファイルは $APP_HOME/WEB-INF/classes、ライブラリは $APP_HOME/WEB-INF/lib配下に置くようにする
置く場所を指定するにはpom.xmlに下記のように記述する
ライブラリに関しては結局コピーするくらいしか方法が見つからなかった
実は設定できるんだったら情報ほしいです。。
<project> <!-- なんかその他設定 --> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <!-- copy-dependenciesで依存関係のあるライブラリをlibディレクトリにコピー --> <execution> <id>copy</id> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>web/WEB-INF/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> <!-- .classファイルの出力先 --> <outputDirectory>web/WEB-INF/classes</outputDirectory> </build> </project>
Docker(とその他ツール)でつくるなんちゃってオートスケーリングシステム
最近dockerが流行ってきてて自分もdocker使ってなんかやりたいなーと思ってなんちゃってオートスケーリングシステムを作ってみた。
全体図
最初にざっと全体図
システム全体の概要はこんな感じ
各ツールの役割は以下のとおり。ちなみにOSはCens OS
役割 | ツール | 今回使用したバージョン |
---|---|---|
Load Barancer | HAProxy | 1.4.24 |
リソース管理 | Mesos | 0.19.0 |
仮想マシン | Docker | 0.11.1 |
負荷監視 | Zabbix | 2.2 |
簡単にいうとZabbixでDocker上で動いているサーバの平均CPU使用率を監視して、負荷が一定以上になったらサーバを増加、一定以下になったらサーバを減少させる。
どの物理サーバに新しいdockerコンテナを作成するかはMesosに任せる。
各部品の説明
HAProxy
webサーバのロードバランサー
設定ファイルにIPを追加することでバックエンドサーバを増やせる。
お手軽なので今回はこれで。
Mesos
物理サーバで構成されたクラスタから空いているリソースにジョブを依頼できるツール
Mesos Masterに依頼することでMesos Slaveサーバの中から空いているリソースを提供してくれる
全体図中のMarathonはMesos経由で永続的なジョブを走らせるためのMesos Frameworkというものらしい
Docker
いわずもがな
構築手順
各ツールそのものの導入については割愛
Mesosの導入についてはsonots:blogさんの下記エントリが詳しい。実際かなり参考にさせていただきました。
http://blog.livedoor.jp/sonots/archives/35421955.html
http://blog.livedoor.jp/sonots/archives/35451869.html
ZooKeeperの起動(sonots:blogより引用)
# cd /path/to/mesos cd 3rdparty/zookeeper-3.3.4 cp conf/zoo_sample.cfg conf/zoo.cfg sudo ./bin/zkServer.sh start cd -
Mesosの起動
cd mesos/build/ bin/mesos-master.sh --zk=zk://{zookeeperのサーバIP}:2181/mesos --work_dir=work_dir --quorum=1 bin/mesos-slave.sh --master=zk://{zookeeperのサーバIP}:2181/mesos --isolation=cgroups/cpu --cgroups_hierarchy=/cgroup/cpu --ip=${slaveサーバ自身のIP}
Marathonの起動
cd marathon bin/start --master zk://${zookeeperのサーバIP}:2181/mesos --zk_hosts ${zookeeperのサーバIP}:2181
Zabbixの設定(これが一番めんどくさかったりする)
監視対象(アイテム)の追加
設定 -> テンプレート -> テンプレートの作成 から新規テンプレートを作成
テンプレートを作成したらテンプレートからアイテムに移動して、各サーバのCPU負荷を監視するためのアイテムの追加を行う
このとき、zabbixトラッパーにしておくことで、zabbix APIを使って送信された値をZabbixで受け取れるようにする
さらに、各サーバのCPU負荷の平均を監視するためのアイテム追加を行う。
これにはZabbixアグリゲートを指定する
トリガの追加
さらに、CPU負荷に反応するためのトリガを設定
CPUが30%以上の場合と15%以下の場合に反応するようなトリガをつくる
アクションの追加
トリガの条件を満たしたときに実行するアクションを設定する
CPU使用率30%を超えたときにはスケールアウト、15%を下回ったときにはスケールインするスクリプトを実行するように設定する
スクリプトについては後述
スクリプト
作ったスクリプトについてざっと説明。
https://github.com/marshi/autoscaling
cpu.sh
dockerコンテナ上で動作する仮想マシンのCPU使用率を取得する。
引数としてコンテナIDを指定することで該当コンテナ上の使用率のみ取得する。
http://qiita.com/marshi@github/items/e8db79c43abf2fca8d72
ちなみにDockerのメトリクス収集に関してはつい昨日参加していた"Docker Meetup Tokyo #3"で@stanakaさんがお話されていた。「タイムリーな話きた!これでqiitaのストックも伸びる!」とか思ってたら全然そんなことなかった。世の中甘くない。
send_zabbix_cpu.sh
zabbixサーバからクラスタのコンテナID一覧を取得し、cpu.shを使って各コンテナ上のCPU使用率を取得したうえでzabbixサーバへ送信する。
各ホストサーバ上で定期実行する必要がある。
send_node_num.sh
クラスタ上で動作する仮想マシンの台数をMESOSから取得し、zabbixサーバへ送信する。
いずれかのサーバ上で定期実行する必要がある。
zabbix_host.sh
docker eventによって、dockerの起動の検知とHAProxyへの登録、docker終了の検知とHAProxyからの削除を行う。
各ホストサーバ上で常時起動しておく必要がある。
scaleout.sh
実行するたびにクラスタ上のサーバ台数を1台増やす。
zabbixで負荷が閾値を超えるとこのスクリプトを実行する。
scalein.sh
実行するたびにクラスタ上のサーバ台数を1台減らす。
zabbixで負荷が閾値を下回るとこのスクリプトを実行する。
動作確認
Zabbixの監視対象にDockerで作ったサーバのノード数も追加して、CPU平均使用率とノード数を見てみた
CPU使用率にまぁ追随してそう
ただし、実行条件をチェックするタイミングによっては過剰なノード数の増加・減少が発生しているため、タイミングの調整やノードの下限の設定などが更に必要そう。
まとめ
Docker、Zabbix、Mesos、HAProxyを使用してオートスケーリングシステムの構築をしてみた
実際の動作確認ではCPU使用率の増減に応じてクラスタのノード数も増減していることを確認できた
ただ、調整の必要がある点として、CPU使用率に対する極端なノード数の増減、最低動作台数の保証がありますね
さらに、各スクリプトを手動で実行する必要があるので、これらを包括的に管理・実行するための仕組みも用意できればなおよし
オートスケーリングって監視間隔が短くないとスパイクに対応できないし、かといって監視間隔が短すぎるとロードバランシングされて負荷が減少する前に一気にノード数が増えそうだし、どういう監視の仕方がいいんでしょうね。
リソースが潤沢にあるなら別に短い間隔で監視して増え過ぎたら後で減らすッて感じでもいいんでしょうけども。
あと最近知ったけどflynnっていうのがあってそれで今回つかったMesosとか置き換えられるんじゃないのかーと思ったり。むしろオートスケーリングがもっと簡単にできるんじゃ・・と思ったり。
ちょっとした絶望感を覚えつつも触ったことないものにいっぱい触れる機会を持てたからいいかと前向きに捉えることにする。
EclipseのDeployment Assemblyの項目で"The given project is not a virtual component project"とでるときの対処
なかなか原因がわからずはまってたんですが、一応わかったのでメモ
方法は単純で↓の画面で動的Webモジュールのチェックをいれればいい。
GitHubからプロジェクトをインポートしてきたときにこういう現象が起こったが、根本的な原因が何かはまだよくわかってない。
SpringでFTL(freemarker)を使うときの設定
STS(Spring Tool Suite)を使ってEclipseでSpring MVCプロジェクトを新規作成すると、初期状態ではテンプレートエンジンとしてJSPを使うように設定されている。
これをFTL(Freemarker Template Language)を使うように変更しようとしたら少しやらないといけないことがあったのでメモ。
やらないといけないことは大きく2つ。
ライブラリの追加
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${org.springframework-version}</version> </dependency>
servlet-context.xmlの編集
編集前
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean>
↓
編集後
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/views" /> </bean> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="prefix" value="" /> <property name="suffix" value=".ftl" /> </bean>
この状態で WEB-INF/views/配下にftlファイルを置いて呼び出せばftlファイルの内容が表示される。