2014年3月11日火曜日

Node.js環境のためにMySQLからMariaDBに移行

mysql_to_mariadbAndroid, iOSアプリからのアクセスをNode.jsで実装したけれど、データベース(MySQL)がたまに応答しなくなる現象が発生したので調査したときの覚書。

環境:CentOS 5.10 x86_64, MySQL 5.5.36, Node.js v0.10.26, node-mysql 2.1.0

 


1.MySQL Community Editionの限界

Node.js + node-mysqlからMySQLにクエリを投げると、その分だけスレッドが立つ(1つのコネクションに対して1つのスレッド)。

デフォルトの設定では、すぐ「too many connections」とエラーになってしまうので、my.cnfに「max_connections」を設定する。

しかし、コネクション数が256を超えた辺りで、レスポンスが非常に悪くなるらしい。公式サイトにコネクション数とパフォーマンスのグラフがある。

my.cnfの「thread_handling=pool-of-threads」としたいけど、これはMySQL Enterprise版の機能らしい。

調べてみると、MySQLからフォークした「MariaDB」というのがMySQL互換でスレッドプールも備えているので試してみた。

 


2.MariaDBについて

下記サイトが詳しい。

 


3.MariaDB 5.5をCentOSにインストール(失敗)

※この章は失敗したログ。成功した方法は次の章で

まずは既存データベースのバックアップ
# mysqldump -p hogedb > hogedb_20140310.sql

MySQLサーバーは停止。
# /etc/rc.d/init.d/mysqld stop


公式サイトを参考にYUMのリポジトリを追加する。

# vi /etc/yum.repos.d/MariaDB.repo

# MariaDB 5.5 CentOS repository list - created 2014-03-10 06:49 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos5-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

# yum clean all
# yum update

するとMariaDBが既存MySQLを置き換えようとして下記エラー

--> Processing Dependency: mysql = 5.5.36-1.el5.remi for package: mysql-libs
--> Finished Dependency Resolution
mysql-libs-5.5.36-1.el5.remi.x86_64 from installed has depsolving problems
  --> Missing Dependency: mysql = 5.5.36-1.el5.remi is needed by package mysql-libs-5.5.36-1.el5.remi.x86_64 (installed)
Error: Missing Dependency: mysql = 5.5.36-1.el5.remi is needed by package mysql-libs-5.5.36-1.el5.remi.x86_64 (installed)

よくmysql-libsはインストールしてあるし、よく分からないのでmysqlを削除する
# yum remove mysql*

MariaDB Serverをインストール
# yum install MariaDB-server MariaDB-client

サーバー起動。自動起動するようになってるか確認。
# /etc/rc.d/init.d/mysql start
# chkconfig --list | grep mysql

PHP用のライブラリをインストール
# yum install php-mysql

ここでまた置き換えようとしたときと同じエラー。別の方法でアップグレードすることにした。

 


4.既存のMySQLをREMIリポジトリを使ってアップグレード

(前の章で失敗したのはVMware Fusionで元に戻した)

下記記事にアップグレードする方法が載ってた。

remiリポジトリの追加方法は前の記事を参考に。

リポジトリを追加するのはさっきと一緒。
# vi /etc/yum.repos.d/MariaDB.repo

# MariaDB 5.5 CentOS repository list - created 2014-03-10 06:49 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos5-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

# yum clean all

まずは既存のMySQL関連ソフトを削除(データベースは削除されない)。
# yum remove mysql-server mysql-libs mysql-devel mysql*

Remiリポジトリを使ってMariaDBのインストール
# yum --enablerepo=remi-test --disablerepo=remi install compat-mysql55
# yum install MariaDB-server MariaDB-client php-mysql --enablerepo=remi

サーバー起動。自動起動するようになってるか確認。
# /etc/rc.d/init.d/mysql start
# chkconfig --list | grep mysql

データベースのアップグレード
# mysql_upgrade -p

これで既存のWordPressとphpMyAdminは動いた。

 


5.my.cnfの設定

前の設定は/etc/my.cnf.rpmsaveに保存されているので、これを見ながら追記する。
# vi /etc/my.cnf.d/server.cnf

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-storage-engine = MyISAM
ft_min_word_len = 1
thread_handling = pool-of-threads
max_connections = 500
table_open_cache = 6400

# Tuning
key_buffer_size = 512MB
sort_buffer_size = 8MB
read_rnd_buffer_size = 8MB
join_buffer_size = 1MB
read_buffer_size = 1MB
query_cache_size = 512M
query_cache_limit = 1MB

# Profile
slow_query_log = ON
long_query_time = 0.5
log_output = TABLE

環境に合わせてチューニングが必要。あくまで参考程度に。

文法を確認して再起動。
# /etc/rc.d/init.d/mysql configtest
# /etc/rc.d/init.d/mysql restart

 

遅いクエリにはインデックスを付けて、とりあえずNode.jsからの大量のコネクションを捌けるようになった(と思う)。

そのうちハードスペックに合わせたチューニング方法も調べたい。

 

< 2014/03/11 Modified >
yum updateしようとすると前と同じmysql-libsのエラーが表示されるので、mysql関係は除外するように設定。
# vi /etc/yum.conf

exclude=mysql*

 

 

< Related Posts >

コメントを投稿
Related Posts Plugin for WordPress, Blogger...

Blog Archives