あーかいぶすハイディフィニション

ここはもう更新しとらんのじゃ

MySQL Cluster 7.1.19 から 7.2.5 へアップデートしようとしたけど、結局新規インストールとかわんなかった

タイトルで言いたいことが大体伝わっちゃう系 RDBMSMySQL ちゃんです。

ことのはじまり

一つ前のエントリ「MySQL Cluster 環境で LIKE 検索が仕事してない」に書いたように、LIKE 検索で UTF-8 のマルチバイトカラムが検索結果に反映されてこないのが原因で、運用に入ってた MySQL Cluster 7.1.19 をアップデートしようとしたんじゃよ。

ロケ地:会社のサーバ(CentOS 6.2 64bit)

どーなった

30 Jan 2012 – 16.7.2.1. Changes in MySQL Cluster NDB 7.1.20 (5.1.61-ndb-7.1.20) (Not yet released)

ぐわああああああ!(悲鳴)
http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-news-5-1-61-ndb-7-1-20.html となっているので、その後リリースされた模様。

選択肢がなかったので、Fixed になってた 7.2.5 へアップデートすることに

MGMD + API が 2 台( Web 兼用 )と、 NDBD 2 台の計四台、レプリカ 2 で構成していたため、Slave -> Master の順で停止して片肺運転しながらアップデートを行うことに。
メリットとしては、バックアップを作成しなくても、NDBD がアップデート後立ち上がりさえすれば、データの同期を行える(はず)見通しがあったこと。データインポートから始めても良かったんだけど、12 時間以上かかる容量だったのでちょっと…てレベル。
デメリットは、そもそも正常にアップデートできるか不明だったこと。公式のドキュメント( en/5.5 )とか見たけど 7.1.x -> 7.2.x へのアップデートがどうなるか書いてなかった。最悪ゲストの再構築も覚悟してた。
※ちなみに各サーバの IP は以下のとおり

  • MGMD+API 1 台目:192.168.254.11
  • MGMD+API 2 台目:192.168.254.12
  • NDBD 1 台目:192.168.254.21
  • NDBD 2 台目:192.168.254.22
アップデートで利用するファイル郡

もともと動作している MySQL Cluster の各パッケージは RPM 経由でインストールしていたのですが、今回 7.1.19 から 7.2.5 へアップデートするにあたって、パッケージの構成が変わってました。

  • 7.1.19 の(多分必要な)パッケージ構成
  • 7.2.5 の(多分必要な)パッケージ構成

はいもうなんか違いますね!この時点で -Uvh でのアップデートの望み絶たれた!断ち切る!(GNしゃもじ)。ちなみに強行するとこんなんなります。

