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

问题

由于线上PHP集群的session一直用的一台memcache服务,导致服务响应请求经常会出现很大的标准差,对于同样的请求理论上不会出现这种情况,最终定位是单台memcache引起的问题。
image.png

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

配置

Docker 配置memcache集群

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

启动3个memcached实例 :

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.png

PHP-INI 配置session

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


校验

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

telnet 127.0.0.1 11210

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

当然这并不是唯一的解决思路,常见框架都会对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.png

总结

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

阅读 206

推荐阅读