Amazon EC2にmroongaをインストールしてみた

※試行錯誤の過程も載せていますのでやり方だけ知りたい人は適当に飛ばし読みして頂ければと。

全文検索の検証のためにMySQLとgroongaをいじろうかな思ったのだが、試行錯誤するのにすぐに捨てられる環境がいいなということでAmazon EC2の無料枠のマイクロインスタンスに入れてみた。

まず、MySQL+groongaということでmroongaのインストールガイドを参照。
Amazon LinuxだけれどCentOS6と同じ感じじゃね?」ってことでそのあたり見てみた。
http://mroonga.github.io/ja/docs/install.html#centos-6

書かれているのは以下のような感じ。

% sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
% sudo yum makecache
% sudo yum install -y mysql-server
% sudo service mysqld start
% sudo yum install -y mysql-mroonga
(% /usr/bin/mysqladmin -u root password 'new-password')

じゃあ、その通りにやってみましょうと上からバシバシ実行しようと思ったら「sudo yum makecache」の段階でエラー。

% sudo yum makecache
Loaded plugins: priorities, security, update-motd, upgrade-helper
amzn-main                                                                                        | 2.1 kB     00:00
amzn-updates                                                                                     | 2.3 kB     00:00
http://packages.groonga.org/centos/latest/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404 Not Found"
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: groonga. Please verify its path and try again

「そんなURL無いよ」って怒られてるね。実際にブラウザでみても出てきません。
本当は「latest」が「5」とか「6」とかになってほしい。

% cat /etc/yum.repos.d/groonga.repo
[groonga]
name= for CentOS $releasever - $basearch
baseurl=http://packages.groonga.org/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-groonga

まあ、変数「releasever」が「latest」になってるよねってことでさらに以下。

% grep 'releasever=' /etc/yum.conf
releasever=latest

確かにそんなかんじー。
「/etc/yum.conf」をいじると他のAWS用のリポジトリにも影響があるのでgroonga用のだけいじることにする。

% sudo vi /etc/yum.repos.d/groonga.repo
...
#baseurl=http://packages.groonga.org/centos/$releasever/$basearch/
baseurl=http://packages.groonga.org/centos/6/$basearch/
...

明示的に「6」って書いちゃった。
再度チャレンジしてみたらイケたようなので鼻歌まじりにそのままバシバシ叩いていく。

% sudo yum makecache
% sudo yum install -y mysql-server
% sudo service mysqld start
% sudo yum install -y mysql-mroonga

今度は「mysql-mroonga」で怒られた。

% sudo yum install -y mysql-mroonga
...
Error: Package: mysql-mroonga-3.02-0.el6.x86_64 (groonga)
           Requires: mysql-server = 5.1.67-1.el6_3
           Installed: mysql-server-5.5-1.3.amzn1.noarch (@amzn-main)
               mysql-server = 5.5-1.3.amzn1
           Installed: mysql55-server-5.5.30-1.31.amzn1.x86_64 (@amzn-main)
               mysql-server = 5.5.30-1.31.amzn1
           Available: mysql51-server-5.1.67-1.61.amzn1.x86_64 (amzn-main)
               mysql-server = 5.1.67-1.61.amzn1
Error: Package: mysql-mroonga-3.02-0.el6.x86_64 (groonga)
           Requires: mysql = 5.1.67-1.el6_3
           Installed: mysql55-5.5.30-1.31.amzn1.x86_64 (@amzn-main)
               mysql = 5.5.30-1.31.amzn1
           Available: mysql-5.5-1.3.amzn1.noarch (amzn-main)
               mysql = 5.5-1.3.amzn1
           Available: mysql51-5.1.67-1.61.amzn1.x86_64 (amzn-main)
               mysql = 5.1.67-1.61.amzn1
...

MySQLバージョンが違いますよと。
以下のドキュメントによると、シレっとインストールできた後で「動かない!」ってなるのを回避するために「mroonga 2.09以降」はバージョンを厳密にチェックするようになったらしい。
mroongaインストール時のMySQLとのバージョン不一致に対処する方法

じゃあ、Amazonが自分のリポジトリで用意してるのはどれかしらと確認したところ、5.1.67はあるご様子。

% yum list | grep mysql
...
mysql-server.noarch                    5.5-1.3.amzn1                amzn-main
...
mysql51-server.x86_64                  5.1.67-1.61.amzn1            @amzn-main
...
mysql55-server.x86_64                  5.5.30-1.31.amzn1            amzn-main
...

じゃあ、MySQLを一回止めて消してからmysql51を入れますかね。

% sudo service mysqld stop
% sudo yum remove 'mysql*'
% sudo yum install -y mysql51-server
% sudo service mysqld start
% sudo yum install -y mysql-mroonga
...
Error: Package: mysql-mroonga-3.02-0.el6.x86_64 (groonga)
           Requires: mysql = 5.1.67-1.el6_3
           Installed: mysql51-5.1.67-1.61.amzn1.x86_64 (@amzn-main)
               mysql = 5.1.67-1.61.amzn1
           Available: mysql-5.5-1.3.amzn1.noarch (amzn-main)
               mysql = 5.5-1.3.amzn1
           Available: mysql55-5.5.30-1.31.amzn1.x86_64 (amzn-main)
               mysql = 5.5.30-1.31.amzn1
