クラウドインフラ構築記

現在AWSの構築支援に携わっております。今注視しているのは、GKE、BigQuery、Google Dataflowなどサービスを展開しているGoolge Cloud Platformです。

nginxのアクセスログをGoogle BigQueryに送信してみました。 #gcpja

GCP Advent Calendar 12/20のエントリ記事になります。LB + Autoscalerを書こうとしましたが、詳細に解説しているページがありましたので、HPCの基盤技術としてつけるBigQueryについて書きます。LB+AutoScalerについては以下で詳細にか書かれています。

http://qiita.com/soundTricker/items/951a02266a5c95165863

nginxのアクセスログの出力項目を変更します。time、hostがBigQueryのスキーマの項目に一致します。

     log_format  ltsv  'time:$time_iso8601\t'
                        'host:$remote_addr\t'
                        'uri:$request_uri\t'
                        'method:$request_method\t'
                        'forwardfor:$http_x_forwarded_for\t'
                        'request:$request\t'
                        'status:$status\t'
                        'size:$body_bytes_sent\t'
                        'referer:$http_referer\t'
                       'ua:$http_user_agent\t'
                        'reqtime:$request_time\t'
                       'upsttime:$upstream_response_time\t'

APIと認証→認証情報から、新しいクライアントIDを作成します。*.p12用のパスフレーズも表示されますので、控えておきます。下記作業では使用しませんが。

画像2

作成後、*.p12ファイルが作成されますので、サーバーの/etc/td-agentにアップロードします。

Fluentd pluginを導入します。

/usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-bigquery
/usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-forest

BigQuery用スキーマファイルを作成します。

[
  { "name": "time",    "type": "timestamp" },
  { "name": "size",  "type": "integer"  },
  { "name": "reqsize",    "type": "integer"  },
  { "name": "status",    "type": "integer"  },
  { "name": "host",  "type": "string"  },
  { "name": "uri",    "type": "string"  },
  { "name": "method",    "type": "string" },
  { "name": "ua",    "type": "string" },
  { "name": "vhost", "type": "string" },
  { "name": "reqtime",   "type": "float" },
  { "name": "apptime",  "type": "float"}
]

作成したスキーマファイルを使って、スキーマを作成します。

bq mk -t project_id:nginx_datasheet.access_log schema.json

S3にログを転送しつつ、BigQueryに送信するために、fluent-plugin-forestプラグインを使っています。

  type tail
  path /var/log/nginx/totalsolution.biz.access.log
  format ltsv
  time_key time_local
  time_format %d/%b/%Y:%T %z
  pos_file /var/tmp/nginx_access_log.pos
  tag nginx.access

# Output

  type forest
  subtype copy

      type s3

      s3_bucket XXXXXXXXXXXXXXXXXXX
      s3_region ap-northeast-1
      s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}
      path logs/
      buffer_path /var/log/fluent/

     time_slice_format %Y/%m/%d/
     flush_interval 10m
     utc

      type bigquery
      method insert

      auth_method private_key
      email XXXXXXXXXXXXXXXX@developer.gserviceacco
unt.com
      private_key_path /etc/td-agent/my-cloud-environment-879d7473d230.p12

      project skillful-fx-531
      dataset nginx_datasheet
      table access_log
      buffer_chunk_records_limit 500
      buffer_chunk_limit 1000000
      buffer_queue_limit           5000
      flush_interval               1
      try_flush_interval           0.05
      num_threads                  4
      queued_chunk_flush_interval  0.01
      time_format %s
      time_field time
      schema_path /etc/td-agent/schema.json

画像3

 

Google BigQuery 機能 Redshift
95円/月
Wikipedia3億行
価格 \90,000
ストリーミング  不可
 Tableau  BI  Tableau

価格的にGoogle BigQueryが優位な結果に。

時たま500エラーがでるようだが。

 tabledata.insertAll API project_id="skillful-fx-531" dataset="nginx_datasheet" table="access_log" code=500 message="Unexpected. Please try again."
 [warn]: retry succeeded. instance=70122832844240

確かに、サーバーエラー(500)が起きている。考えられることはBigQueryのLimit、ネットワークがあるが。

screencapture-console-developers-google-com-project-skillful-fx-531-apiui-apiview-bigquery

コメントは受け付けていません。