使用数据库中的会话数据进行缩放
Scaling With Session Data in Database
我的 Silex 应用程序一直将会话数据存储在服务器上,但我想移动到 mysql 数据库,这样我就不会那么依赖于单个网络服务器。不过,我想知道性能。我打算使用 PdoSessionHandler。我的问题是:目前我有大约 177K 个存储会话。垃圾回收会不会很慢?从文件系统移动到数据库会影响性能吗?
老实说,以扩展的名义使用 MySQL 数据库作为事实上的会话存储是您在分布式会话存储中可能犯的最严重的错误之一。
让我解释一下为什么...
- 您的 MySQL 数据库可能已经是您最大的瓶颈,因为 PHP 可能会连接到它以获取几乎所有其他持久性。但是,可能有一些请求 URI PHP 可能依赖于缓存而不是访问您的数据库。如果您在这些页面上使用会话(那么,您的连接开销又会增加)。
- 从 MySQL 中的大型 table(对于 GC)删除行的成本在规模上可能非常昂贵。在 MyISAM 中,整个 table 被锁定(最坏的结果是整个站点在大型 GC 周期中阻塞)。使用 InnoDB,DBMS 必须将所有撤消信息写入一个大型提交日志,占用添加 I/O 并且有时会根据碎片问题导致运行缓慢。如果您也有重新索引问题,这尤其会证明是有问题的。
- 已经有更好的替代方案,它们需要您编写更少的代码!
如果您不在 AWS 上,我的建议是只使用 memcached instead. Where the connection overhead can be significantly lower, there are no db schemas to write, and the drivers for the session handler already exist in PHP by default. Throw something like igbinary on top of memcached and you have blazing fast serialization coupled with cheaper in-memory session handling that can easily be scaled up and distributed with minimal effort and side effects. For example, AWS offers you Elasticache for memcached/redis load-balancing and replication solution in their PaS. There's also Twem Prox 之类的东西。
您要为会话到期创建索引吗?如果没有索引,那么是的,它会很慢。 OTOH,您认为在磁盘上搜索 177,000 个文件的速度有多快?可能 很多 比使用数据库来完成它明确设计的事情要慢。
您会受到性能影响吗?大概。它会很重要吗?取决于系统对数据库执行的其他操作、数据库的配置及其运行的服务器。
简而言之 - 是的,将数据库用作会话存储将不可避免地产生成本,但鉴于它为您提供的能力,这可能是值得的。
我建议使用 Redis,不过备份到磁盘。
我的 Silex 应用程序一直将会话数据存储在服务器上,但我想移动到 mysql 数据库,这样我就不会那么依赖于单个网络服务器。不过,我想知道性能。我打算使用 PdoSessionHandler。我的问题是:目前我有大约 177K 个存储会话。垃圾回收会不会很慢?从文件系统移动到数据库会影响性能吗?
老实说,以扩展的名义使用 MySQL 数据库作为事实上的会话存储是您在分布式会话存储中可能犯的最严重的错误之一。
让我解释一下为什么...
- 您的 MySQL 数据库可能已经是您最大的瓶颈,因为 PHP 可能会连接到它以获取几乎所有其他持久性。但是,可能有一些请求 URI PHP 可能依赖于缓存而不是访问您的数据库。如果您在这些页面上使用会话(那么,您的连接开销又会增加)。
- 从 MySQL 中的大型 table(对于 GC)删除行的成本在规模上可能非常昂贵。在 MyISAM 中,整个 table 被锁定(最坏的结果是整个站点在大型 GC 周期中阻塞)。使用 InnoDB,DBMS 必须将所有撤消信息写入一个大型提交日志,占用添加 I/O 并且有时会根据碎片问题导致运行缓慢。如果您也有重新索引问题,这尤其会证明是有问题的。
- 已经有更好的替代方案,它们需要您编写更少的代码!
如果您不在 AWS 上,我的建议是只使用 memcached instead. Where the connection overhead can be significantly lower, there are no db schemas to write, and the drivers for the session handler already exist in PHP by default. Throw something like igbinary on top of memcached and you have blazing fast serialization coupled with cheaper in-memory session handling that can easily be scaled up and distributed with minimal effort and side effects. For example, AWS offers you Elasticache for memcached/redis load-balancing and replication solution in their PaS. There's also Twem Prox 之类的东西。
您要为会话到期创建索引吗?如果没有索引,那么是的,它会很慢。 OTOH,您认为在磁盘上搜索 177,000 个文件的速度有多快?可能 很多 比使用数据库来完成它明确设计的事情要慢。
您会受到性能影响吗?大概。它会很重要吗?取决于系统对数据库执行的其他操作、数据库的配置及其运行的服务器。
简而言之 - 是的,将数据库用作会话存储将不可避免地产生成本,但鉴于它为您提供的能力,这可能是值得的。
我建议使用 Redis,不过备份到磁盘。