MySQLパーティションの操作をGem化しました

こんにちは、STROBELIGHTSユニットの安藤です。
最近は広告運用ツールの開発・運用をやっていて、 業務の中で改善したいことがあり、Gemを作って公開しました。
先にどんなものを作ったかというと
MySQLのパーティションの操作をRubyから実行できるようにしました。 github.com 使い方はこんな感じです。

class DailyReport < ActiveRecord::Base
  include SimpleMySQLPartitioning
  partitioning_by :day, type: :range
end
partitions = [
  ['p201808', '2018-09-01']
]
# パーティション追加 
DailyReport.partition.add(partitions)

追加以外に、再構成、削除メソッドなどがあります。

背景

作るに至った経緯

  • 複数のプロジェクトでのパーティション利用率が高い
  • プロジェクトごとに似たコードが存在している
  • どうせならGem化して公開してみたい

STROBELIGHTSでは、広告のプラットフォームごとに運用支援ツールを開発しており、 業務の中でレポートの集計テーブルを構築する機会があります。
ID, 日付を複合主キーに設定、パーティションを作成し、定期的にパーティションの再構成を実行する流れを組んでいます。

下記はほんの一部ですが、こんな感じのコードをlib以下に実装、executeメソッドに渡してResqueなどで、定期的にパーティションの追加(再構成)をしているイメージです。

# example
"ALTER TABLE #{table_name} REORGANIZE PARTITION #{reorganize_partition} INTO (
  PARTITION #{partition_1} VALUES LESS THAN ('#{value1}'),
  ...,
  PARTITION #{reorganize_partition} VALUES LESS THAN #{max_value}
);"

複数プロジェクトでこの生SQLがあること自体、スマートじゃないなと思っていて、 むしろ、外だししたいと思ってました。

ソースコードの管理場所

個人のGitHubにしましたが(笑)、最初に管理方法をどうすべきか候補を出した上で、相談して決めました。

  1. 会社管理のGitHub NameSpace以下
  2. 社内のGitLab
  3. gem server立てる
  4. 個人のGitHub

1.は認証キーの管理上、却下

# Gemfile
gem 'test_gem', git: 'https://user_name:認証キー@github.com:hogehoge/testgem.git', branch: 'master'

2.は開発環境でbundle packageを使い、本番環境でbundle install --local

3.は他の部署でもGem作ったりしているならありかなと思いましたが、今回は見送り。

結論

会社特有のビジネスロジックがあれば、2でそれがなく、他でも使えそうな内容であれば個人GitHubでRubyGemsに公開する方向にしました。
個人でのGitHubが一番楽です。

感想

複数プロジェクトでのパーティション追加の記述がなくなり、スッキリしました。
またREADMEのテンプレートを自動生成してくれたり、色々と手軽にGem公開できる仕組みが素晴らしいと感じました。

現状、レンジパーティションのみの対応で今後のUpdateは要検討です。
もし良かったら使ってみて下さい。 issueなども歓迎です。