《高性能Linux服务器构建实战》——3.4节通过UDFs实现Memcached与MySQL的自动更新

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本节书摘来自华章社区《高性能Linux服务器构建实战》一书中的第3章,第3.4节通过UDFs实现Memcached与MySQL的自动更新,作者:高俊峰,更多章节内容可以访问云栖社区“华章社区”公众号查看

3.4 通过UDFs实现Memcached与MySQL的自动更新

3.4.1 UDFs使用简介
UDFs是User Defined Functions的缩写,表示MySQL的用户定义函数,应用程序可以利用这些函数从MySQL 5.0以上版本的数据库中访问Memcached写入或者获取的数据。此外,MySQL从5.1版本开始支持触发器,从而可以在触发器中使用UDFs直接更新Memcached的内容,这种方式降低了应用程序设计和编写的复杂性。下面简单介绍UDFs的安装和使用。
安装UDFs需要在数据库服务器上安装两个包,分别是libmemcached和memcached_functions_mysql,这两个包都可以从http://download.tangent.org/下载。安装过程如下。
1)需要的软件有memcached-1.2.6、libevent-1.4.4-stable、libmemcached-0.30,这些软件的安装非常简单,因此不做说明。
2)安装mysql5.1,也不做说明。
3)安装memcached_functions_mysql。基本步骤如下:

[root@web181 ~]#wget http://download.tangent.org/memcached_functions_mysql-0.9.tar.gz
[root@web181 ~]#tar zxvf memcached_functions_mysql-0.9.tar.gz
[root@web181 ~]#cd memcached_functions_mysql-0.9
[root@web181 memcached_functions_mysql-0.9]#./configure \
>--with-mysql=/usr/local/mysql51/bin/mysql_config
[root@web181 memcached_functions_mysql-0.9]#make && make install
AI 代码解读

首次需要使用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命令,查看安装是否成功。

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_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 | 
+------------------------------+---------------------------------+
32 rows in set (0.00 sec)
AI 代码解读

