fluentd側でアクセスログをJson化してS3に配置、そのままRedshiftへコピーという流れを、便利なモジュールが担ってくれる楽ちん構成
やること:
1,)fluentdのインストール
2,)fluentdの各種plugin追加
3,)fluentdのconf作成
4,)fluentdの起動
5,)Redshift側のテーブル作成
6,)データの確認
----------------------------------------------------------------------------
1,)fluentdのインストール
-- リポジトリ追加
# vi /etc/yum.repos.d/td.repo
======================================================================
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
======================================================================
-- インストール
# yum install td-agent
======================================================================
Dependencies Resolved
====================================================================================================
Package Arch Version Repository Size
====================================================================================================
Installing:
td-agent x86_64 1.1.20-0 treasuredata 64 M
Installing for dependencies:
compat-libtermcap x86_64 2.0.8-49.2.amzn1 amzn-main 16 k
compat-readline5 x86_64 5.2-17.3.amzn1 amzn-main 156 k
openssl098e x86_64 0.9.8e-18.2.14.amzn1 amzn-updates 892 k
td-libyaml x86_64 0.1.4-1 treasuredata 126 k
Transaction Summary
====================================================================================================
Install 1 Package (+4 Dependent packages)
Total download size: 65 M
Installed size: 112 M
Is this ok [y/d/N]: y
======================================================================
2,)fluentdの各種plugin追加
-- モジュールの追加
# yum install postgresql9.x86_64 postgresql9-devel.x86_64
■前提として、redshift接続用のポスグレクライアントが必要っす
-- プラグインのインストール
# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-redshift
# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-jsonbucket
■gemコマンドではなくfluent-gemのコマンドであることに注意っす
■他に必要なpluginが有る場合は、ここでガシガシ追加
3,)fluentdのconf作成
# vi /etc/td-agent/td-agent.conf※<source>ディレクティブの正規表現について
■テンプレをちょいちょい変更して作成
====================================================================================================
## Input
<source>
type tail
path /var/log/httpd/shq_gree/access_log.%Y%m%d
format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<request_time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<status>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" (?<response_time>[^ ]*))?$/
time_format %d/%b/%Y:%H:%M:%S %z
pos_file /var/log/td-agent/tmp/apache.access.log.pos
tag apache.access
</source>
<match apache.access>
type jsonbucket
output_tag redshift.apache.access
json_key log
</match>
<match redshift.apache.access>
type redshift
# s3 (for copying data to redshift)
aws_key_id <youe_aws_key_id> #AWSキーをいれる
aws_sec_key <your_aws_sec_key> #シークレットキーを入れる
s3_bucket redshift #S3上のどのバケットにデータを配置するか
s3_endpoint <your_region_name> #リージョン一覧から、利用しているリージョンを入れる
path for_redshift/
timestamp_key_format %Y%m%d/%Y%m%d-%H%M #S3上にどういうパスでデータが配置したいかを指定
# redshift
redshift_host <your_redshift_end_point> #Redshiftの管理コンソールからエンドポイントを確認
redshift_port 5439 #Redshiftが使ってるポートを指定
redshift_dbname <your_db_name> #Redshiftでデータを投入するDB名
redshift_user <rs_user_name> #Redshiftのユーザ
redshift_password <rs_user_pass> #上記ユーザのパス
redshift_schemaname public #変更指定なければ、publicがデフォ
redshift_tablename access_log #データを投入するテーブル名
redshift_copy_base_options TIMEFORMAT 'auto' TRUNCATECOLUMNS COMPUPDATE ON #詳細はこの後
file_type json
# buffer
buffer_type file
buffer_path /var/log/td-agent/buffer/redshift #一時ファイルの置き場
flush_interval 10m #一時ファイルを何分間隔でflushしてS3→Redshiftにデータを送るか
buffer_chunk_limit 1g #一時ファイルのデータリミット指定
</match>
====================================================================================================
apacheログと正規表現を見比べつつ、正常にバッファファイルに出力されているかを確認しつつ
ポリシーを作っていく。
ここでのポイントは、データ内にTimestampを残したい場合、<time>の指定だと、fluentdでattribute
扱いになって、BODYにデータが入りません。
データを扱う上で、Timestampが残らないのは具合が悪いので、<request_time>という<time>以外のKey
を指定することで、BODY内にデータが入るようにしています。
下記サイトで正規表現の正否が確認できるので参考にどうぞ
http://fluentular.herokuapp.com/
※redshift_copy_base_optionsについて
Redshiftへデータを投入するCOPYコマンドにつけるオプションをここに書く
(gitのReadmeに書いてなくてすげー探した)
---- TIMEFORMAT 'auto'
Apacheログの場合、Timestampの出力が
[27/Aug/2014:00:00:00 +0900]
という形このまま突っ込んでも、Redshiftが持っているデフォルトの日付フォーマットに準拠していないため、nullが入ってしまう
それを回避するためにいれてるっす。
---- TRUNCATECOLUMNS
CLOMUNにデータを入れる際に文字数をオーバーするときにカットする
---- COMPUPDATE ON
データの圧縮をして容量の削減
CREATE TABLEする時に、データ圧縮を有効にしたうえでつかいませう
詳細はこちら
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_COPY.html
4,)fluentdの起動
-- コンフィグテスト
# /etc/init.d/td-agent configtest
-- スタート
# /etc/init.d/td-agent start
-- 自動起動設定
# chkconfig td-agent on
5,)Redshift側のテーブル作成
# psql -U <user> -W -h <redshift_end_point> -d <db_name> -p <port_num>
<db_name>=# \d access_log■こんなかんじで作るます
■CREATE TABLE で圧縮も使えるように設定しておく
====================================================================================================
Table "public.access_log"
Column | Type | Modifiers
---------------+-----------------------------+-----------------------------------------
host | character varying(15) | not null default '-'::character varying
user | character varying(255) | not null default '-'::character varying
request_time | timestamp without time zone | not null
method | character varying(10) | not null default '-'::character varying
path | character varying(65535) | not null
status | character varying(3) | not null default '-'::character varying
size | character varying(255) | not null default '0'::character varying
referer | character varying(65535) | not null default '-'::character varying
agent | character varying(255) | not null default '-'::character varying
response_time | character varying(255) | not null default '-'::character varying
====================================================================================================
6,)データの確認
# psql -U <user> -W -h <redshift_end_point> -d <db_name> -p <port_num>-------------------------
<db_name>=# select * from access_log;
host | user | request_time | method | path | status | size | refer
-----------------+-------+----------------------------+--------+----------------------+--------+-------+----------------------------------
111.222.111.222 | - | 27/Aug/2014:19:50:26 +0900 | GET | /index.html | 200 | 2145 | https://kirarin.taterole.co.jp/
■長いので途中できってます
おしまい
0 件のコメント:
コメントを投稿