まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:mariadb

IDCフロンティア様主催の MariaDB ミートアップに参加してきました。

MariaDB は MySQL 互換の RDB です。自分自身が作って運営しているマンホールマップねっぴツイートマッパーなど多くのサービスで MariaDB を採用しています。

このミートアップの中で現 Chief Evangelist の Colin さんから「MariaDB は IBM の Power8 プラットフォーム上で非常に高いパフォーマンスを発揮している」という紹介がありました。おそらくこの記事で紹介されていることだと思います:

MariaDB on Power8

ほー、そうなのか(知らなかったw)。ただ、実は以前に自分もこのようなブログエントリを書いたことがありました:
Power Linux 上で MariaDB をビルドして使う

これを書いた頃はまだ(後述の)PDP 環境で提供される RedHat のバージョンが 6 でした。RHEL 6 では標準 RDB が MySQL でしたが、RHEL 7 になって標準 RDB は MariaDB に変更になっているはずです。つまり「もうわざわざビルドしなくても Power Linux 上で MariaDB が使えるようになっているはず」です。

さっそく試してみます。環境としては IBM がビジネスパートナー様向けに無料で提供しているクラウドの Power 環境である PDP を使って Power8 + RedHat 7 環境を予約して使います。この辺りの詳しい手順はこちらを参照ください:
Power 版 RHEL(RedHat Enterprise Linux) を無料で2週間借りる(1/2)
Power 版 RHEL(RedHat Enterprise Linux) を無料で2週間借りる(2/2)


上記の (1/2) の手順でマシンリソースの予約を行い、(2/2) の手順で SSH でリモートアクセスして Power8 のリモート環境にログインします:
2015060907


念のため環境を確認します。まごうことなき Power 8 アーキテクチャ上の RedHat Enterprise Linux 7.1 です。:
2015060909


ではさっそくというか、いきなり MariaDB のインストールにとりかかります。リポジトリなどの準備なしでいきなり yum install を実行すると・・・
[root@sys-74413 ~]# yum install mariadb-server mariadb-client mariadb-devel
Loaded plugins: product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
No package mariadb-client available.
Resolving Dependencies
--> Running transaction check
---> Package mariadb-devel.ppc64le 1:5.5.41-2.ael7b will be installed
--> Processing Dependency: openssl-devel(ppc-64) for package: 1:mariadb-devel-5.5.41-2.ael7b.ppc64le
---> Package mariadb-server.ppc64le 1:5.5.41-2.ael7b will be installed
--> Processing Dependency: mariadb(ppc-64) = 1:5.5.41-2.ael7b for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: perl-DBI for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: perl-DBD-MySQL for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: perl(DBI) for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: libaio.so.1(LIBAIO_0.4)(64bit) for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: libaio.so.1(LIBAIO_0.1)(64bit) for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Processing Dependency: libaio.so.1()(64bit) for package: 1:mariadb-server-5.5.41-2.ael7b.ppc64le
--> Running transaction check
---> Package libaio.ppc64le 0:0.3.109-12.ael7b will be installed
---> Package mariadb.ppc64le 1:5.5.41-2.ael7b will be installed
---> Package openssl-devel.ppc64le 1:1.0.1e-42.ael7b will be installed
--> Processing Dependency: zlib-devel(ppc-64) for package: 1:openssl-devel-1.0.1e-42.ael7b.ppc64le
--> Processing Dependency: krb5-devel(ppc-64) for package: 1:openssl-devel-1.0.1e-42.ael7b.ppc64le
---> Package perl-DBD-MySQL.ppc64le 0:4.023-5.ael7b will be installed
---> Package perl-DBI.ppc64le 0:1.627-4.ael7b will be installed
--> Processing Dependency: perl(RPC::PlServer) >= 0.2001 for package: perl-DBI-1.627-4.ael7b.ppc64le
--> Processing Dependency: perl(RPC::PlClient) >= 0.2000 for package: perl-DBI-1.627-4.ael7b.ppc64le
--> Running transaction check
---> Package krb5-devel.ppc64le 0:1.12.2-14.ael7b will be installed
--> Processing Dependency: libverto-devel for package: krb5-devel-1.12.2-14.ael7b.ppc64le
--> Processing Dependency: libselinux-devel for package: krb5-devel-1.12.2-14.ael7b.ppc64le
--> Processing Dependency: libcom_err-devel for package: krb5-devel-1.12.2-14.ael7b.ppc64le
--> Processing Dependency: keyutils-libs-devel for package: krb5-devel-1.12.2-14.ael7b.ppc64le
---> Package perl-PlRPC.noarch 0:0.2020-14.ael7b will be installed
--> Processing Dependency: perl(Net::Daemon) >= 0.13 for package: perl-PlRPC-0.2020-14.ael7b.noarch
--> Processing Dependency: perl(Net::Daemon::Test) for package: perl-PlRPC-0.2020-14.ael7b.noarch
--> Processing Dependency: perl(Net::Daemon::Log) for package: perl-PlRPC-0.2020-14.ael7b.noarch
--> Processing Dependency: perl(Compress::Zlib) for package: perl-PlRPC-0.2020-14.ael7b.noarch
---> Package zlib-devel.ppc64le 0:1.2.7-14.ael7b will be installed
--> Running transaction check
---> Package keyutils-libs-devel.ppc64le 0:1.5.8-3.ael7b will be installed
---> Package libcom_err-devel.ppc64le 0:1.42.9-7.ael7b will be installed
---> Package libselinux-devel.ppc64le 0:2.2.2-6.ael7b will be installed
--> Processing Dependency: libsepol-devel >= 2.1.9-1 for package: libselinux-devel-2.2.2-6.ael7b.ppc64le
--> Processing Dependency: pkgconfig(libsepol) for package: libselinux-devel-2.2.2-6.ael7b.ppc64le
--> Processing Dependency: pkgconfig(libpcre) for package: libselinux-devel-2.2.2-6.ael7b.ppc64le
---> Package libverto-devel.ppc64le 0:0.2.5-4.ael7b will be installed
---> Package perl-IO-Compress.noarch 0:2.061-2.ael7b will be installed
--> Processing Dependency: perl(Compress::Raw::Zlib) >= 2.061 for package: perl-IO-Compress-2.061-2.ael7b.noarch
--> Processing Dependency: perl(Compress::Raw::Bzip2) >= 2.061 for package: perl-IO-Compress-2.061-2.ael7b.noarch
---> Package perl-Net-Daemon.noarch 0:0.48-5.ael7b will be installed
--> Running transaction check
---> Package libsepol-devel.ppc64le 0:2.1.9-3.ael7b will be installed
---> Package pcre-devel.ppc64le 0:8.32-14.ael7b will be installed
---> Package perl-Compress-Raw-Bzip2.ppc64le 0:2.061-3.ael7b will be installed
---> Package perl-Compress-Raw-Zlib.ppc64le 1:2.061-4.ael7b will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                     Arch        Version               Repository  Size
================================================================================
Installing:
 mariadb-devel               ppc64le     1:5.5.41-2.ael7b      server     747 k
 mariadb-server              ppc64le     1:5.5.41-2.ael7b      server      11 M
Installing for dependencies:
 keyutils-libs-devel         ppc64le     1.5.8-3.ael7b         server      37 k
 krb5-devel                  ppc64le     1.12.2-14.ael7b       server     640 k
 libaio                      ppc64le     0.3.109-12.ael7b      server      24 k
 libcom_err-devel            ppc64le     1.42.9-7.ael7b        server      30 k
 libselinux-devel            ppc64le     2.2.2-6.ael7b         server     174 k
 libsepol-devel              ppc64le     2.1.9-3.ael7b         server      71 k
 libverto-devel              ppc64le     0.2.5-4.ael7b         server      12 k
 mariadb                     ppc64le     1:5.5.41-2.ael7b      server     9.1 M
 openssl-devel               ppc64le     1:1.0.1e-42.ael7b     server     1.2 M
 pcre-devel                  ppc64le     8.32-14.ael7b         server     477 k
 perl-Compress-Raw-Bzip2     ppc64le     2.061-3.ael7b         server      33 k
 perl-Compress-Raw-Zlib      ppc64le     1:2.061-4.ael7b       server      58 k
 perl-DBD-MySQL              ppc64le     4.023-5.ael7b         server     140 k
 perl-DBI                    ppc64le     1.627-4.ael7b         server     802 k
 perl-IO-Compress            noarch      2.061-2.ael7b         server     260 k
 perl-Net-Daemon             noarch      0.48-5.ael7b          server      51 k
 perl-PlRPC                  noarch      0.2020-14.ael7b       server      36 k
 zlib-devel                  ppc64le     1.2.7-14.ael7b        server      50 k

