YII2-PHP session会话memcache集群配置方案

问题

因为线上PHP集群的session一直用的一台memcache服务,致使服务响应请求常常会出现很大的标准差,对于一样的请求理论上不会出现这种状况,最终定位是单台memcache引发的问题。
image.pngphp

解决思路
尝试在测试环境单机用docker模拟memcached多端口,客户端用多个浏览器模拟请求,测试php服务配置session-memcached集群作分流的可行性。

配置

Docker 配置memcache集群

安装docker,并拉去memcached公用镜像(此步骤自行谷歌百度)。image.pngweb

启动3个memcached实例 :redis

docker run --name my-memcache -p 11210:11211 -d memcached:1.5.16
docker run --name my-memcache-20 -p 11220:11211 -d memcached:1.5.16
docker run --name my-memcache-30 -p 11230:11211 -d memcached:1.5.16

运行 docker ps查看启动状况:
image.pngdocker

PHP-INI 配置session

须要先安装memcached扩展,php底层会结合memcached对请求作自动分流落点,查阅了memcached官方文档,memcached是由客户端去实现分布式,以前一直觉得须要业务层去作一致性落点,其实这是不对的,php的memcached扩展早就替业务层封装并实现了此功能,对此咱们配置3个试验节点(11210,11220,11230)
image.png浏览器


校验

打开3个ssh终端,分别查看memcache各端口数据状况
进入memcachecookie

telnet 127.0.0.1 11210

image.png
firefox
image.png
作了屡次测试,其中一台落了一条,另外数据也会随机落在另外两台。session

固然这并非惟一的解决思路,常见框架都会对php的session handler,能够由客户端代码自行实现无须在php_ini中修改配置,YII2框架下,
能够配置默认组件:框架

'session' => [
            'class' => 'yii\web\Session',
            'name' => 'newrent-frontend-session',
            'timeout' => 3600 * 24,
            'cookieParams' => [
                'path' => '/',
                'domain' => ".xxx.com",
            ],
        ],

也能够用redis组件实现
image.pngfrontend

总结

因而可知对不一样浏览器的用户memcached-session集群已经完成了分流,当浏览器客户端获取到sessionid后,在此以后的后续请求均可以保证正常的访问,用此方案能够解决单台session-memcache的性能问题。dom

相关文章
相关标签/搜索