天天看點

《高性能Linux伺服器建構實戰》——3.4節通過UDFs實作Memcached與MySQL的自動更新

3.4.1 udfs使用簡介

udfs是user defined functions的縮寫,表示mysql的使用者定義函數,應用程式可以利用這些函數從mysql 5.0以上版本的資料庫中通路memcached寫入或者擷取的資料。此外,mysql從5.1版本開始支援觸發器,進而可以在觸發器中使用udfs直接更新memcached的内容,這種方式降低了應用程式設計和編寫的複雜性。下面簡單介紹udfs的安裝和使用。

1)需要的軟體有memcached-1.2.6、libevent-1.4.4-stable、libmemcached-0.30,這些軟體的安裝非常簡單,是以不做說明。

2)安裝mysql5.1,也不做說明。

3)安裝memcached_functions_mysql。基本步驟如下:

首次需要使用create function來初始化使用者定義函數。有兩種方法可以初始化所有mysql提供的使用者定義函數:

第一種方法是在mysql的sql指令行中執行memcached_functions_mysql源碼目錄下的sql/install_functions.sql。第二種方法是運作memcached_functions_mysql源碼目錄下的utils/install.pl這個perl腳本,把memcache function作為udfs加入mysql。

4)執行下面sql指令,檢視安裝是否成功。

3.4.2 memcached_functions_mysql應用執行個體

下面通過一個具體的執行個體來示範memcached_functions_mysql的使用方法。

1.建立兩張表

建立兩張表:urls和results,更新urls表中的内容,使系統自動更新memcached的内容。results用來記錄更新memcached失敗的記錄。

sql代碼如下:

2.建立3個trigger

當向urls表中插入資料時,對memcached執行set操作。trigger的代碼如下:

當對urls表中的資料進行更新時,對memcached執行replace操作。trigger代碼如下:

當對urls表中的資料進行删除操作時,對memcached執行delete操作。trigger代碼如下:

3.設定memcached相關參數

設定udfs操作memcaced伺服器的ip位址和端口。

在mysql指令行中列出可以修改memcached參數的行為,執行的指令和輸出結果如下:

1 row in set (0.00 sec)

設定memcached_behavior_no_block為打開狀态,這樣在memcached出現問題(不能連接配接)時,資料可以繼續插入mysql中,但有報錯提示;如果不設定此值,那麼memcached失敗時,資料需要等到memcached失敗逾時後才可以插入到表中。

通過下面的設定,可以避免這種情況的發生。

3.4.3 對memcached_functions_mysql的簡單功能進行測試

1)向表urls中插入資料,然後檢視memcached是否對資料執行set操作。

2)更新表urls裡面的資料,然後查詢memcached中是否也進行了更新。

3)删除表urls中的資料,然後檢視memcached是否也将該資料删除了。

3.4.4 使用memcached_functions_mysql的經驗與技巧

memcached_functions_mysql使用起來比較簡單,但是由于環境的差别,在實踐過程中可能會遇到諸多的問題。下面總結了一些在使用memcached_functions_mysq過程中可能出現的問題和注意事項。

mysql重新開機問題

如果mysql伺服器出現重新開機,需要重新設定連接配接memcached關系(select memc_servers_set('192.168.1.184:11900'))。

2.程式bug問題

memcached_functions_mysql的源程式有可能存在bug,并且會導緻mysql的失敗。針對這個問題,讀者要盡量選擇源程式的穩定版本。

3.網絡因素

網絡因素是指mysql和memcached是否處在同一個idc、它們之間的網絡性能是否很好。網絡性能越好,則速度越快。使用本機的memcached可以适當減少網絡開銷。

4.插入的資料量

插入資料量的大小包含兩個方面:向mysql插入每條記錄的大小,向memcached中更新資料的大小。更新mysql、memcached的資料越大,更新的速度越慢。是以,要做好前期規劃。

5.延時問題

如果mysql所在的機器使用的資源比較大,會導緻更新memcached過于緩慢,即出現類似m/s的延時問題。

6.容災問題

如果mysql和memcached中有當機情況出現時,需要考慮怎麼恢複,根據前一小節的測試可以這樣考慮:建一張錯誤表,如果在更新mc時出現問題,自動把更新錯誤的記錄插到這張表中,通過查詢這張表,可以知道哪些資料在什麼時間出現過更新錯誤。

如果memcached_functions_mysql應用于生産環境,需要考慮監控和出現問題時的恢複工作(寫好腳本以完善這個工作)。

mysql自身因素

如執行的mysql語句的效率以及連接配接mysql的client程式(php)的連接配接開銷等,這些問題都需要考慮。