ITの問題はなくならないのか

日々考えていることを書く

手段の目的化

Facebookをやっていると、知り合いの知り合いが起業したとかいう記事を見ることある。
誰のどんな課題を解決したくて起業したのかが非常に興味があるため、そういう記事を見かけたらホームページを確認するのだが、
「介護×AI」とか、「転職先の紹介×人工知能」とか、最新の技術をキーワードに起業をしている例を多数見かける。

なぜ手段が目的になっているだろうか。

介護には様々な課題がある。徹底的に分析した結果、介護に存在するこの課題を解決するにはAIしか絶対にありえない、
というのであればまだ理解できるが、
AIが先にあって、とりあえず介護と組み合わせてみました、
というのであれば全く理解できない。
(AIが先にあったとしてもAIを徹底的に高性能にするためには、介護で実証実験をするしか無い。だから介護とAIを組み合わせた、というのであれば理解はできる)

AIだろうが人工知能だろうがIoT,AR,VRだろうが、単なる手段に過ぎない。
先に目的があって初めてそういう手段が出てくるのに、なぜAIが真っ先に出てくる?
本気で介護に存在する問題に取り組もうとしてるの?

確かに古い投資家であれば、AIとか人工知能とかそういうキラキラワードが入っていたほうが金を出してくれる可能性が上がるかもしれない。
でも、本物の投資家はそういうキラキラワードには騙されないし、
そもそもあなたがやらなくても他の誰かが全く同じ手段を使って起業をする。

1. 手段は手段であって目的ではない
2. 誰の何の課題を解決したくて起業を考えたのか
3. 本当に起業しなければその課題は解決できないのか

そこをちゃんと理解した上で起業しないと失敗する確率が上がってしまう。
起業は恐れるべきではないし、起業をすること自体は素晴らしいことであるが、
ここを守らないと、本当に無価値な会社を作ることになってしまう。

絶対に使わないであろうワンライナー

現在、rsyslogを使って運用しているが、過去の日付のファイルが一部圧縮されていないのが判明した。

$ find . -name *201*.log
./aa10aa10/aa10aa10_20131130.log
./bb10bb10/bb10bb10_201310.log
./aa11aa11/aa11aa11_201111.log
./bb11bb11/bb11bb11_201407.log
.
.
.

ファイル名もディレクトリもバラバラで、これらを圧縮した上で消したい!
そんな時に考えてみたコマンドがこんな感じだ。

$ for i in $(find . -name *201*.log );do cd `echo $i | awk -F"/" '{print $2}'` && tar zcvf `echo $i | awk -F"/" '{print $3}'`.tar.gz `echo $i | awk -F"/" '{print $3}'` && cd ../;done

対象のファイルをカレントディレクトリで圧縮していくようなワンライナー・・
多分人生で二度と使わないと思う、、

ZabbixのDBでPercona Xtradb Clusterを使う

半年ほど前に、ソーシャルゲームの案件に携わった際にPercona ServerというMySQLの派生プロダクトの存在を知り、どっかで絶対使い倒してやろうと考えていた。

今の携わっている案件にてZabbixを立てる機会があったのだが、
そのZabbixを立てる際にPercona XtraDB Clusterというツールを導入してみた。
Percona XtraDB Cluster - A High Scalability Solution for MySQL Clustering and High Availability

これがまた非常に面白いツールで、Multi-Masterな構成を組むことができる。
レプリのアーキテクチャはこの辺に詳細に記載がある。
Multi-Master replication — Percona XtraDB Cluster 5.5 Documentation

いくらMulti-Masterな構成が組めるとはいえ、VIPを振って複数台でラウンドロビンしてやるぜ!
とまでは怖くてできず、せいぜい1台にVIPを振って、Activeが死んだらSlaveにVIPを切り替えといった運用しか今のところはできていない。

ただ、クラスタに1台サーバを新規追加したい、となった場合に非常に面白いツールであった。

たとえば、既存のクラスタから外したい場合には、
デーモンを止めるでもサーバシャットダウンすれば外れる。

その後、再度クラスタに追加したいとなった場合、データを全部削除したあと、
データの同期先を指定して起動するだけで勝手にクラスタにjoinする。

