このエントリーはMySQL Casual Advent Calendar 2013 11日目の記事です。2011年のAdvent CalendarはQ4Mの導入方法を書いたので、今回はmroongaを書きます。

DSC01197.jpg

lestrratさんのエントリにもありますが、某サービスの検索システムをmroongaに置き換えるってのを準備しています。今のところメモリ64GB/ioDriveなマシンに、本番で想定している倍の量の9000万件/台の記事データをストレージモードで突っ込んでいますが、遅くても0.5秒ぐらいで検索結果が得られるのでなかなか上々です。

mroongaを導入している環境は、CentOS6系でMySQLは5.6系を使っています。MySQLはOracle公式rpmです。mroongaの公式サイトで配布しているrpmはOS付属のMySQLのバージョンに合わせたrpmなので、Oracle公式rpmを使いたい場合、別途ビルドが必要になります。rpmは以下の素晴らしい記事を参考に作りました。

第8回 CentOS6でのRPMパッケージを用いた MySQL 5.6 & mroonga & PHP 5.4 環境の作り方:隔週連載groonga|gihyo.jp … 技術評論社

Vagrant provisionerによるrpmの作成手順の自動化

mroonga+MySQL5.6系の運用を考えた時に、ソフトウェアのアップデート方法をあらかじめ考えておくのが大事かなど考えています。MySQL5.6系はまだエキサイティングな変更履歴が並びますし、groongaは毎月アップデートされるので、アップグレードを今までのMySQLの運用と比べて頻繁に行う必要が出てくるかもしれません。うちでは今のところMHAと組み合わせて運用するつもり。

mroongaのrpm作成は、上記の丁寧な説明を見ながらやれば出来ると思いますが、ビルドに使う環境の準備やSpecファイルの編集など若干の慣れが必要であることも否めません。そこでディスポーザブルな環境の構築とビルドの自動化をVagrantとVagrantのprovionerを使ってやってみました。

Vagrantfileとprovisionに使うシェルはこちら

https://github.com/kazeburo/buildmysqlmroonga_rpm

Vagrant 1.3系 + Virtualbox で検証してます。

使い方

vagrant upするだけで、必要なrpm/srpmを落として来てビルドします。完了すると、rpms-日付というディレクトリができ、中にインストールに使うrpm一式が入っています。

$ git clone https://github.com/kazeburo/build_mysql_mroonga_rpm.git
$ vagrant up
$ ls -l rpms-xxxxxxxxxxxx
MySQL-client-5.6.15-1.el6.x86_64.rpm
MySQL-devel-5.6.15-1.el6.x86_64.rpm
MySQL-server-5.6.15-1.el6.x86_64.rpm
MySQL-shared-5.6.15-1.el6.x86_64.rpm
MySQL-shared-compat-5.6.15-1.el6.x86_64.rpm
groonga-devel-3.1.0-1.el6.x86_64.rpm
groonga-libs-3.1.0-1.el6.x86_64.rpm
groonga-normalizer-mysql-1.0.5-1.el6.x86_64.rpm
groonga-normalizer-mysql-devel-1.0.5-1.el6.x86_64.rpm
groonga-tokenizer-mecab-3.1.0-1.el6.x86_64.rpm
mecab-0.996-1.el6.x86_64.rpm
mecab-devel-0.996-1.el6.x86_64.rpm
mecab-ipadic-2.7.0.20070801-7.el6.1.x86_64.rpm
mysql56-mroonga-3.10-1.el6.x86_64.rpm
mysql56-mroonga-doc-3.10-1.el6.x86_64.rpm
$ vagrant destroy

使った仮想マシンは捨ててしまってもOKです。ディスポーザブル!

バージョンが上がった場合は、provision.shを編集してください。

あとは、出来たrpmをサーバに転送してインストールします。

$ rpm -Uvh MySQL-shared-compat*.rpm
$ rpm -Uvh MySQL-client-5*.rpm MySQL-devel-5*.rpm \
   MySQL-server-5*.rpm MySQL-shared-5*.rpm
# パスワードの設定とmysqlの起動
$ rpm -Uvh groonga*.rpm mecab*.rpm mysql56-mroonga*.rpm

mysqlにパスワードがかかっていたり、インストール時にmysqlが起動していない場合は、利用開始前に

DELETE IGNORE FROM mysql.plugin WHERE name = 'mroonga';
INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so';
CREATE FUNCTION last_insert_grn_id RETURNS INTEGER SONAME 'ha_mroonga.so';
CREATE FUNCTION mroonga_snippet RETURNS STRING SONAME 'ha_mroonga.so';
CREATE FUNCTION mroonga_command RETURNS STRING SONAME 'ha_mroonga.so';

このクエリを実行してください。

githubのrepositoryにmy.cnfも同梱してますので参考にどうぞ。

おまけですが、メモリの容量を超えるインデックスを作る場合、sysctl.confに以下を追加すると良いでしょう

vm.overcommit_memory = 1
vm.max_map_count = 1000000

まとめ的な

某サービスの検索システムの入れ替えが出来たら、はまったところとかデータの持ち方などを詳しく書きたいなと思ってます。あと、Vagrant/dockerを使ったdisposableな汎用的rpmbuild環境についてはもうちょっと考えて行きたい所存です

MySQL Casual Advent Calendar 2013、明日は@mirakuiさんです

このブログ記事について

このページは、Masahiro Naganoが2013年12月11日 11:21に書いたブログ記事です。

ひとつ前のブログ記事は「4歳の息子と0歳の娘がいる父親がおすすめの絵本を書いてみた」です。

次のブログ記事は「memcached おすすめ起動オプションまとめ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja