ラベル MySQL の投稿を表示しています。 すべての投稿を表示
ラベル MySQL の投稿を表示しています。 すべての投稿を表示

2014年3月11日火曜日

[MySQL on ZFS]CentOS6.5にZFSプールを作ってZFSファイルシステムにMySQL5.7のデータをぶっこんだ話

時間を見つけてはちょくちょく作業してLVSとvarnishでL4+L7な冗長ロードバランサ構成を組みました。

Webサーバは複数構成で冗長化しているのですが、DBサーバはサービス毎に物理的にマスターサーバを一台ずつ設置しています。


当然LVSと組み合わせて冗長化したいところですが、サーバを置く場所が無いのと資金がありません。
仕方ないのでデータのリアルタイムバックアップのみ実現させます。

(KeepAlivedを使ったMySQLの高可用性のあるサーバ構築方法は下記のサイトが大変参考になります)
http://dev.tapweb.co.jp/2011/01/325


まず、適当にサーバを一台作ってMySQL5.7を導入し、マルチソースレプリケーション機能で、各マスターDBサーバのレプリケーションサーバとします。

このレプリケーションにはクライアントから一切クエリが飛んできません。
単純に、マスターDBサーバのバックアップのみに使用します。
機能を限定することでITXベアボーンで十分実現可能です。
MySQL5.7からのマルチソースレプリケーション機能により複数DBサーバのレプリケーションになれます。


今回は、以前NAS用としてZFSで組んだファイルサーバがあったのでそれを利用しました。
ZFSの耐久性は魅力的なのでMySQL5.7のdatadirをZFSのファイルシステム上に設定します。


ここで問題なのが、innodbは非同期IOをサポートしますが、ZFS上では使えません。
innodb_use_native_aio=0のように設定すれば旧来のIOを使うのでZFSでも動作します。

しかし、MySQLをインストールするときにmy.cnfを読んでくれないのでインストールに失敗します。
そんな時は、

mysql_install_db --no-defaults --force --innodb_use_native_aio=0 --datadir=/zfs/mysql

のようなコマンドでデータベースを初期化します。


ZFS上にMySQLを配置するのって意外と需要ないのかもしれません。

解決を模索すること数時間、結構ハマってしまいました。





2013年8月31日土曜日

mroonga(groonga)+Mecabでtoo long sentence

php5.3 + mysql5.6 + mroongaで数万文字になるテキストにFullTextインデックスを貼って、phpからデータを流しているとMySQLがLost Connectionを吐きデータベースがクラッシュしたように停止することがあります。

mroongaのインデックスが壊れるのでテーブルの再作成が必要になるほどです。

いろいろ原因を考えてmax_allowed_packetを変えたり、timeoutを調整したりしましたが、実際の原因はMecabにありました。

私が作成していたテキストデータは改行コードをPHP上で"\n"としており、問題ないと思っていたのですが、どうもmroongaがMecabで形態素解析するときにそのまま\nという文字として読み込んでいるようでした。

Mecabは改行コードで文章の終わりを見ているようで、数十万文字の文章に改行コードが入っていないとなると文章長すぎ!処理しない!となるようです。

MySQL+mroongaでFullTextを扱わないデータなら\nで問題ないのですが、Mecabはうまく認識してくれないということでPHP_EOLを使用したところちゃんと改行と認識してくれました。

PHP_EOLは環境依存なので使っていなかったのですが、まぁmroongaインデックス用のfieldなのでよしとします。

ハマリにハマって4時間浪費。

2013年1月7日月曜日

Webサーバチューニング(MySQL+PHP)とりあえず版

チューニングメモ。

パラメータの細かい説明はいろんなサイトにまとめてあるので省略します。

環境としてはOSは問わずPHPでSQLゴリゴリでリクエストあたりレスポンス秒が少ないWebサービスで、

他にクローラツール等のDBサーバも請け負っています。

 

まず、見落としがちですが、

CLOSE_WAITのセッションを早く消します。

主にクローラツールが原因なのですが、TCPコネクションが無駄にkeepaliveされるので許されるギリギリの値まで削ります。

http://network.station.ez-net.jp/server/linux/network/time_wait.asp

が参考になります。

# vi /etc/sysctl.conf

に下記を追加。

net.ipv4.tcp_keepalive_time = 5

net.ipv4.tcp_keepalive_probes = 2

net.ipv4.tcp_keepalive_intvl = 2

net.ipv4.tcp_fin_timeout = 15

 

次にApacheチューニングですが、奥が深すぎるのでおおよその計算を設定して運用後、徐々に調整していきます。

私の環境では以下の様に。結構稼働範囲ギリギリです。

# vi /etc/httpd/conf/httpd.conf

Timeout 15

KeepAlive Off

HostnameLookups Off

TraceEnable Off

<IfModule prefork.c>

ServerLimit 300

StartServers      10

MinSpareServers   50

MaxSpareServers  100

MaxClients      300

MaxRequestsPerChild  4000

MaxMemFree 4096

</IfModule>

server-statusを見ながら細かい調整を重ねます。

 

そしてMySQLの設定。

どのようなリレーションでサブクエリを多用するのかしないのか。同時にいくつアクセスがあるのかなど考えて調整していきます。

私の環境では細かい接続がバンバンくるので下記の様な設定です。

# vi /etc/my.cnf

 

max_connections = 1500

 

#tuning

query_cache_limit       = 32M

query_cache_size        = 256M

 

key_buffer              = 2048M

max_allowed_packet      = 4M

thread_stack            = 192K

 

sort_buffer_size = 4M

read_buffer_size = 4M

read_rnd_buffer_size = 16M

join_buffer_size = 262144

 

wait_timeout = 120

interactive_timeout = 120

 

thread_concurrency = 300

thread_cache_size = 3000

table_cache = 10000