Node.js環境のためにMySQLからMariaDBに移行
Android, 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 >