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

相關文章
相關標籤/搜索