对于高流量网站,我们计划在HA设置中扩展到使用2台web服务器。
我们需要解决的一个问题是PHP会话的管理。
显而易见的答案是将会话处理转移到DB,这很容易,示例代码在互联网上广泛可用。
另一方面,我们知道memcached的好处,但一旦memcached节点出现故障,该节点上的用户将失去会话。
因此,我们正在考虑实现一种设置,默认情况下,会话在memcached中处理,但也在DB中编写。当我们得到一个memcached的MISS时,我们也会尝试从DB中检索它。
以上内容有意义吗?您知道哪些实现示例吗?
提前感谢
我向您介绍Dormando经常引用的关于如何使用memcached缓存在MySQL中存储会话的解释。LiveJournal最初的帖子更为冗长,但更彻底地解释了为什么只在memcached中存储会话是个坏主意。
简而言之:
- 首先从memcached读取会话数据,在MySQL中查找缓存未命中的情况
- 每次更新时都将会话数据写入memcached
- 只有在缓存数据120秒左右未同步的情况下才能写入MySQL
- 运行定期脚本,检查MySQL是否存在过期会话。对于每个过期的会话,从memcached进行更新,并且只使真正过期的会话过期
会话这是一件临时的事情,如果每个月一次的memcache服务器将失败并截断会话,则无需担心。我确信您可以只在会话中使用memcache,而不需要在DB中进行复制。
但是,如果您仍然想将会话转储到磁盘,作为现有的解决方案,您可以使用Redis:
Redis使用内存中的数据集。根据您的用例,您可以要么通过倾倒数据集到磁盘
Redis还支持琐碎的主从复制设置快速非阻塞优先同步,自动重新连接打开净分割等等