Transaction Summary
================================================================================
Install  2 Packages (+18 Dependent packages)

Total download size: 24 M
Installed size: 124 M
Is this ok [y/d/N]: 

Power 用の RHEL7 でも、ちゃんと MariaDB が標準で使えるようになってました。これで "y" を指定すればインストールできちゃいます。

ただし、このコマンドで導入できるのは MariaDB 5.5 のようですね。MariaDB 10.x を使いたい場合はまだソースからビルドする必要がありそうです。その手順はこちらのエントリを参照してください:
Power Linux 上で MariaDB をビルドして使う

 

(特にクラウド環境で)MySQL データベースを使って運用している皆さん、データのバックアップはどうしてますか?

色々な目的や用途、制限の中で使っているので正解は1つではないと思っています。中には「初めからバックアップ込みの DBaaS サービスを使っている」という人もいるでしょう。コスト的に問題なければそれがベストかもしれません。

自分の場合、ある環境では cron で一日一回 mysqldump で取り出した内容を圧縮してそのままオブジェクトストレージに丸投げ、という方法を採用していたりします。オブジェクトストレージにダンプデータが残っていれば、そこからリストアできる、という考え方です。ケースバイケースではあるし、クラウド業者のオプションとかにも依存はしますが、オブジェクトストレージは手軽に使えて、比較的安価な割にデータポータビリティの高いデータストレージなので、コスパ的にもあっていました。これだけだとダンプにないデータやダンプ後に変更があったデータは救えませんが、そこまでシビアなデータ管理を要求されることもないデータベースであれば、手軽なこの方法はオススメでもあります。

一方、データが失われてからリストアするのにあまり長い時間かかることが許されないような場合や、救えないデータがあってはまずい場合はこの方法は向きません。データベースサーバーを多重化するなどして「最悪、1台死んでもいい」環境を構築することになります。


最近、自分の管理している環境下で MySQL データベース(正確には MariaDB だったけど)の Master-Slave レプリケーション環境を構築する機会がありました。その時の作業を記録しておきます。

まず前提条件として、以下のような環境を想定します:
- MySQL 5.x サーバーが1台稼働中。レプリケーション設定はしていない。
- MySQL サーバーを新たにもう1台追加して、Master-Slave の2台構成にする。
- 現在使っているサーバーを Master、新たに追加するサーバーを Slave とする。
- レプリケーションの対象とするデータベースの名前は mydb とする。

以下、順に説明します。現在稼働中の MySQL サーバーを「A」と呼ぶことにします。このサーバーが Master サーバーになります。また、新たに追加する MySQL サーバーを「B」と呼ぶことにして、このサーバーを Slave サーバーとして運用します:


1. Slave 用 MySQL サーバー環境の構築(B)

Slave サーバーとなる新しい MySQL サーバー環境を構築します。この辺りを参照してください:
CentOS に MySQL をインストール/セットアップする

Slave 側にも MySQL 環境が構築できたら、mysql コマンドでレプリケーションを行う先のデータベースを作成しておきます。UTF-8 指定などは環境に合わせて適当に:
mysql > create database mydb character set utf8;

2. レプリケーション用ユーザーの作成(A)

MySQL コマンドを使って Slave が Master のバイナリログを参照する際に接続するユーザーを作成します。
この例ではユーザー名 repl、パスワード password で、192.168.1.XXX/24 環境からの接続のみ許可されたユーザーとしています:
mysql > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.0/255.255.255.0' IDENTIFIED BY 'password';

3. Master 用の設定(A)

具体的には Master のバイナリロギングを有効にし、かつサーバーを識別するための ID を /etc/my.cnf 内に追加設定します(MariaDB の場合は /etc/my.cnf.d/server.cnf):
# vi /etc/my.cnf

[mysqld]
log-bin=mysql-bin
server-id=1001
ここまで設定したら MySQL サーバー(A)を再起動します。


4. レプリケーション用ユーザーの作成(B)

MySQL コマンドを使って Slave 内にデータを複製するユーザーを作成します。この例ではユーザー名 repl、パスワード password としています:
mysql > GRANT ALL PRIVILEGES ON *.* TO 'repl'@localhost IDENTIFIED BY 'password';

