mysql memcached UDF(用户自定义函数)和mysql触发器在更新mysql数据库的时候,触发更新memcache。

1、首先介绍mysql memcached UDF安装

mysql memcached UDF 安装详解

2011-03-31 14:19:12|  分类: php|字号 订阅

1:mysql memcached UDF 其实就是通过libmemcached来使用memcache的一系列函数,通过这些函数,你能 对memcache进行get, set, cas, append, prepend, delete, increment, decrement objects操作,如果我们通过mysql trigger来使用这些函数,那么就能通过mysql更好的,更自动的管理memcache!

2:安装方法:

1)安装memcache

2)安装libmemcached

shell> cd libmemcached-0.35

shell> ./configure --with-memcached=/usr/local/bin/memcached

shell> make && make install

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

shell> ldconfig

3)安装memcached_functions_mysql

shell> tar zxvf memcached_functions_mysql-0.9.tar.gz

shell> cd memcached_functions_mysql-0.9

shell> ./configure --with-mysql=/usr/local/mysql51/bin/mysql_config --with-libmemcached =/usr/local/

shell> make && make install

4)拷贝lib文件到mysql的plugin下面

shell> cp -R /usr/local/lib/libmemcached_functions_mysql.* /usr/local/mysql51/lib/mysql/plugin/

5)添加memcache UDF 函数

在mysql里执行 source install_functions.sql

这样我们就可以使用mysql memcached UDF 了,我们可以通过下面语句查看是否已经正常安装

1)查看mysql.func,有很多函数

mysql> select * from mysql.func;

+------------------------------+-----+---------------------------------+----------+

| name                         | ret | dl                              | type     |

+------------------------------+-----+---------------------------------+----------+

| memc_add                     |   2 | libmemcached_functions_mysql.so | function |

| memc_add_by_key              |   2 | libmemcached_functions_mysql.so | function |

| memc_servers_set             |   2 | libmemcached_functions_mysql.so | function |

2)添加trigger,看是否向memcache里insert、update等

具体的语句,我们可以参照:

1)memcached_functions_mysql-0.9/sql 目录下的trigger_fun.sql

我们还必须注意以下几点:

1)mysql 编译时一定不要带'--with-mysqld-ldflags=-all-static' 这个参数,因为这样就限制了mysql 的动态安装功能了

2)使用时,要观察mysql.err日志,不知道是有意还是无意,udf更新memcache都会记录在err日志里,注意清理该日志,否则一下就爆满了

3)mysql 官网有这样一句话:

The list of servers used by the memcached UDFs is not persistent over restarts of the MySQL server. If the MySQL server fails, then you must re-set the list of memcached servers.

所以,当我们重启mysql,我们必须通过select  memc_servers_set('192.168.0.1:11211,192.168.0.2:11211');语句重新注册memcache服务器!

测试环境在Linux下进行,版本系统为CentOS5.

以下为相关软件,包括其版本和下载地址:

mysql-5.1.30 下载

memcached-1.2.6 下载

libevent-1.4.7-stable 下载

memcached_functions_mysql-1.1 下载

libmemcached-0.26 下载

编译安装MySQL,安装因个人细好而定,省略许多与测试无关的编译细节及参数。 [root@localhost ~]#tar xzf mysql-5.1.30.tar_001.gz

[root@localhost ~]#cd mysql-5.1.30

[root@localhost ~]#./configure --prefix=/usr/local/mysql51

[root@localhost ~]#make

[root@localhost ~]#make install

[root@localhost ~]#./scripts/mysql_install_db --user=mysql --skip-name-resolve

[root@localhost ~]#/usr/local/mysql51/bin/mysqld_safe

省略列出安装memcached和libevent的相关命令,具体可按照实际情况安装,测试时我将libevent默认安装,memcached安装于/usr/local/memcached目录下。

启动memcached. /usr/local/memcached/bin/memcached -d -m 50 -u root -p 11211

编译安装libmemcache. [root@localhost ~]#tar xzf libmemcached-0.26.tar.gz

