因为线上PHP集群的session一直用的一台memcache服务,致使服务响应请求常常会出现很大的标准差,对于一样的请求理论上不会出现这种状况,最终定位是单台memcache引发的问题。php
尝试在测试环境单机用docker模拟memcached多端口,客户端用多个浏览器模拟请求,测试php服务配置session-memcached集群作分流的可行性。
安装docker,并拉去memcached公用镜像(此步骤自行谷歌百度)。web
启动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查看启动状况: docker
须要先安装memcached扩展,php底层会结合memcached对请求作自动分流落点,查阅了memcached官方文档,memcached是由客户端去实现分布式,以前一直觉得须要业务层去作一致性落点,其实这是不对的,php的memcached扩展早就替业务层封装并实现了此功能,对此咱们配置3个试验节点(11210,11220,11230)浏览器
打开3个ssh终端,分别查看memcache各端口数据状况
进入memcachecookie
telnet 127.0.0.1 11210
firefox
作了屡次测试,其中一台落了一条,另外数据也会随机落在另外两台。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组件实现frontend
因而可知对不一样浏览器的用户memcached-session集群已经完成了分流,当浏览器客户端获取到sessionid后,在此以后的后续请求均可以保证正常的访问,用此方案能够解决单台session-memcache的性能问题。dom