MariaDBからRedisへ一部の機能を移行したこと

記録しておかないとなんで移行したのか忘れてしまいそうだから書いておく。

MySQL5.6からMariaDBへ移行

だいたい毎月100万PVほどあるWEBサイトのデータベースをMySQL5.6からMariaDBへの移行と同時に見直して、一部の機能をRedisへ移行した。

MySQL5.7の5.6からの変更がうちには合わないし、もうMySQLは見限って良さそうだし、MariaDBへ移行することにした。やってみると、インストールと設定の移行はいろいろ細かい調整は必要だったけれど特に問題なく移行できた。

ただ、MariaDBへの移行で同時に解消しないかなあと思っていた問題も引きずってしまった。

DB接続の断続的な切断問題

問題というのは、高負荷になるとDBアクセスが断続的に切れてしまってアプリケーションでの接続し直しが頻発して結果的にWEBサイトのレスポンスが悪くなってしまうこと。MySQL Server goneとかなんとか。

当該サイトは11月ごろからアクセスが増えて12月から1月がピークを迎える。10月中にはなんとかしたかった。

どのSQLで接続が切れるかは特定できない。同じSQLでも切れることもあれば切れないこともある。SQLのログをとりつつどこで起きているのかをリストアップするとだいたい傾向がわかってきた。あれじゃないかなあと予想はしてたところだった。

テーブル定義: CREATE TABLE kvs(k int NOT NULL PRIMARY KEY, v text)

切断が起きる前後のSQLで80%程度をしめていたのが、このテーブルへのこういうSQL: SELECT v FROM kvs WHERE k in (1, 2, … 256)

SQLで柔軟に検索して集めてきたkvsテーブルのキーの値(kvs.v)を最終的にドンと持ってくる部分。inで指定されるキーの数は10個未満が90%だけどたまに256個とかもある。最大512個までに制限しているけど本当は8192個ぐらいはいけるようにしたい。

こういう感じのkvsテーブルへのクエリーが60クエリー/秒程度を超えてくると結構きつく切断と再接続が頻発する。inで指定されるキーの個数は関係あるような気がするけどないような気もする(ちゃんと調べてない)。

アプリケーションではローカルディスクでのキャッシュもしているし、MySQLのクエリーキャッシュも設定しているけど、WHERE句のバリエーションの方が多くてあまりキャッシュにヒットしない。

マシンの性能アップでも解消する部分はあると思うけれど、売り上げを考えるとこれ以上のメモリー増設やCPUアップグレードもやりにくい。RDB的な使い方でもないしなんだかなあと思ってはいたので、いよいよKVSを試してみることにした。

Redisで解決

キーの値をまとめてもってくるkvsテーブルへのアクセス部分だけをRedisに移行することにした。この部分はシンプルだし、アプリケーションの手直しも容易(容易ならなぜ早くやらなかった)。

SELECT v FROM kvs WHERE k in (1, 2, … 256)的なSQL発行をRedisのMGET 1 2 … 256に置き換えるだけでMariaDBの負荷は半分以下になるし、100クエリー/秒を発行してみたけれどRedisはなんでもない。RedisとMariaDBの合計で使うメモリー量はほぼ変わらないか、MariaDBへの接続数が減ったのでその分トータルのメモリ使用量は減っているように見える。いいことばかり。

適材適所ってこと。おわり。

Introducing Lektor — A Static File Content Management System For Python | Armin Ronacher’s Thoughts and Writings

FlaskやWerkzeug、Jinjaで有名なArmin Ronacherがまた新しいプロダクトを公開した。スタティックファイルを使ったCMSみたい。

Introducing Lektor — A Static File Content Management System For Python | Armin Ronacher’s Thoughts and Writings

WordPressとかDjangoといったデータベースから動的にコンテンツを生成するシステムの複雑さが嫌になったって。他にもいろいろスタティックファイルを使ったCMSからはあるけど結局気に入らなくて自分で作ってしまったということらしい。

