2010/11/29

DECOLOGでのMySQL Archiveエンジンの使い方


こんにちわ、stoneです。

今回は、MySQLのストレージエンジンの中の1つ、ArchiveエンジンのDECOLOGでの使い方をご紹介したいと思います。
※「DECOLOGでのMySQL BlackHoleエンジンの使い方」も合わせてどうぞ

Archiveエンジンの概要

MySQLのマニュアルをご覧いただくのが正確なのですが、その特徴を簡単にまとめると。。。。
  • insert/selectは出来るが、update/deleteは出来ない
  • order byはサポートされない
  • blobもサポートされない
  • データは圧縮されてディスクに保存される

まぁ、最初にこのマニュアルを読んだときの、正直な感想は、
「どうやって使うんだ、これ?」
って感じでした。
deleteが出来ないので、データは溜まる一方だし、データは圧縮して保存されているので、selectもそんなに速くないことは容易に想像できます。


アクションログ

DECOLOGでは、ユーザーのアクティビティの統計を取るため、action_logというデータを取っています。
create table action_log (
  action_name varchar(16),
  blog_id     int unsigned,
  param       varchar(64),
  reg_date    datetime
) engine=archive;
action_nameには、例えば、"entry"(記事の投稿)、"comment"(記事へのコメント)等が入ります。このaction_logは、日次で集計を行っています。


テーブルのスワッピング

で、archiveエンジンの運用をどうするのかというと、上記のアクションログの場合、集計の前に、以下の様なSQLを発行します。
drop table if exists action_log_yesterday;
create table action_log_new like action_log;
alter table action_log rename to action_log_yesterday;
alter table action_log_new rename to action_log;
つまり、
  • action_log_yesterdayをドロップ
  • action_log_newテーブルを作成
  • 既存のaction_logをaction_log_yesterdayにリネーム
  • action_log_newをaction_logにリネーム
こうすることで、ほぼ瞬間的に(1秒以下)で、action_logの切り替えが完了します。ユーザーのアクティビティは、引き続き、新しく作成した空のaction_logに蓄積されます。


データの集計

集計したいデータは、action_log_yesterdayに保存されています。このテーブルは、ユーザーからのアクセスから解放されているので、ゆっくり集計することができます。
select action_name, blog_id, param from action_log_yesterday
と、action_log_yesterdayを全件selectして、結果をタブ区切りで、ファイルに出力します。ファイルの出力されたデータは、HDFSに乗せてHadoopで、集計をしています。
(Hadoopでの集計の一例は、以前の記事、HadoopによるApacheのログ解析の実際で紹介しています)

サーバーの運用

DECOLOGでArchiveエンジンを使用してるデータには、以下のような共通点があります。
  • ユーザーのアクセスで、selectが発生しない
  • かなり頻繁にinsertが発生する
  • 集計は、daily、もしくは、hourlyで行えば十分
  • 集計された値は、内部で使用する値


また、DECOLOGでは、Archiveエンジンで、4つのデータを運用していて、かなりの頻度でアクセス(insert)があるため、サーバーは7台用意して、LVS(keepalived)により負荷分散させています。


実は。。。。。。。。。。
ここまで、書いておいてなんなんですが、最近、hiroshiが中心となって、archiveエンジンを使用しているデータを順次redisに移行していってます。そのうち、彼がレポートを書いてくれるでしょう。(笑)


次回は、daemontoolsを利用した運用をいくつか紹介しようかと考えています。
では、また次回に♪