シンクロ・フード エンジニアブログ

飲食店.COMを運営する、株式会社シンクロ・フードの技術ブログです

TomcatのセッションをRedisで管理する

こんにちは、Lispを愛するシンクロ・フードの東城です。

弊社では最近、TomcatのセッションをRedisで運用するように変更しました。
TomcatのセッションをRedisで運用している事例はWebではあまり見かけないので、 弊社の経緯を紹介したいと思います。

今までの構成

弊社ではAmazon EC2を使ってMySQLが入った専用のセッションサーバを建てて、 ここでTomcatのセッションを運用していました。 Tomcatのセッション管理にはPersistenceManagerを用いていて、 Tomcatのメモリ上のセッションをセッションサーバへ保存することによって、 複数台のTomcatでセッションを共有する仕組みを実現していました。 この構成になった経緯について詳しくはこちらで説明しています。

しかし、この構成にはセッションサーバで障害が発生するとセッションの同期に失敗するようになり、サイトが正常に動作しなくなってしまうという問題があり、 セッションサーバ自体が単一障害点となっていました。

さらに、AWS側の都合でEC2インスンタンスの再起動が必要となるたびに、 弊社のサイトでもメンテナンスを挟む必要が生じていて、 冗長化されていれば本来不要なはずの運用コストがかかっていました。

Amazon ElastiCacheのRedisについて

既に弊社ではAmazon ElastiCacheのRedisを使用しています。 ElastiCacheのMulti-AZ機能を使い、 異なるアベイラビリティーゾーンにプライマリノードとリードレプリカノードを設置することによってアベイラビリティーゾーン単位の障害に対しても、 フェイルオーバーすることによって自動復旧することができます。

よって、今回はTomcatのセッションをRedisで管理することにより、 単一障害点を取り除くことにしました。

セッションマネージャの選定

今回は以下のセッションマネージャが候補に上がりました。

tomcat-redis-session-managerは、 Redisを移行対象として検討していたために候補に上がったのですが、 Tomcat 8以降のバージョンについてサポートされていないため弊社では使用できませんでした。

aws-dynamodb-session-tomcatは、 以前のセッションマネージャの選定時にも候補に上がったもので、 DynamoDBでTomcatのセッションを管理するAmazon公式 しかし、現在は既にアーカイブされてしまっています。

memcached-session-managerは、 aws-dynamodb-session-tomcatで紹介されたTomcatのセッションマネージャです。 こちらはRedisにも対応していて、かつ現在弊社が使用しているTomcatのバージョンで動作することも確認できました。 さらにドキュメントも充実していて利用もしやすかったため、 今回はmemcached-session-managerを使うことにしました。

シンクロフード での設定

context.xmlに記述するtomcat-redis-session-managerの設定は、 こちらを参考にしました。

フェイルオーバーと複数台のTomcatからの利用については全く問題ありませんでした。 ただ、ひとつ気をつける必要があり、デフォルトのsessionBackupTimeoutが100msで少し厳すぎます。 Tomcatの起動直後はこのタイムアウトが特に発生しやすく、 平常時であってもたまにタイムアウト発生することを確認したためこの値を緩めました。

まとめ

以上がTomcatのセッションをRedisで運用するために行なった対応です。 最初はTomcat標準でないライブラリを使うことに不安を感じていたのですが意外とあっさり移行できました。 移行してから一週間以上経ちますが特に障害などは起きていません。

シンクロ・フードではエンジニアを募集しています! 少しでも興味があったら以下のリンクよりご連絡ください!

キャリア採用 | シンクロ・フード採用サイト