3

我们正在使用 Amazon Web Services (AWS),并且我们有多个 Web 服务器和一个负载均衡器。Web 服务器的问题是,$_SESSION 对于每个服务器都是唯一的。我在 $_SESSION 中保留了一些关于用户的信息。

同步此信息的正确方法是什么?有什么方法可以统一保存这些会话的地方,还是我应该使用 MySQL 来存储这些数据(我不太喜欢最后一个选项)?

4

3 回答 3

7

我认为您正在寻找的是“粘性会话”。如果我是对的,亚马逊为您提供了两种不同的选择。

负载均衡器(基于持续时间,我推荐这个)http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/US_StickySessions.html#US_EnableStickySessionsLBCookies

以及基于应用程序的会话粘性 http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/US_StickySessions.html#US_EnableStickySessionsAppCookies

于 2012-05-23T21:53:10.707 回答
4

虽然在概念上类似于您出于某种原因试图避免使用的 MySQL 选项,但在Amazon Web Services (AWS)中使用的一个非常吸引人的选项是最近引入的使用 Amazon DynamoDB 在 PHP 中进行可扩展会话处理,它解决了 PHP 中的典型会话处理不可扩展,因此无论如何都需要某种自定义解决方案:

会话用于跨多个 HTTP 请求保存短期数据 [...]。PHP 的本机会话处理程序将会话数据存储到本地文件系统;但是,这种方法在分布式 Web 应用程序中变得不可靠。在随后的请求中,用户可能不会被路由到同一台服务器,从而导致数据被有效地遗忘。用户将被注销并感到困惑。

为了克服这个问题,PHP 开发人员实施了自定义解决方案,使用数据库、共享文件系统、Memcache 服务器、防篡改 cookie 和其他存储机制来存储用户的会话数据。[...] [强调我的]

根据您的用例,您可能希望相应地尝试这种可能非常快的会话存储。

于 2012-05-23T08:21:05.140 回答
1

要添加到上述答案,您正在寻找像 DynamoDB 这样的分布式缓存,这是一项付费的亚马逊服务。它使用起来非常快速和出色,但如果您正在寻找其他一些开源替代品,您可以查看以下内存读/写选项。

  1. Memcached - 高读/写比率的理想选择。开发者社区的轻量级和大力支持。
  2. JCS - Java 缓存系统 - 非常灵活,适用于面临低读/写比率的系统。自定义复制也很棒,并且取决于粘性级别,这总是可以像 Web 应用程序的简单内存读/写一样快,因为 ELB 保持一定程度的粘性。因此,一旦会话被定向到另一个实例,只有那时会话信息才会被复制。我们使用它,到目前为止已经取得了很好的效果。
  3. EhCache - 已建立缓存框架,但其分布式缓存产品并非完全免费使用。可能是一种矫枉过正,因为它确保了在这种情况下可能并不真正需要的完整复制。
于 2012-07-10T06:46:58.880 回答