Error: Package: mysql-mroonga-3.02-0.el6.x86_64 (groonga)
           Requires: mysql-server = 5.1.67-1.el6_3
           Installed: mysql51-server-5.1.67-1.61.amzn1.x86_64 (@amzn-main)
               mysql-server = 5.1.67-1.61.amzn1
           Available: mysql-server-5.5-1.3.amzn1.noarch (amzn-main)
               mysql-server = 5.5-1.3.amzn1
           Available: mysql55-server-5.5.30-1.31.amzn1.x86_64 (amzn-main)
               mysql-server = 5.5.30-1.31.amzn1
...

また怒られた!
確かにRequiresは「5.1.67」とかじゃなくて「5.1.67-1.el6_3」だからきっちりあってない!
じゃあ、CentOS6のBaseのリポジトリから直接取らないとダメかなということで以下を参照したけど、あれ、「5.1.66」までしかない。
http://ftp.riken.jp/Linux/caos/centos/6/os/x86_64/

っていうことでtwitterで愚痴ってみた。

AWS EC2にmroonga入れようとしたら「Requires: mysql = 5.1.67-1.el6_3」「Installed: mysql51-5.1.67-1.61.amzn1.x86_64 ([@]amzn-main)」って怒られた。厳密すぎるー。 @groonga

https://twitter.com/t_yamo/status/322552844500729856

CentOS6のリポジトリ指すようにしてみたけど、そもそもCentOS6のリポジトリは「5.1.66-2.el6_3」(not 67)なのか。RPM取ってくるか、ビルドするかしないとダメなのかしら。 #groonga #mroonga

https://twitter.com/t_yamo/status/322554586583932928

速攻で反応が。

@t_yamo amazon linuxMySQLはパッチが当たっていて、たとえバージョンが揃っていてもhttp://packages.groonga.org で配布しているRPMとは一緒に使えないので注意してください!参考: http://spring-mt.tumblr.com/post/41102075277/remi-mysql-mroonga

https://twitter.com/ktou/status/322559370816811008

@t_yamo updatesの方で更新されているのです! http://mirror.centos.org/centos/6/updates/x86_64/Packages/ … にはmysql-server-5.1.67-1.el6_3.x86_64.rpmがあります。

https://twitter.com/ktou/status/322558659991326720

なるへそ。すみません。ふしあなさんでした。
まず、さっきのMySQLを止めて取り除きましょう。

% sudo service mysqld stop
% sudo yum remove 'mysql*'

そしてUpdates用のリポジトリの設定を追加する。
Amazonから元から入っている人(「/etc/yum.repos.d/amzn-main.repo」とか)はpriorityが10ぐらいになってるのでそれよりも高く設定(=小さい値を設定)。普段は使わず、明示的に「--enablerepo」オプションをつけたときだけ有効になるよう「enabled」は「0」に設定。「releasever」も「6」固定にした。
「gpgcheck」も有効にするために明示的に「RPM-GPG-KEY-CentOS-6」を取得しておく。

% sudo wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 http://ftp.riken.jp/Linux/caos/centos/6/os/x86_64/RPM-GPG-KEY-CentOS-6
% sudo vi /etc/yum.repos.d/orig-centos-updates.repo
[orig_centos_updates]
name=Original-CentOS-6 - Updates
baseurl=http://ftp.riken.jp/Linux/caos/centos/6/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=1
enabled=0

さて、試してみましょう。

% sudo yum --enablerepo=orig_centos_updates install -y mysql-server
% sudo service mysqld start
% sudo yum install -y mysql-mroonga

イケました。
ちゃんと入っているか見てみましょう。確認の仕方は以下に記載。
http://mroonga.github.io/ja/docs/userguide.html#how-to-check-the-installation

% mysql -uroot test
mysql> SHOW ENGINES;
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                    | Transactions | XA   | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| mroonga    | YES     | CJK-ready fulltext search, column store                    | NO           | NO   | NO         |
| MRG_MYISAM | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |
| CSV        | YES     | CSV storage engine                                         | NO           | NO   | NO         |
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
6 rows in set (0.00 sec)

「mroonga」がEngineとして表示されてる。
めでたくインストールまで行けたっぽいです。ありがとう、ありがとう。

インストール時の注意

インストール手順では「mysql-server」をインストールしてからMySQLを起動し、その後「mysql-mroonga」をインストールしている。
mysql-mroonga」インストール時に依存関係のある「mysql-server」も入るからいっぺんにやってもいいよねって進んじゃうとインストールはされるものの「SHOW ENGINES;」の段階で「mroonga」が出てこない。
っていうか、「mysql-mroonga」インストール時に以下のメッセージが出てくる。

/usr/bin/mysql -u root -e " 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'; "
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
run the following command to register mroonga:
  /usr/bin/mysql -u root -e "
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';
"

mysql-mroonga」インストール時にMySQLにつないでEngineとして「mroonga」を登録してくれるので、手を抜いた人は自分でやってねということらしい。素直に手順通りにインストールした方が吉。