天天看點

多台memcache伺服器(ubuntu)實作session共享memcache介紹環境準備memcache的具體配置

memcache介紹

memcache是一個記憶體級别的分布式的高速緩存系統,相對來說,要比磁盤存儲高效的多。使用memcache存儲有利于memcache有多種語言環境下的實作方案,這裡以LAMP環境下的session共享為例。

預設情況下,php環境下session以檔案形式儲存至磁盤中,其配置在php.ini檔案中:

session.save_handler = files
session.save_path = "N;/path"
           

如果在負載均衡環境中使用預設的session存儲及管理方式,session将不能共享,為了避免使用者非正常的登入及退出,必須設定使用者回話和指定伺服器的關聯粘性,及一個使用者的所有會話在一台伺服器上完成。配置memcache就将解決這一問題,memcached中存儲PHP session具有能夠将它們釋出到運作Memcached的多個雲伺服器,進而具有保持會話備援的優勢,即使某台伺服器挂掉,其他伺服器也會直接接管會話,使用者體驗也會更好。

環境準備

這裡以三台安裝有LAMP服務環境的伺服器為例:

  • 伺服器 1

Name: lamp01

Public IP: 1.1.1.1

Private IP: 10.1.1.1

  • 伺服器 2

    Name: lamp02

    Public IP: 2.2.2.2

    Private IP: 10.2.2.2

  • 伺服器 3

    Name: lamp03

    Public IP: 3.3.3.3

    Private IP: 10.3.3.3

  • lamp環境的安裝這裡不做具體介紹,可以閱讀 這篇文章

    memcache的具體配置

    第一步,安裝php-memcache子產品

    檢視可用的php子產品指令:

    apt-cache search php5-

    php下有兩個memcache的包,分别是php5-memcache和php5-memcached,可以認為php5-memecache為memcachd的輕量化版本,安裝指令如下:

    apt-get install php5-memcache memcached

    執行指令後,memcached服務就安裝好了,服務預設監聽localhost(127.0.0.1),如果我們想要配置多台session的共享,必須接受私網下其他ip的請求,修改監聽ip為私網ip,打開伺服器1(lamp01)配置檔案

    /etc/memcached.conf

    找到如下配置:

    -l 127.0.0.1

    修改為

    -l 10.1.1.1

    伺服器2,3作同樣修改,修改後記得重新開機memcached服務,配置生效。

    第二步,修改memcache為php session的存儲及管理方案

    在伺服器1上打開配置檔案

    /etc/php5/apache2/php.ini

    ,做以下修改

    session.save_handler = memcache session.save_path='tcp://10.1.1.1:11211,tcp://10.2.2.2:11211,tcp://10.3.3.3:11211'

    11211 為memcached服務監聽的預設端口。

    伺服器2,3如上做相同配置。

    第三步,配置memcache的session備援

    在伺服器1上打開memcache配置檔案:

    vi /etc/php5/mods-available/memcache.ini

    增加如下指令配置:

    memcache.allow_failover=1 memcache.session_redundancy=4

    memcache.session_redundancy

    指令的值等于實際memcache伺服器數量加1,這是php的一個bug,詳看bug in PHP

    在伺服器2,3做相同配置,并重新開機apache服務。

    第四步,測試

    sudo vi /var/www/html/session.php

    session.php檔案内容如下:
    <?php
        header('Content-Type: text/plain');
        session_start();
        if(!isset($_SESSION['visit']))
        {
            echo "This is the first time you're visiting this server\n";
            $_SESSION['visit'] = ;
        }
        else
                echo "Your number of visits: ".$_SESSION['visit'] . "\n";
    
        $_SESSION['visit']++;
    
        echo "Server IP: ".$_SERVER['SERVER_ADDR'] . "\n";
        echo "Client IP: ".$_SERVER['REMOTE_ADDR'] . "\n";
        print_r($_COOKIE);
    ?>
               
    使用curl請求模拟http請求:

    curl -v -s http://1.1.1.1/session.php 2>&1 | grep 'Set-Cookie:'

    輸出以下内容:

    < Set-Cookie: PHPSESSID=8lebte2dnqegtp1q3v9pau08k4; path=/

    執行指令:

    curl --cookie "PHPSESSID=8lebte2dnqegtp1q3v9pau08k4" http://1.1.1.1/session.php http://2.2.2.2/session.php http://3.3.3.3/session.php

    輸出:

    Your number of visits: 1 Server IP: 1.1.1.1 Client IP: 117.193.121.130 Array ( [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4 ) Your number of visits: 2 Server IP: 2.2.2.2 Client IP: 117.193.121.130 Array ( [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4 ) Your number of visits: 3 Server IP: 3.3.3.3 Client IP: 117.193.121.130 Array ( [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4 )

    關閉memcache服務:

    sudo service memcached stop

    curl --cookie "PHPSESSID=8lebte2dnqegtp1q3v9pau08k4" http://1.1.1.1/session.php

    輸出:

    Your number of visits: 4 Server IP: 1.1.1.1 Client IP: 117.193.121.130 Array ( [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4 )

    會發現,即使關閉memcached服務,session仍存儲在伺服器環境。

    以上便是lamp環境下實作memcached session共享的主要步驟,當然為了實作上面的結果,還要配置防火牆政策,保證各個伺服器相關連結的暢通。

    原文:How To Share PHP Sessions on Multiple Memcached Servers on Ubuntu 14.04