資訊系統優化 快取 Cache MySQL資料庫

查詢資料不必一再重複索取 善用快取加快服務效率

安裝實作memcached 嫻熟管理命令常用函數

2020-03-17
本文將介紹開放原始碼快取系統memcached來增進資訊系統的服務效率,可將常用資料放在支援快速存取的裝置內,當使用者需要存取資料時,先查詢此裝置內的資料,若有相符,就直接存取,不必每次存取資料都必須重新取得,加快處理速度。

 

相信提供一個順暢的資訊系統服務(例如網站服務)是每個管理人員的目標,因此不斷地優化系統,也是管理人員持續在進行的工作。在經費許可的情況下,通常可利用更新硬體設備來提高服務效率。但在經費不寬裕的情況,也可利用軟體優化的技巧來有效提升資訊系統服務的效率,其中快取(Cache)功能便是一個重要的優化技巧。

系統將常用的資料置於一個支援快速存取的裝置上,例如記憶體,而後使用者在存取資料時即可先查此裝置的資料,若有相符的就直接存取,而不必每次存取資料都要重新再取得資料,藉此來增進資訊系統的服務效率。因此,本文將介紹開源碼中頗富盛名的快取系統「memcached」。

除此之外,由於MySQL資料庫伺服器(本文使用5.7.28版本)大量地被使用在資訊系統服務中,因此也將介紹memcached_functions_mysql套件,可與MySQL伺服器結合,讓MySQL可直接存取memcached快取系統。

認識memcached系統

memcached是一套高效能主從式架構的快取系統,能夠將資料以鍵名(Key)對應資料值(Value)的形式,把相關資料儲存在記憶體內。換句話說,就是在記憶體中建構一張巨大的雜湊表(Hash Table),讓使用者透過鍵名的方式即可快速地查詢到其對應的資料值,也因此常被用來當作快取功能以加快系統的存取效能。

要特別注意的是,由於memcached伺服器是將資料儲存在記憶體中,因此當memcached伺服器所在的主機重新啟動後,原先所儲存的資料便會消失。此外,memcached伺服器僅使用簡單的通訊協定,因此並未對安全問題多所著墨,所以在使用memcached伺服器時要特別控管可連線memcached伺服器的來源,否則任何人都可輕易地連線至memcached伺服器,而通常會利用防火牆設備來控管可存取的來源。

由於memcached伺服器會使用libevent程式庫來提供網路功能,因此在安裝memcached之前,必須先安裝libevent程式庫,連結至下列網址取得最新版本的libevent,本文中所使用的版本為2.1.11。

‧libevent程式庫下載網址: https://github.com/libevent/libevent/releases/download/release-2.1.11-stable/

在下載libevent安裝檔後,依序使用下列指令來安裝libevent程式庫:

./configure make make install