[root@localhost ~]#cd libmemcached-0.26

[root@localhost ~]#./configure --with-memcached=/usr/local/memcached/bin/memcached

[root@localhost ~]# make && make install

编译安装Memcache UDFs for MySQL. [root@localhost ~]# tar xzf memcached_functions_mysql-1.1.tar.gz

[root@localhost ~]# cd memcached_functions_mysql-1.1

[root@localhost ~]# ./configure --with-mysql-config=/usr/local/mysql51/bin/mysql_config

[root@localhost ~]# make && make install

编译完成后将编译好的库文件复制到mysql的插件目录下,以便于加载使用。 cp /usr/local/lib/libmemcached_functions_mysql* /usr/local/mysql51/lib/mysql/plugin/

进入memcached_functions_mysql的源码目录,在目录下有相关添加UDF的SQL文件用于初始化。

在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql

或者运行memcached_functions_mysql源码目录下utils/install.pl这个perl脚本,把memcache function作为UDF加入mysql。

[root@localhost ~]# mysql

检查安装是否成功

mysql> select name,dl from mysql.func;

二. 测试用例设计情况:

(1).新建两张表:urls和results,用来更新urls表里面的内容,让系统自动更新memcached的内容。results用来记录更新memcached失败的记录。

sql语句如下:

use tests;

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). 建立三个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相关参数

设置同时UDF操作的memcaced的机器IP和端口:

mysql> SELECT memc_servers_set('192.168.3.184:11900');

+---------------------------------------+

| memc_servers_set('192.168.3.184:11900') |

+---------------------------------------+

|                                     0 |

+---------------------------------------+

1 row in set (0.00 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失败,mysql需要等到timeout

才可以插入到表中。

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)

三. 简单的功能测试:

1. 向表urls里面插入数据,然后查memcached是否也set进数据:

mysql> insert into urls (id,url) values (1, 'http://www.sina.com.cn');

Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select memc_get('1');

+------------------------+

| memc_get('1')          |

+------------------------+

| http://www.sina.com.cn |

+------------------------+

1 row in set (0.00 sec)

1> telnet 192.168.3.184 11900

Trying 192.168.3.184...

Connected to 192.168.3.184 (192.168.3.184).

Escape character is '^]'.

get 1

VALUE 1 0 22

http://www.sina.com.cn

END

2.更新表urls里面的数据,然后查询memcached里面是否也更新:

mysql> update test.urls set url='http://blog.sina.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.sina.com.cn');

+---------------------------------------------+

| memc_replace('1','http://blog.sina.com.cn') |

+---------------------------------------------+

|                                           0 |

+---------------------------------------------+

1 row in set (0.00 sec)

mysql> select memc_get('1');

+-------------------------+

| memc_get('1')           |

+-------------------------+

| http://blog.sina.com.cn |

+-------------------------+

1 row in set (0.00 sec)

1> telnet 192.168.3.184 11900

Trying 192.168.3.184...

Connected to 192.168.3.184 (192.168.3.184).

Escape character is '^]'.

get 1

VALUE 1 0 23

http://blog.sina.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.3.184 11900

Trying 192.168.3.184...

Connected to 192.168.3.184 (192.168.3.184).

Escape character is '^]'.

get 1

END

四. 利用php脚本insert, update,delete表urls里面的数据,进行测试。

每条记录的平均长度是:17K

单独向表urls里面插入10万条记录需要的时间为:75秒

单独对表urls里面更新10万条记录需要的时间为:70秒

单独对表urls里面删除10万条记录需要的时间为:105秒

同时进行30万数据的insert,update, delete操作需要时间为:241秒

上面操作都没有memcached失败情况:

mysql> select * from results;

Empty set (0.00 sec)

测试脚本如下:

插入脚本:

0> more a.php

$conn = mysql_connect("192.168.1.61","test","test") or die(mysql_error());

mysql_select_db("test",$conn) or die(mysql_error());

//$sql = "show tables";

echo date("Y-m-d H:i:s");

