PHP会话使用mySQL和memcached吗?

5
为了处理高流量的网站,我们计划扩展到使用2个Web服务器进行HA设置。
其中一个问题是管理PHP会话。显然,将会话处理程序移动到数据库易于实现且在Internet上有广泛的示例代码。
另一方面,我们知道memcached的好处,但一旦memcached节点出现故障,则该节点上的用户将失去其会话。
因此,我们考虑实施这样一个设置:默认情况下,会话由memcached处理,但同时也写入数据库。当我们获得一个memcached miss时,我们会尝试从数据库中检索。
上述内容是否有意义?你是否知道任何具体实现的例子?
提前感谢您。

为什么不使用PHP云呢?这可以节省您60%的工作量。 - dynamic
我建议您阅读来自serverfault.com的这个问题:http://serverfault.com/questions/164350/can-a-pool-of-memcache-daemons-be-used-to-share-sessions-more-efficiently。 - netcoder
2个回答

6
我向您推荐Dormando经常引用的如何使用memcached缓存在MySQL中存储会话的解释原始的LiveJournal帖子更冗长,但更详细地解释了为什么仅将会话存储在memcached中是一个不好的想法。
简而言之:
  • 首先从memcached中读取会话数据,在缓存未命中时查找MySQL。
  • 在每次更新时将会话数据写入memcached。
  • 仅在缓存数据未同步120秒左右时才写入MySQL。
  • 运行定期脚本,检查MySQL中是否有过期会话。对于每个过期的会话,从memcached更新并仅使真正过期的会话过期。

4
我有开发高可靠性系统的经验,一旦丢失会导致被吼叫的情况。仅将易失性缓存作为数据的唯一持久化存储是自找麻烦。 - squirrel
1
@OZ_,这更多是关于不稳定性的“感知”。用户不喜欢因为memcached节点离线而在会话中间被注销。如果你只是将会话存储在memcached中并希望一切顺利,那么为什么还要设置HA集群呢?它并不比正确设计的memcached+MySQL设置“快10-20倍”,而MySQL存储可以让你兼得速度和可靠性的优点。 - squirrel
@squirrel,再问一遍,memcache-node 出问题的频率是多少?每月一次吗?你想因为 memcache-node 可能会出问题而降低总体性能吗?我更愿意提高用户的可用性(页面加载速度更快),而不是让他们花费时间和服务器性能来防止理论上的会话丢失。会话不是计费系统,也不是关键数据。正如我在回答中已经写过的那样,如果您只是想获得更高的可靠性,甚至在会话中,您可以尝试使用 Redis 作为现有解决方案,定期将数据从内存转储到磁盘。 - OZ_
1
@OZ_,这个问题是关于高可用性配置的。我认为这意味着节点下线不应该对系统产生任何可见影响。即使没有memcached节点下线,如果缓存被过度利用,您仍然可能会丢失会话数据。无论持久存储是MySQL还是Redis都没关系;memcached开发人员和其他HA开发人员都建议仅将memcached用于缓存,而不是存储。 - squirrel
2
也许你应该更好地理解上下文和业务需求。仅使用Memcache作为我们的会话是不可取的。我们绝对不想为我们的会话变量引入单点故障!将Memcache(作为缓存)与后端持久存储结合使用,可以很好地满足我们的要求,并且我们已经拥有了运行中的基础设施。似乎Redis与追加文件也可以实现类似的功能。 - webgr
显示剩余9条评论

1

会话是一种临时的东西,如果每个月一次memcache服务器失败并截断会话,那么没有什么可担心的。我相信您可以只使用memcache来进行会话,而无需在数据库中进行复制。

但是,如果您仍然想将会话转储到磁盘中,作为现有解决方案,您可以使用Redis

Redis使用内存数据集。根据您的用例,您可以通过将数据集转储到磁盘上来持久化它。

...

Redis 还支持简单易行的主从复制,具有非常快速的非阻塞首次同步、网络分裂后自动重连等功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接