成功安裝libevent程式庫後,接著到memcached官方網站(http://memcached.org/)取得最新版本的原始碼進行安裝,本文使用1.5.20版本。然後,執行下列指令來安裝memcached:

#--with-memcached表示要編譯成伺服器 服務的型態 ./configure --with-libevent --with-libssl --with-memcached make  #進行編譯 make install  #進行安裝

在安裝完成之後,將會產生一個名為「memcached」的主程式,此即為主伺服器程式,用來提供相關的用途。

常用執行參數說明

接下來,分別說明memcached常用的執行參數。

-p:設定memcached執行時所使用的通訊埠號(TCP),如果沒有指定,便會使用預設的通訊埠11211,例如「memcached -p 8888」表示讓memcached以通訊埠8888進行服務。

-d:設定memcached以常駐程式(Daemon)的形式執行。

-m:設定memcached執行時所使用的記憶體容量(單位為百萬位元組),例如「memcached -m 32m」表示memcached執行時可使用32M的記憶體容量。

-u:設定memcached執行時所使用的使用者權限,例如「memcached -u root」表示以使用者root的權限來執行memcached。

-U:同-p參數,但使用UDP通訊協定,設定memcached執行時所使用的通訊埠號,如果沒有設定此參數,預設為不使用UDP通訊協定。

-v:設定在memcached執行時,輸出詳盡的執行狀態資訊,如果需要更詳盡的資訊,可再設定-vv或-vvv來取得更詳細的執行狀態資訊。

完成安裝memcached後,接下來說明memcached所提供的命令,可以在啟動memcached之後,以Telnet連線,即可直接下達相關命令,並且可以藉此觀察命令是否執行成功。

學會常用命令

接下來,將個別說明memcached常用的幾道命令。

set

設定快取資料,如果事先已有相同的鍵名,則會利用新設定的資料來取代舊有的資料值,也就是說,後面所設定的資料會蓋過之前所設定的資料值。其命令格式如下:

set [鍵值] 0 [有效秒數] [資料值的長度]

如下例為設定一個快取資料並設其鍵名為「k1」且此資料值的長度為3,最後並設定此快取資料有效的時間為300秒,執行結果如圖1所示:

set k1 0 300 3

圖1  執行「set k1 0 300 3」命令。

get

由鍵名取得快取資料。此命令可利用鍵名的方式取得事先已建立在快取資料中的資料值,其命令格式如下,圖2所示則為取得鍵名為「k1」的資料值:

get [鍵值]

圖2  取得鍵名為k1的資料值。

gets

類似get的命令,但與get不同的是,此命令的回傳值會多一個值(最後一個數字),用於確認此鍵名所對應的資料值是否有變動過及曾變動的次數,當每變動一次,此數值即會往上遞增。其命令格式如下,而執行結果如圖3所示,表示此鍵名(k1)的資料值在建立後即未被更改過:

gets [鍵值]

圖3  此鍵名k1的資料值在建立後未被更改過。

add

在記憶體中增加快取資料,要特別注意的是,當執行此指令時,如果所增加的鍵名事先已被建立,就會發生重複設定的錯誤,必須是新增事先不存在的鍵名及資料值,此指令才會執行成功。其命令格式如下,而圖4所示的執行結果為新增一個鍵名為「k2」的資料:

add  [鍵值] 0 [有效秒數] [資料值的長度]

圖4  新增一個鍵名為k2的資料。

replace

更新已存在的快取資料的資料值,同樣地,必須是事先已建立的鍵名及資料值,此指令才會執行成功。其命令格式如下,圖5所示的執行結果為將k1值由456更改成789:

replace [鍵值] 0 [有效秒數] [資料值的長度]

圖5  將k1值由456更改成789。

stats

此命令用來查看memcached伺服器目前的執行狀態,常見的輸出欄位說明如下:

pid [程序ID]

此欄位是說明memcached伺服器運作時所使用的程序ID資訊。

pointer_size [數值]

此欄位說明了memcached伺服器所在主機的作業系統所使用的指針(Pointer)長度,通常一般為32或64。

uptime [秒數]

此欄位用於說明memcached伺服器在啟動之後已運行的時間,單位為秒。

time [數值]

此欄位是說明memcached伺服器所在主機的當前系統時間。

curr_connections [連線數]

此欄位在說明目前連線到memcached伺服器的連線數。

total_connections [總連線數]

此欄位說明了從memcached伺服器啟動之後連線到memcached伺服器的總連線數。

cmd_get [總次數]

此欄位說明了從memcached伺服器啟動後,使用者取得get命令取得快取資料的總次數。

cmd_set [總次數]

此欄位用於說明從memcached伺服器啟動之後,使用者使用set命令設定快取資料的總次數。

curr_items [個數]

此欄位的用途在於說明目前memcached伺服器上已設定的快取資料總個數。

total_items [總個數]

此欄位用來說明從memcached伺服器啟動之後,曾設定過的快取資料總個數。

get_hits [命中次數]

此欄位說明使用者以get命令取得快取資料的命中次數。

get_misses [未命中次數]

此欄位說明了使用者以get命令取得快取資料的未命中次數。

delete_hits [命中次數]

此欄位在說明使用者以delete命令取得快取資料的命中次數。

delete_misses [未命中次數]

此欄位說明了使用者以delete命令取得快取資料的未命中次數。

cmd_flush [命令次數]

此欄位用來表示從memcached伺服器啟動之後,使用者執行flush_all命令的次數。

limit_maxbytes [位元組]

此欄位在於說明memcached伺服器在運作時所能使用的記憶體的最大容量,單位為位元組。

bytes_read [位元組]

此欄位在於說明從memcached伺服器啟動之後,取得來自網路的總資料量,單位為位元組。

bytes_written [位元組]

此欄位是說明從memcached伺服器啟動之後,傳送至網路的總資料量,使用的單位為位元組。

如圖6所示,為執行stats命令後,所回覆之結果。

圖6  執行stats命令後的回覆結果。

delete

此命令是用來刪除相關的快取資料,其命令格式如下,圖7所示的執行則表示刪除鍵名為「k1」的快取資料:

delete [鍵值]

圖7  刪除鍵名為k1的快取資料。

flush_all

用來清除所有的快取的資料,使用者可利用此命令清除memcached伺服器建立的所有快取資料。

在完成安裝memcached並簡單說明過相關命令的用法後,就可以啟動memcached伺服器。以下列指令為例,利用root的權限以常駐程式的形式執行,並使用32M記憶體來啟動memcached:

memcached  -d -m 32m -u root

memcached啟動完成,利用「netstat -anpt」指令來查看memcached是否確實在運作中,如圖8所示。

圖8  確認memcached是否已經開始正常運作。

在確認memcached已正常運作後,接下來安裝MySQL伺服器的UDF套件,讓MySQL伺服器能夠直接設定及存取memcached伺服器的快取資料。

安裝memcached_functions_mysql

為了讓更多的開發團隊能夠更有效率地開發相關程式來提升MySQL伺服器的功能,因此MySQL提出了「使用者自定函數」(User Define Function,UDF)架構,只要開發者撰寫符合此架構規範的程式,即可開發相關自定義的函數來提升MySQL伺服器的功能,而memcached_functions_mysql即為第三方所開發,用來直接存取memcached伺服器的UDF套件。

在本文中,將介紹如何安裝此套件來為MySQL伺服器加上存取memcached伺服器的功能。在安裝memcached_functions_mysql之前,必須先安裝Libmemcached程式庫,所以先連結至「https://launchpad.net/libmemcached/」網頁取得最新版本的原始碼,本文中使用1.0.18版。

將下載回來的檔案解壓縮,然後使用如下的指令進行編譯:

#表示支援memcached伺服器及MySQL伺服器 ./configure --with-memcached --with -mysql make make install

完成安裝Libmemcached程式庫後,即可繼續安裝memcached_functions_mysql,執行如下指令來安裝:

#以git指令取得原始碼 git clone https://github.com/smi ra/memcached_functions_mysql.git #至memcached_functions_mysql原始碼 目錄內 cd memcached_functions_mysql

  #根據系統環境來產生相關的組態檔 sh ./config/bootstrap #設定支援memcached伺服器及MySQL伺服器 ./configure --with-mysql --with- libmemcached make  #編譯

在編譯成功後,就會在「src/.libs/」目錄下產生一個名稱為「libmemcached_functions_mysql.so」的檔案,接著必須將此檔案複製到MySQL的「plugin」目錄下,所以要先確認MySQL伺服器的「plugin」目錄位置。可利用mysql(MySQL伺服器所提供的用戶端程式)程式登入到MySQL伺服器,然後如圖9所示執行「show global variables like 'plugin_dir';」命令。

圖9  執行命令查詢「plugin」目錄的位置。

執行命令後,就可以得知「plugin」目錄位置,在本例中為「/usr/local/mysql5/lib/plugin/」,因此必須將libmemcached_functions_mysql.so複製至該目錄,再重新啟動MySQL伺服器。

最後,再建立被放置於install_functions.sql檔案中此UDF套件所提供函數相關的建立指令,僅需要依照該檔案的內容逐一地新建相關函數即可。同樣地,建立完成後,登入至MySQL伺服器中執行「select * from mysql.func;」命令,來顯示相關函數的資訊。如果輸出資訊如圖10所示,就表示已經完成建置,至此即可在MySQL伺服器中利用所建置的函數來存取memcached伺服器的快取資料。

圖10  執行「select * from mysql.func」命令顯示相關函數。

相關函數介紹

接下來,繼續說明常用的函數。

memc_servers_set

此函數是用來設定連接memcached伺服器,如圖11所示,表示連接運作在本機上通訊埠11211的memcached伺服器,在存取快取資料之前,必須先用此函數來設定memcached伺服器。

圖11  使用memc_servers_set函數。

memc_set

此為set命令,用設定快取資料,如圖12所示表示設定鍵名為「k1」,其資料值為「123」。

圖12  設定鍵名為k1,而資料值為123。

memc_get

即get命令,用來取得快取資料,圖13所示為取得鍵名為「k1」的資料值。

圖13  取得鍵名為k1的資料值。

memc_delete

即delete命令,如圖14所示,為刪除鍵名為「k1」的資料值。刪除過後,再使用memc_get指令來取得鍵名「k1」的資料值,就會發現將取得NULL值。

圖14  刪除鍵名為k1的資料值。

至此,已完成建置memcached伺服器以及新增MySQL伺服器可直接存取memcached伺服快取資料的功能了。

<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>

 


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!