原因は分からないのですが、待機系サーバーのmemcashedの動作がおかしい気がする…ので、session.save_handlerとして使っているmemcashedの別の候補として、PHP7.1において、session.save_handlerとして、Redisを使用したいと思いました。

session.save_pathには複数のRedisサーバーを設定すれば、Redisサーバーが1つ落ちてもサービスを継続できるかな…と思いましたが出来ませんでした。

環境は以下の通りです。
  • CentOS6および7
  • PHP 7.1.0
  • Redis server version 2.4.10
  • phpredis 3.1.1RC2
RedisをSession handlerとして使うには以下の設定が必要です。

/etc/php.iniに以下を記述
session.save_handler = redis
session.save_path = "tcp://localhost:6379"
extension=redis.so

さて、PhpRedisにREADMEによるとsession.save_pathには複数のサーバーを指定できるようになっています。
https://github.com/phpredis/phpredis/blob/develop/README.markdown#user-content-php-session-handler

そこで以下のように記述すれば1つサーバーが落ちてもサービスを継続できると思いました。
session.save_path = "tcp://localhost:6379, tcp://192.168.0.14:6379"

localhostと192.168.0.14にRedisで起動 → 192.168.0.14にセッションの情報が記録されることを確認
localhostのみRedisを起動 → NG、以下のエラーメッセージが出る

Warning: session_start(): connect() failed: Connection refused
Warning: session_start(): Failed to read session data: redis (path: tcp://localhost:6379, tcp://192.168.0.14:6379)

ちなみにsession.save_path = "tcp://localhost:6379"と書くと、localhostにセッションの情報が記録されるのでlocalhostの設定は問題ありません。

振り分けロジックは分からないのですが、逆のケースもNGです。

localhostと192.168.0.14にRedisで起動 → localhostにセッションの情報が記録されることを確認
192.168.0.14のみRedisを起動 → NG


memcashedとmemcasheの場合、session.save_pathに複数のサーバーを記述すれば、すべてのサーバーに同じ情報を書き込むため、サーバーが1台落ちても問題ないのですが、PhpRedisの場合はsession.save_pathに複数サーバーを書くと負荷分散するだけで、サーバーが落ちた場合の対処は別に仕組みを整えないといけないです。
具体的にどうするかというと以下のドキュメントにいろいろな構成が書いてあります。
http://tech.gmo-media.jp/post/48748908427/introduce-redis-sentinel

お手軽に冗長構成をとれたらいいなあ…と思っていたのですが、どの構成もそこそこ手間がかかって、ここまでして冗長構成を取る必要も無いかなあ…と思ったのでRedisは導入を見送ろうと思いました。