因爲線上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