3.4.2 memcached_functions_mysql应用实例
下面通过一个具体的实例来演示memcached_functions_mysql的使用方法。
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`)
);
AI 代码解读

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 ;
AI 代码解读

当对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 ;
AI 代码解读

当对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 ;
AI 代码解读

3.设置Memcached相关参数
设置UDFs操作Memcaced服务器的IP地址和端口。

mysql>SELECT memc_servers_set('192.168.1.184:11900');
+---------------------------------------+
| memc_servers_set('192.168.1.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)
AI 代码解读

在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
AI 代码解读

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)
AI 代码解读

3.4.3 对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.1.184 11900
Trying 192.168.1.184...
Connected to 192.168.1.184 (192.168.1.184).
Escape character is '^]'.
get 1
VALUE 1 0 22
http://www.test.com.cn
END
AI 代码解读

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.1.184 11900
Trying 192.168.1.184...
Connected to 192.168.1.184 (192.168.1.184).
Escape character is '^]'.
get 1
VALUE 1 0 23
http://blog.test.com.cn
END
AI 代码解读

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.1.184 11900
Trying 192.168.1.184...
Connected to 192.168.1.184 (192.168.1.184).
Escape character is '^]'.
get 1
END
AI 代码解读

3.4.4 使用memcached_functions_mysql的经验与技巧
memcached_functions_mysql使用起来比较简单,但是由于环境的差别,在实践过程中可能会遇到诸多的问题。下面总结了一些在使用memcached_functions_mysq过程中可能出现的问题和注意事项。

  1. 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应用于生产环境,需要考虑监控和出现问题时的恢复工作(写好脚本以完善这个工作)。

  1. MySQL自身因素
    如执行的MySQL语句的效率以及连接MySQL的client程序(php)的连接开销等,这些问题都需要考虑。
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
1408
分享
相关文章
|
23天前
|
Websoft9:为开发者打造的高效 Linux 服务器面板
Websoft9 是一款以开源应用部署与管理为核心的服务器面板,采用“环境即服务”模式。它通过运行环境标准化、自动化配置、安全融合和资源管理四个方面实现平台与环境的深度协同。支持多语言框架预集成、云原生组件整合,提供 200+ 应用模板一键部署,并具备全流程安全防护和统一资源监控能力,助力开发者高效管理和扩展应用环境。
48 0
|
9天前
|
Linux系统管理:服务器时间与网络时间同步技巧。
以上就是在Linux服务器上设置时间同步的方式。然而,要正确运用这些知识,需要理解其背后的工作原理:服务器根据网络中的其他机器的时间进行校对,逐步地精确自己的系统时间,就像一只犹豫不决的啮齿动物,通过观察其他啮齿动物的行为,逐渐确定自己的行为逻辑,既简单,又有趣。最后希望这个过程既能给你带来乐趣,也能提高你作为系统管理员的专业素养。
48 20
【限时特惠】阿里云服务器7折抢购!高性能+高性价比,开发者与企业必备攻略
阿里云服务器限时7折特惠,高性能、高性价比,为开发者和企业量身打造!新老用户均可参与,灵活配置满足多种需求,全球节点低延迟覆盖。自研神龙架构保障稳定性,安全防护全面,操作便捷,生态丰富。适用于个人开发、企业部署、跨境业务及AI计算等场景。点击专属链接立即抢购,活动名额有限,速来享受云端算力带来的高效体验!
43 0
Linux云服务器如何搭建LNMP环境
LNMP环境是Linux系统中常用的Web服务架构,由Linux、Nginx、MySQL/MariaDB和PHP组成,适用于高效托管动态网站。本文以CentOS 7为例,详细介绍了LNMP环境的搭建步骤,包括Nginx、MariaDB和PHP的安装与配置,以及最终通过创建`index.php`文件验证环境是否成功部署。具体操作涵盖配置YUM仓库、安装服务、编辑配置文件、启动服务等关键步骤,确保用户能够顺利搭建并运行LNMP环境。
53 1
Linux云服务器如何搭建LNMP环境
深度体验阿里云系统控制台:SysOM 让 Linux 服务器监控变得如此简单
作为一名经历过无数个凌晨三点被服务器报警电话惊醒的运维工程师,我对监控工具有着近乎苛刻的要求。记得去年那次大型活动,我们的主站流量暴增,服务器内存莫名其妙地飙升到90%以上,却找不到原因。如果当时有一款像阿里云 SysOM 这样直观的监控工具,也许我就不用熬通宵排查问题了。今天,我想分享一下我使用 SysOM 的亲身体验,特别是它那令人印象深刻的内存诊断功能。
Linux服务器部署docker windows
在当今软件开发中,Docker成为流行的虚拟化技术,支持在Linux服务器上运行Windows容器。流程包括:1) 安装Docker;2) 配置支持Windows容器;3) 获取Windows镜像;4) 运行Windows容器;5) 验证容器状态。通过这些步骤,你可以在Linux环境中顺利部署和管理Windows应用,提高开发和运维效率。
97 1
云数据库:从零到一,构建高可用MySQL集群
在互联网时代,数据成为企业核心资产,传统单机数据库难以满足高并发、高可用需求。云数据库通过弹性扩展、分布式架构等优势解决了这些问题,但也面临数据安全和性能优化挑战。本文介绍了如何从零开始构建高可用MySQL集群,涵盖选择云服务提供商、创建实例、配置高可用架构、数据备份恢复及性能优化等内容,并通过电商平台案例展示了具体应用。
2025年阿里云企业高性能云服务器租用价格与选型详解
随着企业数字化转型,阿里云于2025年推出多款高性能云服务器实例,涵盖计算、通用和内存密集型场景。文章分析了企业选择云服务器的核心要点,包括明确业务需求(如计算密集型任务推荐计算型实例)、性能与架构升级(如第八代实例性能提升20%),以及第九代实例支持AI等高算力需求。同时提供了配置价格参考和成本优化策略,助力企业实现效率与成本的最优平衡。
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
推荐几个不错的 Linux 服务器管理工具
推荐几个不错的 Linux 服务器管理工具
307 6

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等