经过MySQL的UDFs和Trigger操作Memcached51CTO博客 - AG环亚娱乐

经过MySQL的UDFs和Trigger操作Memcached51CTO博客

2019年03月01日10时52分21秒 | 作者: 鸿煊 | 标签: 操作,数据,更新 | 浏览: 2182

经过MySQL的UDFs和Trigger操作Memcached


UDFs是User Defined Functions的缩写,表明MySQL的用户界说函数,运用程序能够运用这些函数从MySQL 5.0以上版别的数据库中拜访Memcached写入或许获取的数据。此外,MySQL从5.1版别开端支撑触发器,然后能够在触发器中运用UDFs直接更新Memcached的内容,这种办法降低了运用程序设计和编写的复杂性。下面简略介绍UDFs的装置和运用。

 

UDFs装置



装置UDFs,需求顺次装置MySQL、libevent、memcached、libmemcached、memcached_functions_sql。

 

1. 装置mysql-5.6.24.tar.gz

参照之前的博文《InnoDB memcached插件布置》中MySQL装置部分。

 

2. 装置libevent-2.0.22-stable.tar.gz和装置memcached-1.4.22.tar.gz

参照之前的博文《Memcached 1.4.22装置和装备》。

 

3. 装置libmemcached-0.34.tar.gz

memcached functions for mysql官网发布的1.1版别是09年的,只兼容libmemcached0.34版别。

mkdir -p /usr/local/libmemcached
wget https://launchpad.net/libmemcached/1.0/0.34/+download/libmemcached-0.34.tar.gz
tar zxvf libmemcached-0.34.tar.gz
cd libmemcached-0.34
./configure prefix=/usr/local/libmemcached with-memcached=/usr/local/bin/memcached
make
make install

 

4. 装置memcached_functions_mysql

wget https://launchpad.net/memcached-udfs/trunk/1.1/+download/memcached_functions_mysql-1.1.tar.gz
tar xvf memcached_functions_mysql-1.1.tar.gz
cd memcached_functions_mysql-1.1
./configure prefix=/usr/local/memcache_mysql with-mysql=/usr/local/mysql/bin/mysql_config with-libmemcached=/usr/local/libmemcached
make
make install

 

5. 复制lib文件到mysql的plugin下面

cp /usr/local/memcache_mysql/lib/libmemcached_functions* /usr/local/mysql/lib/plugin

 

6. 装备动态链接库

echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig

 

7. 增加memcache UDF 函数

mysql < ./sql/install_functions.sql

 

补白:

初次需求运用CREATE FUNCTION来初始化用户界说函数。有两种办法能够初始化一切MySQL供给的用户界说函数:

榜首种办法是在MySQL的SQL指令行中履行memcached_functions_mysql源码目录下的sql/install_functions.sql。第二种办法是运转memcached_functions_mysql源码目录下的utils/install.pl这个Perl脚本,把memcache function作为UDFs参加MySQL。

 

8. 履行下面SQL指令,检查装置是否成功。

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

 

运用Trigger操作Memcached



1. 创立两张表

新建两张表:urls和results,更新urls表中的内容,使体系主动更新Memcached的内容。results用来记载更新Memcached失利的记载。

SQL代码如下:

use test;
drop table if exists urls;
CREATE TABLE `urls` (
`id` int(10) NOT NULL,
`url` varchar(255) NOT NULL DEFAULT ,
PRIMARY KEY (`id`)
);
drop table if exists results;
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个trigger

当向urls表中刺进数据时,对Memcached履行set操作。trigger的代码如下:

DELIMITER //
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 //
DELIMITER ;


当对urls表中的数据进行更新时,对Memcached履行replace操作。trigger代码如下:

DELIMITER //
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 //
DELIMITER ;


当对urls表中的数据进行删去操作时,对Memcached履行delete操作。trigger代码如下:

DELIMITER //
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 //
DELIMITER ;

 

3. 设置Memcached相关参数

设置UDFs操作Memcaced服务器的IP地址和端口。

mysql> SELECT memc_servers_set(192.168.11.52:11211);
+-+
| memc_servers_set(192.168.11.52:11211) |
+-+
| 0 |
+-+
1 row in set (0.07 sec)
mysql>select memc_server_count();
+-+
| memc_server_count() |
+-+
| 1 |
+-+
1 row in set (0.00 sec)


在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
1 row in set (0.00 sec)


设置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)

 

4. 对memcached_functions_mysql的简略功用进行测验

1)向表urls中刺进数据,然后检查Memcached是否对数据履行set操作。

mysql>insert into urls (id,url) values (1, http://www.test.com.cn);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select memc_get(1);
++
| memc_get(1) |
++
| http://www.test.com |
++
1 row in set (0.00 sec)
1>telnet 192.168.11.52 11211
Trying 192.168.11.52...
Connected to 192.168.11.52 (192.168.11.52).
Escape character is ^].
get 1
VALUE 1 0 22
http://www.test.com.cn
END


2)更新表urls里边的数据,然后查询Memcached中是否也进行了更新。

mysql>update test.urls set url=http://blog.test.com.cn where id=1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select memc_replace(1,http://blog.test.com.cn);
+-+
| memc_replace(1,http://blog.test.com.cn) |
+-+
| 0 |
+-+
1 row in set (0.00 sec)
mysql> select memc_get(1);
+-+
| memc_get(1) |
+-+
| http://blog.test.com.cn |
+-+
1 row in set (0.00 sec)
1>telnet 192.168.11.52 11211
Trying 192.168.11.52...
Connected to 192.168.11.52(192.168.11.52).
Escape character is ^].
get 1
VALUE 1 0 23
http://blog.test.com.cn
END


3)删去表urls中的数据,然后检查Memcached是否也将该数据删去了。

mysql>delete from test.urls where id=1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select memc_get(1);
+-+
| memc_get(1) |
+-+
| NULL |
+-+
1 row in set (0.00 sec)
1>telnet 192.168.11.52 11211
Trying 192.168.11.52...
Connected to 192.168.11.52 (192.168.11.52).
Escape character is ^].
get 1
END

 

5. 运用memcached_functions_mysql的经历与技巧

memcached_functions_mysql运用起来比较简略,可是因为环境的不同,在实践过程中或许会遇到许多的问题。下面总结了一些在运用memcached_functions_mysq过程中或许呈现的问题和注意事项。


1) MySQL重启问题

假如MySQL服务器呈现重启,需求从头设置衔接Memcached联系(SELECT memc_servers_set(192.168.11.52:11211))。


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运用于出产环境,需求考虑监控和呈现问题时的康复作业(写好脚本以完善这个作业)。


7) MySQL本身要素

如履行的MySQL句子的功率以及衔接MySQL的client程序(php)的衔接开支等,这些问题都需求考虑。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章