5. Slave 用の設定(B)

サーバーを識別するための ID を /etc/my.cnf 内に追加設定します(MariaDB の場合は /etc/my.cnf.d/server.cnf)。この ID はシステム全体でユニークにする必要があるため、3. で設定した内容とは異なるものにします:
# vi /etc/my.cnf

[mysqld]
log-bin=mysql-bin
server-id=1002
ここまで設定したら MySQL サーバー(B)を再起動します。


6. バイナリログ位置の確認(A)

Master 側サーバーの MySQL コマンドで以下を実行して、その結果をメモしておきます:
mysql > FLUSH TABLES WITH READ LOCK;

mysql > SHOW MASTER STATUS;

+----------------------+-----------+--------------+------------------+
| File                 | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+-----------+--------------+------------------+
| mysql-bin.000031     |       285 |              |                  |
+----------------------+-----------+--------------+------------------+
この結果の File がバイナリログ名、Position が現在位置です。これらの値は後に使います。

なお、"SHOW MASTER STATUS;" の実行結果が "Empty Set" と表示される場合は、File は ""(空文字)、Position は 4 とみなすことができるので、これらの値を後に使うことになります。

7. スナップショットの作成(A)

続いてこの状態のデータベースのスナップショットを取得します。6. で "FLUSH TABLES WITH READ LOCK" を実行しているのでデータベースにはロックがかかっています。この状態で別のコンソールやターミナルを使って以下のコマンドを実行します:
# mysqldump -u root -p mydb --lock-all-tables > mydbdump.db
これで指定した mydb データベースのダンプを mydbdump.db というファイルに取得することができます。取得後は再度もう一つのターミナルに戻って以下のコマンドを実行し、ロックを解除します:
mysql > UNLOCK TABLES;

8. スナップショットのコピー(AまたはB)

7. で取得したスナップショットファイルを(mydbdump.db)、Slave サーバーとなる B に転送します。SFTP などを使って A から B へ送ってもいいし、B から A に取りに行ってもいいし、全く別の方法でも構いません。スナップショットファイルが B のディスク内にあって、9 のコマンドが実行できさえすればいい、ということです。


9. スナップショットの展開(B)

7. で取得した Master のスナップショットを Slave である B の mydb データベースに展開します:
# mysql -u repl -p mydb < mydbdump.db

10. Master 情報登録(B)

続いて MySQL コマンドで Slave に Master の情報を登録します:
mysql > CHANGE MASTER TO
  MASTER_HOST='192.168.1.XXX',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='mysql-bin.000031',
  MASTER_LOG_POS=285;
なお、ここで指定する値ですが、MASTER_HOST は A のサーバー名(IPアドレス)、MASTER_USER は複製用(Aの)ユーザー、MASTER_PASS はそのパスワード、MASTER_LOG_FILE は 6. で取得した File の値、MASTER_LOG_POS は同 Position の値です。


11. レプリケーションスタート(B)

最後にレプリケーションを開始します:
mysql > START SLAVE;
これでレプリケーションがスタートする、はず。


スレーブを増やして、3台目以降の MySQL サーバーを構築する場合も同様にして行います。


環境によっては「初めから MySQL をクラスター環境で構築する」という選択肢もあります。そういう場合はこちらを参照してください:
CentOS に MySQL クラスター環境を構築する


このブログエントリを書こうと思ったキッカケはこの技術記事でした:
MySQL / MariaDB 5.7 on POWER8 パフォーマンス情報

MariaDB を Power8 搭載サーバー(の Linux)上で動かすと非常に高いパフォーマンスを発揮させることができる、という内容です。

現在、Power サーバー上で動く RHEL(RedHat Enterprise Linux) 6.6 では、普通に yum で MySQL をインストールすることはできます。ただ標準リポジトリに用意されている MySQL のバージョンは低く、上記記事で書かれたパフォーマンス改善パッチが適用されたものではありません。 また MariaDB のバイナリはまだ Power Linux 向けには提供されておらず、厳密には正式な稼働プラットフォームでもありません。 というわけで、Power Linux 上で MariaDB をソースコードからビルドして動かすまでの手順を紹介します。

