Mysql和Memcached的連動

Memcached 和 mysqld 的聯通

一 概述:
  1. what's UDFs ?
    UDFs是User Defined Functions的縮寫,表示Mysql用戶自定義的函數,應用程序能夠利用這些函數從MySQL5.0以上的版本的數據庫中訪問Memcached寫入或者獲取的數據。此外,MySql 從5.1版本開始支持觸發器。從而能夠在觸發器中使用UDFs直接更新Memcached的內容,這種方式下降了應用程序的設計和編寫的複雜性。mysql

  2. 下面簡單介紹UDFs的安裝和使用。安裝UDFs須要在數據庫服務器上安裝兩個包,分別是libmemcached和memcached_functions_mysql,這兩個包均可以從http://download.tangent.org/下載,安裝以下:sql

    2.1. 須要的軟件有memcached-1.2.6,libevent-1.4.4-stable,libmemcached-0.30這些軟件很是簡單,yum -y install libmemcached* 就能夠安裝了,所以不作說明。
    2.2. 安裝mysql,也不作說明。
    2.3. 安裝Memcached_functions_mysql,基本步驟以下:下載地址:https://launchpad.net/memcached-udfs數據庫

    # 下載解包之後,進入到目錄下面,開始執行下面的安裝命令
    [root@salt memcached_functions_mysql-1.1]# ./configure --with-mysql=/usr/bin/mysql_config --prefix=/usr/local/memcached_functions_mysql
    [root@salt memcached_functions_mysql-1.1]# make && make install

安裝完之後,切換到源碼目錄下,把memcached_function_mysql 裝到mysql內部裏面去,有2中方法:服務器

  • 第一種方法是在MySQL的SQL命令行中執行memcached_functions_mysql源碼目錄下的sql/install_functions.sql
  • 第二種方法是運行memcached_functions_mysql源碼目錄下的utils/install.pl這個Pcrl腳本,把memcache function做爲UDFs加入MySQL。

下面我採起的是第二種方法:app

[root@salt memcached_functions_mysql]# cd /tmp/memcached_functions_mysql-1.1
[root@salt utils]# cp /usr/local/memcached_functions_mysql/lib/libmemcached_functions_mysql.so /usr/lib64/mysql/plugin/
[root@salt memcached_functions_mysql-1.1]# cd utils/
[root@salt utils]# ls
install.pl
[root@salt utils]# ./install.pl

若是你的數據庫設置了密碼,那麼就在install.pl腳本的78行附近,把密碼傳個那個opt_password的變量:memcached

73 $opt_schema ||= 'test';
 74 $opt_user   ||= 'root';
 75 $opt_host   ||= 'localhost';
 76 $opt_password   ||= '123456';     # 78行,添加這個變量,告訴鏈接數據庫的密碼
 77 my $existing_functions;
 78 
 79 my $dbh= DBI->connect("DBI:mysql:$opt_schema", $opt_user, $opt_password)
 80     or croak "Unable to connect! $DBI::errstr\n";

一路回車敲擊Y後,終於把Memcached_function_mysql裝進到了mysql中,咱們在數據庫檢查下,共32行:函數

select name,dl from mysql.func;
+------------------------------+---------------------------------+
| name                         | dl                              |
+------------------------------+---------------------------------+
| memc_cas_by_key              | libmemcached_functions_mysql.so |
| memc_cas                     | libmemcached_functions_mysql.so |
| memc_servers_set             | libmemcached_functions_mysql.so |
| memc_add                     | libmemcached_functions_mysql.so |
| memc_libmemcached_version    | libmemcached_functions_mysql.so |
| memc_add_by_key              | libmemcached_functions_mysql.so |
| memc_server_count            | libmemcached_functions_mysql.so |
| memc_stat_get_keys           | libmemcached_functions_mysql.so |
| memc_append                  | libmemcached_functions_mysql.so |
| memc_replace_by_key          | libmemcached_functions_mysql.so |
| memc_prepend                 | libmemcached_functions_mysql.so |
| memc_behavior_get            | libmemcached_functions_mysql.so |
| memc_udf_version             | libmemcached_functions_mysql.so |
| memc_set_by_key              | libmemcached_functions_mysql.so |
| memc_get_by_key              | libmemcached_functions_mysql.so |
| memc_increment               | libmemcached_functions_mysql.so |
| memc_behavior_set            | libmemcached_functions_mysql.so |
| memc_stats                   | libmemcached_functions_mysql.so |
| memc_list_distribution_types | libmemcached_functions_mysql.so |
| memc_list_hash_types         | libmemcached_functions_mysql.so |
| memc_append_by_key           | libmemcached_functions_mysql.so |
| memc_servers_behavior_set    | libmemcached_functions_mysql.so |
| memc_replace                 | libmemcached_functions_mysql.so |
| memc_set                     | libmemcached_functions_mysql.so |
| memc_prepend_by_key          | libmemcached_functions_mysql.so |
| memc_get                     | libmemcached_functions_mysql.so |
| memc_list_behaviors          | libmemcached_functions_mysql.so |
| memc_delete                  | libmemcached_functions_mysql.so |
| memc_stat_get_value          | libmemcached_functions_mysql.so |
| memc_decrement               | libmemcached_functions_mysql.so |
| memc_delete_by_key           | libmemcached_functions_mysql.so |
| memc_servers_behavior_get    | libmemcached_functions_mysql.so |
+------------------------------+---------------------------------+
32 rows in set (0.30 sec)