//mysql_query($sql) or die(mysql_error());

for ($i=1; $i<=100000; $i++) {

$sql="insert into urls (id,url) values ($i, 'http://$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i.com');";

mysql_query($sql) or die(mysql_error());

}

echo "/n";

echo date("Y-m-d H:i:s");

?>

更新脚本:

0> more b.php

$conn = mysql_connect("192.168.1.61","test","test") or die(mysql_error());

mysql_select_db("test",$conn) or die(mysql_error());

//$sql = "show tables";

echo date("Y-m-d H:i:s");

//mysql_query($sql) or die(mysql_error());

for ($i=1; $i<=100000; $i++) {

$sql="update test.urls set url='http://xxxx.$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i.com' where id=$i;";

mysql_query($sql) or die(mysql_error());

}

echo "/n";

echo date("Y-m-d H:i:s");

?>

删除脚本:

0> more c.php

$conn = mysql_connect("192.168.1.61","test","test") or die(mysql_error());

mysql_select_db("test",$conn) or die(mysql_error());

//$sql = "show tables";

echo date("Y-m-d H:i:s");

//mysql_query($sql) or die(mysql_error());

for ($i=1; $i<=100000; $i++) {

$sql="delete from test.urls where id=$i;";

mysql_query($sql) or die(mysql_error());

}

echo "/n";

echo date("Y-m-d H:i:s");

?>

五. 结论:

测试依赖的环境比较多,可能数据会不准确。整体来看速度还不错。

适合项目应用相对比较小的场合。

优点:

触发器中使用 UDFs 直接更新 Memcached 的内容,减轻了应用程序设计和编写的复杂性。

缺点:

1. 如果出现mysql服务重启,需要重新设置连接memcached关系(SELECT memc_servers_set('192.168.3.184:11900'))

2. 有可能存在bug问题,导致mysql的crash(测试时没遇到:)).

真正的线上环境比这个复杂很多。我想到的需要考虑的问题:

1. 网络因素,mysql和memcached是否放在同一IDC,他们之间的网络性能是否很好。网络性能越好,速度肯定越快,如果使用本机的memcached能适当的减少网络开销。

2. 插入的数据量,向mysql插入每条记录的size,以及向memcached里面更新的数据size大小。更新mysql,memcached的数据size越大,更新的速度越慢。

所以前期规划好,在memcached里面存那两列(key-value)是关键。

3. 延时问题需要考虑,mysql所在机器如果资源使用比较狠,会导致更新memcached慢(出现类似m/s的延时问题)。

4. 考虑容灾问题,如果两者中有down出现时,需要考虑怎么恢复,当前的测试是这样考虑的:建一张错误表,如果在出现更新mc出现问题时,自动把更新错误的记录插到

一张表里面,通过查这张表,可以知道哪些数据在什么时间更新错误,如果应用于生产环境,需要考虑监控和出现问题时恢复工作(写好脚本完善这个工作)。

5. mysql自身因素,例如执行的mysql语句效率,以及连接mysql的client程序(php)的连接开销等等。