まずは環境の用意です。ほとんどの人は Power チップ搭載サーバーを使える環境は手元にないと思いますが、IBM のビジネスパートナーであれば、ビジネスパートナー向けに無償で(クラウド経由で)提供されている IBM PDP(Power Development Platform) を使うことも可能です。IBM PDP の説明や RHEL on Power の利用手順についてはこちらを参照ください:
Power 版 RHEL(RedHat Enterprise Linux) を無料で2週間借りる(1/2)
Power 版 RHEL(RedHat Enterprise Linux) を無料で2週間借りる(2/2)
IBM PDP で Power Linux をすぐに使えるように予約する


今回、MariaDB をソースコードからコンパイルしてインストールします。その場合、RHEL の導入時に "Development Tools" を導入しておく必要があります:
# yum groupinstall "Development Tools"

また、libaio-devel パッケージが必要です:
# yum install libaio-devel

更に、MariaDB をソースファイルからコンパイルする際のビルドツールには configure ではなく cmake を使います。というわけで cmake を事前に導入しておきます:
# yum install cmake


事前準備ができたら早速 MariaDB のソースコードを公式サイトからダウンロードします。このブログエントリを書いている時点での最新安定バージョンは 10.0.15 だったので、これを使います(上記記事のパフォーマンス改善パッチが適用後のバージョンです)。

ダウンロードサイトから "Source" と書かれた mariadb-X.X.X.tar.gz(X.X.X はバージョンなので、今回であれば 10.0.5)のリンクをクリックして、このファイルをダウンロードします:
2014122901


ダウンロードできたら /usr/local/src 以下に展開します:
# cd /usr/local/src
# tar xzvf ~/mariadb-10.0.15.tar.gz

ここからが Power Linux 用の特殊な部分です。最初に cmake で Makefile を作りますが、以下のオプションを付けて cmake を実行します:
# cd mariadb-10.0.15
# cmake . -DLDLIBS=-lpthread -DCMAKE_C_FLAGS=-mminimal-toc -DCMAKE_CXX_FLAGS=-mminimal-toc -DBUILD_CONFIG=mysql_release

cmake コマンドが正常終了したら make でビルドして、インストールします:
# make
# make install

これで Power Linux の /usr/local/mysql 以下に MariaDB が導入されます。



 

前回は MySQL の導入について紹介したので、今回は MariaDB を紹介します。

MariaDB は MySQL 互換の RDB です。WordPress などの、MySQL を前提としたアプリケーションも MariaDB を使って動かすことができます。


MariaDB にも言えることですが、MySQL もコミュニティエディションは無料で使うことができるオープンソースのデータベースサーバーソフトウェアです。では MariaDB の存在意義はどこにあるのでしょう?

もともとコミュニティの中で成熟してきた MySQL は後に Sun Microsystems に買収され、そして現在は Oracle の下にあります。この「先が見えない」状態をよしと思わない、MySQL 開発者を中心とした有志によって、新たに開発が進められている MySQL の互換DB、それが MariaDB です。

稼働実績も増えてきており、例えば英語版およびドイツ語版 Wikipedia では MySQL から MariaDB に切り替えられています。また Fedora 19、Open SuSE 12.3、RHEL 7 などのメジャーな Linux ディストリビューションでも搭載 DB が MySQL から MariaDB に変更されています。


では CentOS への MariaDB のインストール手順を紹介します。現在の CentOS 6.x ではまだ標準 DB は MySQL であり、そのまま yum でインストールできるわけではありません。

まずは MariaDB をインストールするための PGP Key をインポートします:
# rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

またリポジトリ設定を自分の環境にあった内容で編集します(以下は MariaDB 10.0.8 を CentOS 6.x の x86_64 向けにインストールするための設定):
# vi /etc/yum.repos.d/mariadb.repo

[mariadb]
name=MariaDB
baseurl=http://yum.mariadb.org/10.0.8/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
enabled=1

ここまでの準備ができると yum で MariaDB をインストールできるようになります:
# yum -y install MariaDB-devel MariaDB-client MariaDB-server

インストールが完了したら MariaDB を起動します。MySQL のデーモン名は mysqld でしたが、MariaDB では mysql になっています:
# /etc/init.d/mysql start
Starting MySQL. SUCCESS!

インストールはこれだけ。インストールの後のセットアップは MySQL でのケースとほぼ同じなので省略します。




 

このページのトップヘ