ちゃんとした環境で(例えばソーシャルゲームで使う等)ゴリゴリ使ったわけではないため、
負荷をかけても不整合は発生しないのか、とかその辺がすごく気になっている。
少なくともZabbix ServerのDBとしては、20万アイテム程度の監視を問題なく捌いているような状況である。

fluentdのconfigをrubyで書きたい

現状、rsyslogを使い、NW機器のlogをsyslogサーバに保存している。

出力先は、
/var/log/syslog/%fromhost%/%fromhost%.log
となり、logrotateで月次でローテートしているのが現状。

この状態で、
DC毎にあるsyslogサーバから全DCに疎通できる1台のsyslogサーバにログを転送したい!
という要件が発生してしまった。
ただし、ディレクトリ構造は以前のような形で、
DC名/%fromhost%/%fromhost%.logといった形にしたい、とのこと。

「まあrsyslogで今まで通り%fromhost%で書けば上手くいくっしょww」
ぐらいにしか思ってなかったんだが、いざrsyslog.confに以下のように書いてみると、
/var/log/syslog/DC名/%fromhost%/%fromhost%.log
当然上手く行かない。転送元syslogサーバのディレクトリしかできなくなってしまう。

「こんな時はfluentdでタグで分割して飛ばせばいいんだ!!」
と思い立ち、fluentdでconfigを書いてみることにした。
最初はfluentdでsyslogプラグインを入れようかと思ったんだが、既存のsyslogはあまり止めたくない。(絶賛稼働中なので)
fromhost毎にconfigを1個1個書いていくのは面倒くさいし、なおかつ非常にかっこ悪い。

じゃあrubyで書けばいいんじゃね?と思い、こんな形で書いた。
※ ログは/var/log/syslog/%fromhost%/%fromhost%.log に保存されるため、
 /var/log/syslog/*/*.logのものを見に行くこととした。

dirs = Dir.glob("/var/log/syslog/**")

dirs.each {|d|
	sub_dirs = Dir.glob("#{d}/**.log")
	sub_dirs.each {|d|
		basefile = File.basename(d)
		source {
			type :tail
			path d
			format '/^(?<message>.+)$/'
			tag basefile
			pos_file "/var/log/td-agent/#{basefile}.pos"
		}
	}
}

match ('**') {
	type :forward
	server {
		host "10.97.1.161"
		port "24224"
		heartbeat_type "tcp"
	}
}

rootでconfigチェックしてみたところ上手く行った!

# ruby /usr/sbin/td-agent -c /etc/td-agent/td-agent.rb --dry-run
〜省略〜
  <source>
    type tail
    path /var/log/syslog/10.173.8.15/10.173.8.15.log
    format /^(?<message>.+)$/
    tag 10.173.8.15.log
    pos_file /var/log/td-agent/10.173.8.15.log.pos
  </source>
  <source>
    type tail
    path /var/log/syslog/10.174.0.249/10.174.0.249.log
    format /^(?<message>.+)$/
    tag 10.174.0.249.log
    pos_file /var/log/td-agent/10.174.0.249.log.pos
  </source>
...........
  <match **>
    type forward
    <server>
      host 10.97.1.161
      port 24224
      heartbeat_type tcp
    </server>
  </match>

「よっしゃ!service td-agent startや!上手くいってると思うけど、とりあえずログを見てみるかw」

  <match **>
    type forward
    <server>
      host 10.97.1.161
      port 24224
      heartbeat_type tcp
    </server>
  </match>

なぜかここしか読まれない・・

1. /usr/sbin/td-agentに以下の内容を追加している
ENV["FLUENT_CONF"]="/etc/td-agent/td-agent.rb"
2. configの拡張子は.rbにしている
なのに、飛ばす部分しか読まれない。

原因を調査してみたところ、パーミッションが原因であった。

# ll /var/log/sys*
合計 148
drwx------ 2 root root 4096  2月 25 11:42 10.172.0.232
drwx------ 2 root root 4096  2月 25 11:42 10.172.3.231
.....

※ 当たり前だけど、権限が不足しているため読めません、なんてログは出てこない。

権限周りを見直し、無事飛ばせることを確認した。
次回は受け側の設定を行っていこうと思う。

以下のサイトを参考にさせていただいた。
Fluentd Config DSLについての話 - たごもりすメモ