在生產環境中,我們經常使用MySQL作為應用的數據庫。但是隨著用戶的增多數據量的增大,我們將會自然而然的選擇Memcached作為緩存數據庫,從而減小MySQL的壓力。但是memcached在用戶、應用與MySQL三者中保持著數據同步也是一個不小的工程。
例如用戶從memcached緩存中換取某數據,並且執行刪除命令。它需要到MySQL中刪除,之後還須要設計一個程序將Memcached與之對應的數據也刪除掉。
假若我們能夠做到在MySQL中增刪改時都能夠自動觸發刪除memcached中相應的數據,那豈不美滋滋呀。這當然能夠做到啦,我們將采用采用MySQL Memcached UDF(User Defined Functions)方法。
mysql memcached UDF 其實就是通過libmemcached來使用memcache的一系列函數,通過這些函數,你能 對memcache進行get, set, cas, append, prepend, delete, increment, decrement objects操作,如果我們通過mysql trigger來使用這些函數,那麼就能通過mysql更好的,更自動的管理memcache!
需要使用的軟件又兩個,libmemcached以及memcached_functions_mysql
百度雲下載鏈接:http://pan.baidu.com/s/1pKCKjwB 密碼:fks8
網上找的下載網址:http://download.tangent.org(當時找軟件的時候,網上多篇文章都說這裡可以下載那兩個軟件。可我進去就是找不到呀,23333)
簡介:
這兩個軟件的安裝比較蛋疼,畢竟是開源軟件,哪個版本依賴哪個版本,哪個版本不與哪版本個兼容。當時我安裝這兩個軟件用了一個上午時間。因為之前我在安裝PHP中memcached擴展模塊需要依賴這個軟件庫,所以安裝了一個最新版本libmemcached-1.0.18,因而能夠使用PHP的memcached擴展模塊中的所有功能。、
但是在安裝memcached_functions_mysql時,就顯得很蛋疼了。
一開始我直接安裝memcached_functions_mysql-1.1,到make的時候就出現下面的錯誤。
servers.c:122: error: 'memcached_st' has no member named 'hosts'
servers.c:123: error: 'memcached_st' has no member
named 'hosts'
servers.c:124: error: 'memcached_st' has no member
named 'hosts'
servers.c:126: error: 'memcached_st' has no member
named 'hosts'
……
這是什麼原因呢?
這就是上面所提到軟件兼容問題。
後來在網上看到說是memcached_functions_mysql-1.1這個版本配對libmemcached-0.37版本以上都會出現這種問題。
接著我就進行一次又一次測試:
Libmemcached(1.0.2、1.0.3、1.0.18、0.34、0.36版本)+ memcached_functions_mysql-1.1進行安裝。結果成功的只有0.34、0.36版本。
因為我想要保證相對較高版本的libmemcached,因為低版本的不支持PHP的memcached擴展模塊的一些新功能。
既然memcached_functions_mysql-1.1版本不能對應libmemcached的高版本,那麼我就退而求其次,使用memcached_functions_mysql-0.9咯。
百度了好久好久沒找著,最後在國外的網站github中找到。
接著進行memcached_functions_mysql-0.9的安裝測試,結果還是不理想。
突然靈光一閃,那我就安裝兩個libmemcached咯,一個1.0.18版本,一個0.34版本。最終成功安裝。(libmemcached-0.34與memcached_functions_mysql-1.1配對進行安裝)
1):安裝libmemcached-0.34
參考
http://www.cnblogs.com/phpstudy2015-6/p/6670103.html#_label2
2):安裝memcached_functions_mysql-1.1
#tar zxvf memcached_functions_mysql-1.1.tar.gz #cd memcached_functions_mysql-1.1 #./configure --with-mysql=/usr/local/mysql/bin/mysql_config --with-libmemcached =/usr/local/libmemcached #make #make install
3):拷貝lib文件到mysql的plugin下面
# cp /usr/local/lib/libmemcached_functions_mysql.* /usr/local/mysql/lib/plugin/
4)往MySQL添加memcache UDF函數
一共有兩種方法:
1、在MySQL裡執行 source install_functions.sql
mysql>source /home/username/(memcached_functions_mysql-1.1源碼路徑)/sql/ install_functions.sql
2、在linux主機執行mysql <sql/install_functions.sql
#/usr/local/mysql/bin/mysql < /home/username/(memcached_functions_mysql-1.1源碼路徑)/sql/ install_functions.sql
5):檢查添加函數是否成功
mysql>select * from mysql.func;
結果顯示有很多函數,表示添加函數成功
注意:
1、必須要帶有--with-libmemcached,否則就會顯示找不到libmemcached
2、有個小細節,就是經常進行安裝卸載libmemcached時(即--prefix有設置相同的名字),即使有--with-libmemcached正確的路徑,也有可能會顯示找不到libmemcached。
解決:可以使用不同的名字(--prefix);或者重啟linux
從select * from mysql.func;的結果中我們可以看到很多關於memcached的函數。熟悉memcached指令的同學一眼看過去就能夠知道這個函數的大概功能。memc_set、memc_get這不就是相當set與get命令嘛。
具體功能可參考文檔:
http://dev.mysql.com/doc/refman/5.1/en/ha-memcached-interfaces-mysqludf.html
簡單測試一下這些函數:
#測試前當然要先將MySQL與memcached建立連接啦! mysql> select memc_servers_set('192.168.95.11:11211'); mysql> select memc_server_count(); mysql> select memc_set('m','llppppp'); mysql> select memc_get('m');
telnet 192.168.95.11 11211
1、新建一個數據庫test233以及表tab1
2、建立三個觸發器
插入數據: mysql>delimiter $ mysql>create trigger tab1_insert_memc -> before insert on tab1 -> for each row begin -> set @m=memc_set(NEW.id,NEW.name); -> end$ 更新數據: mysql> create trigger tab1_update_memc ->before update on tab1 -> for each row begin -> set @m=memc_replace(OLD.id,NEW.name); -> end$ 刪除數據: mysql> create trigger tab1_delete_memc -> before delete on tab1 -> for each row begin -> set @m=memc_delete(OLD.id); -> end$ mysql>delimiter ;
3、連接memcached服務器進行數據測試
mysql> select memc_servers_set('192.168.95.11:11211');
1)、向tab1插入幾條數據,並查看結果
mysql> insert into tab1 value('1','1111aaaaff'); .......
telnet 192.168.95.11 11211
2)、更改數據
mysql> update tab1 set name='ooooooooooooooo' where id=1;
telnet 192.168.95.11 11211
3)、刪除數據
mysql> delete from tab1 where id=1;
telnet 192.168.95.11 11211
1、如果出現mysql服務重啟,需要重新連接memcached服務器select memc_servers_set('192.168.95.11:11211)
2、使用命令查看可以設置的參數,根據具體項目設置最合適參數select memc_list_behaviors()/G
3、設置MEMCACHED_BEHAVIOR_NO_BLOCK為打開狀態,表示在memcached出現問題時可以繼續將數據插入到MySQL中。否則將會等到timeout執行插入操作。
4、在MySQL中使用這個功能時,不要一味地將所有表的數據都布置成這種形式,避免MySQL中使用過多的函數、以及觸發器而影響性能。
(以上是自己的一些見解與總結,若有不足或者錯誤的地方請各位指出)
作者:那一葉隨風
聲明:以上只代表本人在工作學習中某一時間內總結的觀點或結論。轉載時請在文章頁面明顯位置給出原文鏈接