#### 二 memcached_function_mysql的應用實例:
###### 1 建立2張表
新建2張表,urls和results,更新urls表中的內容,使系統自動更新Memcached的內容,results用來記錄更新Memcached失敗的記錄。測試

SQL語句:url

mysql> create database test character set 'utf8';
mysql> create table urls(id int(10) not null,url varchar(255) not null default '',primary key(`id`));
mysql> create table results(id int(10) not null,result varchar(255) not null default 'error',time timestamp null default current_timestamp , primary key (`id`));
2 建立3個觸發器

2.1. 當向urls表中插入數據時,對Memcached執行set操做,trigger大代碼以下:.net

mysql> delimiter //     # 切換結束符
mysql> drop trigger if exists url_mem_insert;
    -> create trigger url_mem_insert before insert on urls
    -> for each row begin set @mm = memc_set(NEW.id,NEW.url);
    -> if @mm <>0 then
    -> insert into results(id) values(NEW.id);
    -> end if;
    -> END//
Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.03 sec)

mysql> DELIMITER ;

2.2. 當對urls表中的數據進行更新時,對Memcached執行replace操做。sql語句以下

mysql> delimiter //
mysql> drop trigger if exists url_mem_update;
    -> create trigger url_mem_update before update on urls for each row begin
    -> set @mm = memc_replace(OLD.id , NEW.url);
    -> if @mm <> 0 then
    -> insert into results(id) values(OLD.id);
    -> end if;
    -> end //
Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.36 sec)

mysql> delimiter ;

2.3. 當對urls表中的數據進行刪除操做時,對Memcached執行delete操做,sql代碼以下:

mysql> delimiter //
mysql> drop trigger if exists url_mem_delete;
    -> create trigger url_mem_delete before delete on urls for each row begin
    -> set @mm = memc_delete(OLD.ID);
    -> if @mm <> 0 then
    -> insert into results(id) values(OLD.id);
    -> end if;
    -> end //
Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.29 sec)

mysql> delimiter ;

2.4. 設置Memcached相關參數
2.4.1. 設置UDFs操做Memcached服務器的IP地址和端口

mysql> select memc_servers_set('127.0.0.1:11211')
    -> ;
+-------------------------------------+
| memc_servers_set('127.0.0.1:11211') |
+-------------------------------------+
|                                   0 |
+-------------------------------------+
1 row in set (0.35 sec)

mysql> select memc_server_count();
+---------------------+
| memc_server_count() |
+---------------------+
|                   1 |
+---------------------+
1 row in set (0.00 sec)

2.4.2. 在Mysql命令行中列出能夠修改Memcached參數的行爲,執行命令和輸出結果以下:

mysql> select memc_list_behaviors()\G;
*************************** 1. row ***************************
memc_list_behaviors(): 
MEMCACHED SERVER BEHAVIORS
MEMCACHED_BEHAVIOR_SUPPORT_CAS
MEMCACHED_BEHAVIOR_NO_BLOCK
MEMCACHED_BEHAVIOR_TCP_NODELAY
MEMCACHED_BEHAVIOR_HASH
MEMCACHED_BEHAVIOR_CACHE_LOOKUPS
MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
MEMCACHED_BEHAVIOR_KETAMA
MEMCACHED_BEHAVIOR_POLL_TIMEOUT
MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
MEMCACHED_BEHAVIOR_DISTRIBUTION
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
MEMCACHED_BEHAVIOR_USER_DATA
MEMCACHED_BEHAVIOR_SORT_HOSTS
MEMCACHED_BEHAVIOR_VERIFY_KEY
MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
MEMCACHED_BEHAVIOR_KETAMA_HASH
MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
MEMCACHED_BEHAVIOR_SND_TIMEOUT
MEMCACHED_BEHAVIOR_RCV_TIMEOUT
MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK
       
MEMCACHED_HASH_DEFAULT
MEMCACHED_HASH_MD5
MEMCA
1 row in set (0.00 sec)

ERROR: 
No query specified

設置MEMCACHED_BEHAVIOR_NO_BLOCK 爲打開狀態,這樣Memcached出現問題的時候,也就是鏈接不上的時候,數據能夠繼續插入Mysql中,但有報錯提示;如不設置此值,那麼Memcached失敗時,數據須要到memcached失敗超時後才能夠插入到表中。
經過下面的設置,能夠避免這樣的狀況發生:

mysql> select  memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');
+--------------------------------------------------------------+
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') |
+--------------------------------------------------------------+
|                                                            0 |
+--------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select  memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');
+-----------------------------------------------------------------+
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') |
+-----------------------------------------------------------------+
|                                                               0 |
+-----------------------------------------------------------------+
1 row in set (0.00 sec)

2.4.3. 測試Mysql與Memcached的數據同步性
2.4.3.1. 數據增長

  • 咱們先在mysql上插入一條數據:
mysql> insert into urls values(2,'http://www.baidu.com');
Query OK, 1 row affected (0.04 sec)
mysql> select memc_get('2');
+-------------------+
| memc_get('2')     |
+-------------------+
| http://www.jd.com |
+-------------------+
1 row in set (0.02 sec)

而後在另外一個終端上telnet memcached執行命令,命令以下:

[root@salt ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get 2    #2就是id號,咱們剛纔插入數據的ID號爲2,因此這裏也是爲2
VALUE 2 0 20
http://www.baidu.com    
END

2.4.3.2 刪除數據
mysql:

mysql> delete from test.urls where id=2;

memcached:

get 2
END

2.4.3.3 修改數據同理可得,在mysql一端修改後,自動同步到memcached上去。

相關文章
相關標籤/搜索