[root@mgmd-api2 ~]# rpm -Uvh MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64.rpm
準備中...                ########################################### [100%]
	ファイル /usr/bin/msql2mysql (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/bin/mysql (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/bin/mysql_find_rows (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/bin/mysql_waitpid (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/bin/mysqlaccess (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/bin/mysqladmin (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/bin/mysqlbinlog (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/bin/mysqlcheck (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/bin/mysqldump (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/bin/mysqlimport (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/bin/mysqlshow (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/bin/mysqlslap (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/msql2mysql.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/mysql.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/mysql_find_rows.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/mysql_waitpid.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/mysqlaccess.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/mysqladmin.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/mysqlbinlog.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/mysqlcheck.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/mysqldump.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/mysqlimport.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/mysqlshow.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
	ファイル /usr/share/man/man1/mysqlslap.1.gz (パッケージ MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64 から) は、パッケージ MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64 からのファイルと競合しています。
         /\
        ../  ./|
      ∴\/./
     _, ,_゚∵ |/
   (ノ゚Д゚)ノ
  /  /
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

足りない分のパッケージですが、MySQL-Cluster-server-gpl-7.2.5-1.el6.x86_64.rpm に、以下のパッケージがまとめて収録されるようになりました。

MySQL-Cluster-server
MySQL-Cluster-management
MySQL-Cluster-storage
MySQL-Cluster-extra
MySQL-Cluster-tools
MySQL :: Re: Are there few rpm files missing for mysql cluster 7.2 GA ?

ありがためいわく(バァン)。今まで NDBD には server を導入せずに storage だけ、API にはその逆、とかしてたんですが、結局 RPM を利用する限り、アップデートを考えると全部入れるしかないようですね。

結局なんとかなったんで、まず Slave の停止

まず、Slave 側の MGMD / API / NDBD を停止します。

[root@mgmd-api1 ~]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.254.11:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=3	@192.168.254.21  (mysql-5.1.56 ndb-7.1.19, Nodegroup: 0, Master)
id=4	@192.168.254.22  (mysql-5.1.56 ndb-7.1.19, Nodegroup: 0)

[ndb_mgmd(MGM)]	2 node(s)
id=1	@192.168.254.11  (mysql-5.1.56 ndb-7.1.19)
id=2	@192.168.254.12  (mysql-5.1.56 ndb-7.1.19)

[mysqld(API)]	2 node(s)
id=5	@192.168.254.11  (mysql-5.1.56 ndb-7.1.19)
id=6	@192.168.254.12  (mysql-5.1.56 ndb-7.1.19)

ndb_mgm> 2 stop
ndb_mgm> 4 stop
ndb_mgm> exit

 -> mgmd-api2 で mysqld(API) を止める

[root@mgmd-api2 ~]# /etc/init.d/mysql stop

 -> mgmd-api1 で、停止したか確認する

[root@mgmd-api1 ~]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.254.11:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=3	@192.168.254.21  (mysql-5.1.56 ndb-7.1.19, Nodegroup: 0, Master)
id=4	@192.168.254.22  (not connected)

[ndb_mgmd(MGM)]	2 node(s)
id=1	@192.168.254.11  (mysql-5.1.56 ndb-7.1.19)
id=2	@192.168.254.12  (not connected)

[mysqld(API)]	2 node(s)
id=5	@192.168.254.11  (mysql-5.1.56 ndb-7.1.19)
id=6	@192.168.254.12  (not connected)

not connected だったかどうかうろ覚えだけど、こんな感じになったらおk。したら Slave からアップデートします。

RPM の削除

インストールした各種 MySQL Cluster RPM 群と、mysql-libs の RPM を、アップデート予定のサーバから削除します。また、試してみればわかりますが無闇矢鱈と依存関係が強いので、すべて --nodeps を利用して依存関係を無視します。

[root@SERVER ~]# rpm -qa|grep MySQL*
 -> 出たパッケージを全部 rpm -e --nodeps で削除します。以下の様に、更にパイプで渡してもいいかもね。
 -> [root@SERVER ~]# rpm -qa | grep MySQL* | rpm -e --nodeps
[root@SERVER ~]# rpm -e --nodeps mysql-libs

ちなみに、僕の環境だと以下のようになりました。

※mgmd と api の削除
[root@mgmd-api2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-shared-7.1.19-1.el6.x86_64
[root@mgmd-api2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64
[root@mgmd-api2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-embedded-7.1.19-1.el6.x86_64
[root@mgmd-api2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-extra-7.1.19-1.el6.x86_64
[root@mgmd-api2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-tools-7.1.19-1.el6.x86_64
[root@mgmd-api2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-server-7.1.19-1.el6.x86_64
警告: /etc/logrotate.d/mysql は /etc/logrotate.d/mysql.rpmsave として保存されました。
[root@mgmd-api2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-devel-7.1.19-1.el6.x86_64
[root@mgmd-api2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-management-7.1.19-1.el6.x86_64
[root@mgmd-api2 ~]# rpm -e --nodeps mysql-libs

※ndbd の削除。
[root@ndbd2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-shared-7.1.19-1.el6.x86_64
[root@ndbd2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-client-7.1.19-1.el6.x86_64
[root@ndbd2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-embedded-7.1.19-1.el6.x86_64
[root@ndbd2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-extra-7.1.19-1.el6.x86_64
[root@ndbd2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-tools-7.1.19-1.el6.x86_64
[root@ndbd2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-server-7.1.19-1.el6.x86_64
[root@ndbd2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-devel-7.1.19-1.el6.x86_64
[root@ndbd2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-management-7.1.19-1.el6.x86_64
[root@ndbd2 ~]# rpm -e --nodeps MySQL-Cluster-gpl-storage-7.1.19-1.el6.x86_64
[root@ndbd2 ~]# rpm -e --nodeps mysql-libs
7.2.x 系からもう一つ必要なものがある

オリーブオイルのような。
RPM 入れる前に足りないって言われたのでとりあえず入れておきましょう。

[root@SERVER ~]# yum install libaio*
7.2.5 の RPM インストール

先にライブラリ系の RPM を入れておかないと、ライブラリが足りなくてインストール続行できない、のようなエラーが出るものがあるので、ライブラリ系だけ先に入れてから、残りをインストールします。

[root@SERVER ~]# rpm -ivh MySQL-Cluster-shared-compat-gpl-7.2.5-1.el6.x86_64.rpm
[root@SERVER ~]# rpm -ivh MySQL-Cluster-shared-gpl-7.2.5-1.el6.x86_64.rpm
[root@SERVER ~]# rpm -ivh MySQL-Cluster-devel-gpl-7.2.5-1.el6.x86_64.rpm
[root@SERVER ~]# rpm -ivh MySQL-Cluster-client-gpl-7.2.5-1.el6.x86_64.rpm
[root@SERVER ~]# rpm -ivh MySQL-Cluster-server-gpl-7.2.5-1.el6.x86_64.rpm
[root@SERVER ~]# rpm -ivh MySQL-Cluster-embedded-gpl-7.2.5-1.el6.x86_64.rpm

試してないけど、以下のように横着しても大丈夫だと思うよ!

[root@SERVER ~]# rpm -ivh MySQL-Cluster-shared*
[root@SERVER ~]# rpm -ivh MySQL-Cluster*
Master からデータを同期させる

これで、 ndbd / mgmd / api がインストールされるので、config.ini と my.cnf を配置しなおして再起動します。

[root@mgmd-api2 ~]# ndb_mgmd -f /var/lib/mysql-cluster/config.ini
[root@ndbd2 ~]# ndbd --initial
[root@mgmd-api2 ~]# /etc/init.d/mysql start
[root@mgmd-api2 ~]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.254.11:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=3	@192.168.254.21  (mysql-5.1.56 ndb-7.1.19, Nodegroup: 0, Master)
id=4	@192.168.254.22  (mysql-5.5.20 ndb-7.2.5, Nodegroup: 0)

[ndb_mgmd(MGM)]	2 node(s)
id=1	@192.168.254.11  (mysql-5.1.56 ndb-7.1.19)
id=2	@192.168.254.12  (mysql-5.5.20 ndb-7.2.5)

[mysqld(API)]	2 node(s)
id=5	@192.168.254.11  (mysql-5.1.56 ndb-7.1.19)
id=6	@192.168.254.12  (mysql-5.5.20 ndb-7.2.5)

ndb_mgm> 2 stop

やったーうごいたよー。
これはもう同期後の表示だけど、同期中は「id=4 @192.168.254.22 (mysql-5.5.20 ndb-7.2.5, Nodegroup: 0、Starting)」みたいになるはず。
無事に同期が終わったら、今度は Master 側を停止して同じ手順でアンインストール→インストール→同期、と行えばオッケー☆ウフフ☆。
もしどちらのノードが Master とか決まってなければそこで作業終了でいいですし、id 若いほうが Master なら、ndbd を一度止めてやれば移譲するので、もとにもどせます。

できたけどー

postfix とかちゃんとメールを送ってたので問題なさそうですが、正直どんな影響があるかわかんねーっす。稼働させてる環境はウェブアプリケーションRails 3.2 使ってて、ActiveRecord の中を直接書き換えて NDB Cluster Engine 対応させたりと、半端な理解で使ってる部分もあるので、もしかしたら今後何かあるかも……。
皆、メジャーバージョンアップするときは、なるべくクリーンな環境を心がけてね☆。