実は常々スタティックファイルの方がいいなあと思っているサイトがある。この人の作ったものは品質が高いしスタイルも好きだから、年が明けたら使ってみたい。使ってみたらまた感想を書いとこう。


年が明けてちょっと暇な時間にドキュメントを読んでみた。
いやあ、簡単に使ってみようって具合にはなかなかいかないぞ。
Jinja2は使ってるし、Flaskっぽい考え方がそこここにあって馴染みある感じなんだけど学ぶことのボリュームがかなりある。
ちゃんとやればいい感じでライフサイクルを管理できそうなのはよくわかった。さあどうしようか。

strftimeの%aで曜日を出力するのはやめた

localeを使ってみたりいろいろと試してみたけれど、無理にstrftimeの%aで曜日を漢字で出力するのは今ひとつだった。

ディストリビューションによって挙動が変わったり、OSのメジャーアップデートで文字化けしてみたり。それぞれに事情はいろいろあって、単にバグだったり、必要なパッケージが変わってたりと、まあ仕方ないかなあと思うことも少なくない。

ああでもないこうでもないと、忘れてしまっても問題ない方法を考えてみた。これでいいのだ。 続きを読む

さくらのVPSのローカルネットワーク接続まとめ

さくらのVPSを5台借りてあれこれ負荷をかけてテストしてみている。実際にテストできるようになるまではいろいろあったけれど。

ローカルネットワークは1Gbのベストエフォートがなかなかよい感じに速いと思います。きちんとチェックしてないので数字は出しませんが。VPNだとかトンネリングだとかいろいろ工夫して複数台構成をさくらのVPSのグローバルネットワーク上に構築しているならば移る価値ありだと思います。3台あればいろいろ試すこともできるし6千円弱/月の価値はあるかと。うちは某VPSを2台解約することにさっき決めました。

本登録したし今後も使いますけれど、お試し期間中はローカルネットワーク接続が使えないというのはなんだかなあとは思いました。複数同時に申し込むとしたらそれが一番お試ししたいことのはずなのに。そうそう、複数台の申し込みが面倒くさいのもなんとかならないもんでしょうか。らしいといえばらしいのですが。

注意するべき点がひとつ。 続きを読む

さくらのVPSの複数台構成ローカルネットワーク接続でハマり中

「さくらのVPS」プラン拡充・機能追加などサービスリニューアルのお知らせ | さくらインターネット

このニュースにのって、今月1日にさくらのVPSのローカルネット対応等を期待して2Gを5台追加。とにかく試しに使ってみて、負荷をかけてみて今の本番環境と比較してみるのだ。
と張り切ってみたのだけど、二日間ぐらいはカスタムOSのインストールがスムーズにいかない。

こんなにカスタムOSのインストールに手間と時間がかかるのでは本末転倒なので、デフォルトのCentOS6で使ってみるかと試してみるも、こっちはこっちで慣れていなくて基本的な環境整備にひどく時間を取られる。はあ、もういやだ、とUbuntuのカスタムOSインストールをもう一度ためしてみると、数日前とはエライ違い。単に混み合っていたせいなのか、何か不具合が治ったのかはわからない。でもUbuntuなら慣れてるし助かる。

さて、5台分のOSを設定して、データベース・サーバとして2台、アプリケーションサーバを2台、リバースプロキシサーバを1台の構成を試す。が、MySQLがおかしい。1台だけどうしてもおかしい。mysqlクライアントでローカルネットワーク経由でデータベースサーバに接続して、SELECTするとハングアップしてしまう。色々試すと、だいたいパターンが見えてきた。
以下、ハングアップは、 続きを読む

Simple HTTP CheckerにTCPタイムアウト値を追加

Simple HTTP Checker – シンプルなHTTPサーバの監視ツールで公開しているツールですが、手元の環境では随分前にTCPタイムアウトの設定ができるように変更して運用しています。

ちょっと問い合わせをいただいて思い出したのでGist:343248に反映させました。なおタイムアウト値(設定変数名=tcp_timeout)は1未満にはできません。1以上の整数を指定してください。
続きを読む