我有以下架构:
1负载均衡器
3个Amazon EC 2实例(LAMP,使用Symfony2)
1 RDS数据库
我最近设置了这个,因为我为单个实例获得了大量流量,并且我让Symfony2使用数据库进行会话,但现在我不断在日志文件中收到此错误:
Uncaught PHP Exception PDOException: "SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction" at /var/www/front/shared/vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/PdoSessionHandler.php line 513
我认为这是因为所有实例都在写入数据库中的sessions列,我该怎么做才能避免这个错误?当这个错误触发时究竟丢失了什么?
修改
会话表如下所示。
CREATE TABLE `sessions` (
`sess_id` VARBINARY(128) NOT NULL PRIMARY KEY,
`sess_data` BLOB NOT NULL,
`sess_time` INTEGER UNSIGNED NOT NULL,
`sess_lifetime` MEDIUMINT NOT NULL
) COLLATE utf8_bin, ENGINE = InnoDB;
答案 0 :(得分:1)
据我所知,可以设置负载均衡器以将用户重定向到同一个ec实例,因此没有理由共享会话。
关于数据库会话存储,尝试设置另一种锁定模式PdoSessionHandler::LOCK_ADVISORY
或PdoSessionHandler::LOCK_NONE
或在memcache