memcache mysql 同步_memcache与mysql数据库同步相关推荐

  1. mysql同步软件_Mssql、Mysql数据同步软件:SyncNavigato数据库同步

    SyncNavigato是一款免费的Mssql.Mysql数据库数据同步软件. 界面预览图: SyncNavigato是一款免费的Mssql.Mysql数据库数据同步软件. SyncNavigato还 ...

  2. 本地数据库与mysql同步软件下载_SyncNavigator数据库同步软件

    SyncNavigator是一款功能强大的数据库同步软件,适用于SQL SERVER, MySQL,具有自动/定时同步数据.无人值守.故障自动恢复.同构/异构数据库同步.断点续传和增量同步等功能,支持 ...

  3. mysql主从 毫秒_MySQL主从数据库同步延迟问题解决(转)

    最近在做MySQL主从数据库同步测试,发现了一些问题,其中主从同步延迟问题是其中之一,下面内容是从网上找到的一些讲解,记录下来以便自己学习: MySQL的主从同步是一个很成熟的架构,优点为:①在从服务 ...

  4. mysql实时同步工具|sqlserver同步工具|常见的数据库同步工具

    SyncNavigator是一款功能强大的数据库同步软件,适用于SQL SERVER, MySQL,具有自动/定时同步数据.无人值守.故障自动恢复.同构/异构数据库同步.断点续传和增量同步等功能,支持 ...

  5. .net 同步mysql_MySQL服务器主从数据库同步配置

    首先需要在同一个局域网内的两台机器(当然也可以用一台机器虚拟两台机器出来),都安装上mysql服务. 主机A: 192.168.1.100 从机B: 192.168.1.101 可以有多台从机. 1. ...

  6. oracle同步数据adg_[adg数据库同步机制]三分钟读懂Oracle数据库容灾架之DataGuard

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 Oracle数据库目前依然处于商用数据库的霸主地位. 运行在Oracle数据库上的核心业务及核心数据的安全性尤为重要 ...

  7. 第三方数据库同步工具_数据库实时同步和复制_mysql数据库同步工具

    SyncNavigator v8.6.2 SyncNavigator是一款功能强大的数据库同步软件,适用于SQL SERVER, MySQL,具有自动/定时同步数据.无人值守.故障自动恢复.同构/异构 ...

  8. 《OSPF和IS-IS详解》一第6章 链路状态数据库同步6.1 OSPF数据库同步

    本节书摘来自异步社区<OSPF和IS-IS详解>一书中的第6章,第6.1节,作者 [美]Jeff Doyle,更多章节内容可以访问云栖社区"异步社区"公众号查看 第6章 ...

  9. oracle同步复制清理,Oracle数据库同步——高级复制

    情景模拟 现在有两台服务器: 1) 机器名:ThinkPad IP:126.33.9.190 Oracle SID:ORCL 2) 机器名:ZHANGJIAN IP: 126.33.9.154 Ora ...

最新文章

  1. 总监路上的第1年,聊聊几点感受
  2. springboot actuator_Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控...
  3. 男生的哪个“不要”是真的不要?
  4. Linux进程通信之mmap
  5. c#抽象属性_C#中的抽象属性
  6. java古剑奇谭_古剑奇谭页游源码web可编译的源代码分享价值百万的100%完整源代码...
  7. 三,springboot集成mybatis
  8. thinkpad扩展坞怎么用_顶级雷电3显卡扩展坞到底好用吗?技嘉 RTX2080Ti GAMING BOX测评...
  9. c语言将两个文件合成一个,keil中怎么把两个c程序怎么同时同时编译生成一个hex文件...
  10. 马尔科夫决策过程(MDP) : GridWord(DP)
  11. assert()理解
  12. 游戏策划学习(一)游戏研发基础
  13. 算法:(七)模拟算法
  14. mysql error 1114_ERROR 1114 (HY000): The table 'test1' is full 的解决
  15. Win7 VNC远程连接Centos桌面
  16. 在.NET5 中读取Excel文件,评估下参加神秘献祭会的几位子民
  17. 测试方法介绍-计算模型复杂度(GMac)、模型大小(M)、计算速度(FPS)
  18. HM不只是到处开实体店了,这次它不想错过天猫新零售
  19. 【记录】数据处理方法总结及实现
  20. 1.腾讯轻服务器K3S环境配置

热门文章

  1. 论文阅读笔记:You Only Look Once: Unified, Real-Time Object Detection
  2. Faster R-CNN
  3. 线程池的使用(线程池重点解析)
  4. Redis通信协议(protocol)
  5. Java抽象类与接口的区别
  6. 菜鸟要做架构师(二)——java性能优化之for循环
  7. 谷歌chrome浏览器的源码分析(五)
  8. 卷积神经网络CNN(Convolutional Neural Networks)没有原理只有实现
  9. 鸟哥的Linux私房菜(服务器)- 第十章、申请合法的主机名
  10. 借助混沌工程工具 ChaosBlade 构建高可用的分布式系统