Multi-Master Replication Manager for MySQL をFreeBSDで使ってみた

Multi-Master Replication Manager for MySQLFreeBSDで使ってみた

公式サイト:http://mysql-mmm.org/

 基本的にはインストールガイドドキュメントに書いてあるようにすればよさそうなのですが、FreeBSDで動かすのがちょっと面倒だったのでメモ。

 使ったバージョンは2.1.0です。

lib/Agent/Agent.pm にパッチをあてる

 Unix::Uptimeを使うようになってるのだけど、おかしいような気がしたので修正。

diff -ur mysql-mmm-2.1.0/lib/Agent/Agent.pm mysql-mmm-2.1.0a/lib/Agent/Agent.pm
--- mysql-mmm-2.1.0/lib/Agent/Agent.pm	2010-02-19 00:49:25.000000000 +0900
+++ mysql-mmm-2.1.0a/lib/Agent/Agent.pm	2010-02-26 13:39:38.000000000 +0900
@@ -14,7 +14,7 @@
 eval {
     no warnings 'once';
     require Unix::Uptime;
-    *uptime = *Unix::Uptime->uptime;
+    *uptime = sub { Unix::Uptime->uptime };
 };
 if ($EVAL_ERROR) {
 	require MMM::Common::Uptime;

 こうしないとダメな気がするんだけど。気のせい?

Makefileとかも書き換える

 FreeBSDで標準的なパスにインストールするように修正。

(ただ、FreeBSDの標準的なパスがこれで合っているかは未確認)

diff -ur mysql-mmm-2.1.0/Makefile mysql-mmm-2.1.0a/Makefile
--- mysql-mmm-2.1.0/Makefile	2010-02-19 00:49:25.000000000 +0900
+++ mysql-mmm-2.1.0a/Makefile	2010-03-01 12:57:24.000000000 +0900
@@ -1,41 +1,42 @@
 
 ifndef INSTALLDIR
-INSTALLDIR = installvendorlib
+INSTALLDIR = sitelib
 endif
 
-MODULEDIR = $(DESTDIR)$(shell eval "`perl -V:${INSTALLDIR}`"; echo "$$${INSTALLDIR}")/MMM
-BINDIR    = $(DESTDIR)/usr/lib/mysql-mmm
-SBINDIR   = $(DESTDIR)/usr/sbin
-LOGDIR    = $(DESTDIR)/var/log/mysql-mmm
-ETCDIR    = $(DESTDIR)/etc
+MODULEDIR = $(shell eval "`perl -V:${INSTALLDIR}`"; echo "$$${INSTALLDIR}")/MMM
+BINDIR    = /usr/local/libexec/mysql-mmm
+SBINDIR   = /usr/local/sbin
+LOGDIR    = /var/log/mysql-mmm
+ETCDIR    = /usr/local/etc
 CONFDIR   = $(ETCDIR)/mysql-mmm
 
 install_common:
-		mkdir -p $(DESTDIR) $(MODULEDIR) $(BINDIR) $(SBINDIR) $(LOGDIR) $(ETCDIR) $(CONFDIR) $(ETCDIR)/init.d/
-		cp -r lib/Common/ $(MODULEDIR)
+		mkdir -p $(DESTDIR) $(MODULEDIR) $(BINDIR) $(SBINDIR) $(LOGDIR) $(ETCDIR) $(CONFDIR) $(ETCDIR)/rc.d/
+		cp -r lib/Common $(MODULEDIR)
 		[ -f $(CONFDIR)/mmm_common.conf ] || cp etc/mysql-mmm/mmm_common.conf $(ETCDIR)/mysql-mmm/
 
 install_agent: install_common
 		mkdir -p $(BINDIR)/agent/
-		cp -r lib/Agent/ $(MODULEDIR)
+		cp -r lib/Agent $(MODULEDIR)
 		cp -r bin/agent/* $(BINDIR)/agent/
-		cp -r etc/init.d/mysql-mmm-agent $(ETCDIR)/init.d/
+		cp -r etc/init.d/mysql-mmm-agent $(ETCDIR)/rc.d/
 		cp sbin/mmm_agentd $(SBINDIR)
 		[ -f $(CONFDIR)/mmm_agent.conf  ] || cp etc/mysql-mmm/mmm_agent.conf  $(ETCDIR)/mysql-mmm/
 
 install_monitor: install_common
 		mkdir -p $(BINDIR)/monitor/
-		cp -r lib/Monitor/ $(MODULEDIR)
+		cp -r lib/Monitor $(MODULEDIR)
 		cp -r bin/monitor/* $(BINDIR)/monitor/
-		cp -r etc/init.d/mysql-mmm-monitor $(ETCDIR)/init.d/
+		cp -r etc/init.d/mysql-mmm-monitor $(ETCDIR)/rc.d/
 		cp sbin/mmm_control sbin/mmm_mond $(SBINDIR)
 		[ -f $(CONFDIR)/mmm_mon.conf    ] || cp etc/mysql-mmm/mmm_mon.conf    $(ETCDIR)/mysql-mmm/
 
 install_tools: install_common
 		mkdir -p $(BINDIR)/tools/
-		cp -r lib/Tools/ $(MODULEDIR)
+		cp -r lib/Tools $(MODULEDIR)
 		cp -r bin/tools/* $(BINDIR)/tools/
 		cp sbin/mmm_backup sbin/mmm_clone sbin/mmm_restore $(SBINDIR)
 		[ -f $(CONFDIR)/mmm_tools.conf  ] || cp etc/mysql-mmm/mmm_tools.conf  $(ETCDIR)/mysql-mmm/
 
 install: install_agent install_monitor install_tools
+

 この変更で設定ファイルは /usr/lcoal/etc 以下に配置するようにしたので、設定ファイルを読み込んでいるところも修正する。

diff -ur mysql-mmm-2.1.0/lib/Common/Config.pm mysql-mmm-2.1.0a/lib/Common/Config.pm
--- mysql-mmm-2.1.0/lib/Common/Config.pm	2010-02-19 00:49:25.000000000 +0900
+++ mysql-mmm-2.1.0a/lib/Common/Config.pm	2010-02-26 13:40:03.000000000 +0900
@@ -245,7 +245,7 @@
 	my $file = shift;
 
 	$file .= '.conf' unless ($file =~ /\.conf$/);
-	my @paths = qw(/etc /etc/mmm /etc/mysql-mmm);
+	my @paths = qw(/etc /etc/mmm /etc/mysql-mmm /usr/local/etc/mysql-mmm);
 
 	my $fullname;
 	foreach my $path (@paths) {

 あと、gmakeが必要。いつも忘れる。

Perlのモジュールをインストールする、他

 基本的にはRequirememtsにあるモジュールを入れればいいのだけれど、(現時点で)列挙されていないモジュールとしては

がある(どちらもnodes向け)。

 あと、モニタリングホストで動かすperlはスレッドを有効にしてないといけないのがちょっと面倒だった。

設定ファイルの修正

 環境に合わせて修正するものなのであれですが、FreeBSDで使う場合の注意点としては

  • mmm_common.confやmmm_mon.confのbin_pathを修正する(上記のMakefileなら/usr/local/libexec/mysql-mmm)
  • mmm_common.confにあるcluster_interfaceはdefaultではなく各hostのところに書いたほうがよさそう

――あたりでしょうか。