Webサービス・サーバーの無停止化を試行(2)

Webサービス・サーバーの無停止化を試行(2)

ソフトバンク・au・ドコモの方は、公式のオンラインショップを利用すれば頭金不要で通常のショップよりお得に購入できます。

前回に続いて、今回は「Webサービス・サーバーの無停止化を試行」について作業内容を書いていきたいと思います。

作業

設定

fluentdのインストールは省きます。
先にnginxにてlog_formatを以下のようにしました。

[shell] log_format ltsv

‘access_time:$time_iso8601\t’
‘remote_addr:$remote_addr\t’
‘request_method:$request_method\t’
‘request_length:$request_length\t’
‘request_uri:$request_uri\t’
‘https:$https\t’
‘status:$status\t’
‘bytes_sent:$bytes_sent\t’
‘body_bytes_sent:$body_bytes_sent\t’
‘referer:$http_referer\t’
‘useragent:$http_user_agent\t’
‘forwardedfor:$http_x_forwarded_for\t’
‘request_time:$request_time\t’
‘upstream_response_time:$upstream_response_time’;
[/shell]

デフォルトの半角スペース区切りだったのでパースしやすいようにタブ区切りに変更してます。
また、なんのデータなのかわかるようにもなりました。

次にflunetdの設定
[shell]type tail
format ltsv
path /var/log/nginx/access.log
pos_file /var/log/td-agent/buffer/pos/access.pos
tag sample


type xmlout
slave_server localhost
slave_port 8080

[/shell]

source箇所でアクセスログをチェックしていて設定項目は既存のものだけだと思います。
match箇所で実際の処理を行っていて以下になります。
[shell] type xmlout
plugin名
slave_server localhost
HBase Restが動いているホスト名
slave_port 8080
HBase Restの待ち受けポート
[/shell] ※本当はもっとスマートにまとまるんだと思いますが、不慣れなのでこんな感じになってしまった。

作成

phpとpluginの作成になります。

phpの改修
単純に空だが今は確認用に文字列を出している

旧:index.php
[php] if (strlen($_SERVER[‘QUERY_STRING’]) > 500) {exit;};
$xml_data =’
.’
~
.’
‘;
$ch = curl_init($URL);
~
$output = curl_exec($ch);
curl_close($ch);
[/php]  ※〜は記述を省略してます

新:index_new.php
[php]
[/php]

plugin作成
rubyはよくわかってないが既存のpluginを参考にすればさくっと出来ると思ってたけど、
思ったより時間がかかってしまった。。。

out_xml.rb
[rb] class Fluent::XmlOutput < Fluent::Output
Fluent::Plugin.register_output(‘xmlout’, self)
 →プラグイン設定

def initialize
super
require File.dirname(FILE) + ‘/lib/common_hbasepost’
 ~
  →サービス毎用意
end

config_param :slave_server, :string
config_param :slave_port, :string
  →設定ファイルのデータを使用 HbaseRestが稼働しているホスト名とそのポート

def emit(tag, es, chain)
es.each do |time, record|

chain.next
end
  →ここでアクセスログのレコードからどのサービスなのかを確認してサービス毎のXMLを作成し、
   バックエンドに通知する。
[/rb]

common_hbasepost.rb ※抜粋
タイプは大きく分けると2パターン
1.サービスは異なっても通知先のPHPが共通している
2.サービス間でURL形式に差がある
※2番がネックでいろいろ用意するハメになった。。。

内部の処理は簡単に以下

  • 初期化
  • クエリパース
  • XML作成
  • XML通知

確認

確認方法としてはいくつかURLパターンを抜粋して新旧で実行し、
DB上のデータに差異がないことを確認した。

データフロー(サンプル)
1〜4の流れで4番のデータを新旧で差分確認。
 ※timestampに関しては実行時間で違いがでるので大きくずれがなければ問題ないとした

1.実行URL
http://www.test.com/?k=20150524200644603qtcpaOL5ZyADgWuSu&f=data&c=employ_number&v=2&t=asplog&tmp=1432675386977

2.アクセスログ
[shell] access_time:2015-06-12T04:37:19+00:00 remote_addr:122.216.203.130 request_method:GET request_length:523 request_uri:/?k=20150524200644603qtcpaOL5ZyADgWuSu&f=data&c=employ_number&v=2&t=asplog&tmp=1432675386977 https: status:200 bytes_sent:254 body_bytes_sent:31 referer:http://192.168.33.10/ useragent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36 forwardedfor:- request_time:0.024 upstream_response_time:0.024
[/shell]

3.通知XML
[xml] MjAxNS0wNi0xMiAwNDozNzoxOQ==Mg==
[/xml]

4.実際のデータ
[shell] ROW COLUMN+CELL
20150524200644603qtcpaOL5ZyADgWuSu column=data:edited_at, timestamp=1434083839117, value=2015-06-12 04-37-19
20150524200644603qtcpaOL5ZyADgWuSu column=data:employ_number, timestamp=1434083839117, value=2
[/shell]

この流れをサービス毎、URLタイプごと抜粋データで確認した。

まとめ

内部向けっぽくなったけど、残すことは大事かなと思いました。
また、メインの処理はclassにしたのでテストも用意できそうだし、結果としては悪くなかったかもしれないです。

データの性質上、本番のデータを拝借しても問題ないと思うので、
並行稼動っぽい感じにしてデータ差異が無いことを確認したら切り替えていこうかなと思ってます。

ソフトバンク・au・ドコモの方は、公式のオンラインショップを利用すれば頭金不要で通常のショップよりお得に購入できます。

【週刊bitWave】(メルマガ)始めました!

登録はこちらからメールアドレスを入力してお申込みください。

ご登録いただいたメールアドレスは 【週刊bitWave】の更新情報の配信にのみ使用します。

個人情報の取扱いに関しては、「プライバシーポリシー」をご確認ください。解除はいつでもこちらから行うことが可能です。

あなたにおすすめ