Gearman实现redis和MySQL同步

本文介绍如何使用Gearman实现实时数据同步,重点讲解了在lnmp架构下,利用Gearman作为中间件,实现MySQL和Redis之间的数据同步。通过在MySQL端设置触发器,当数据更新时,能及时通知Gearman,进而由Gearman调度Worker进行数据同步操作。

实验环境

主机名功能
server1worker端
server3client端

一.Gearman运行过程

一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。

  • Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。
  • Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Worker。
  • Worker:请求的处理者,可以是 C,PHP,Perl 等等。

因为 Client,Worker 并不限制用一样的语言,所以有利于多语言多系统之间的集成。
甚至我们通过增加更多的 Worker,可以很方便的实现应用程序的分布式负载均衡架构。

二.Gearman实现redis和MySQL同步

lnmp网站服务器架构实现redis做MySQL的缓存
详细步骤参见博客:https://blog.youkuaiyun.com/chaos_oper/article/details/90183482
但是当更新MySQL数据库中数据时,redis缓存内容并未同步更新!
如何解决这个问题?
mysql 端更改数据后通过触发器 (插件) 提交, 最后提交给geramand(server端) 提交给worker端口(php-gearman/php-redis) 最后提交给redsi 同步成功。

client 端:

1.下载解压工具

yum install unzip -y

2.下载udf-json函数并解压

unzip lib_mysqludf_json-master.zip

3.安装mariadb-devel

rpm -qa | grep mariadb-devel 	
yum install mariadb-devel -y

在这里插入图片描述
4.安装编译软件gcc

yum install gcc -y 

5.进入解压后的 lib_mysqludf_json-master目录进行编译

gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

在这里插入图片描述
6.将lib_mysqludf_json.so复制到/usr/lib64/mysql/plugin/下

cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/

在这里插入图片描述
7.进入数据库查看

show global variables like 'plugin_dir'

在这里插入图片描述
8.下载并安装相关软件

yum install -y libevent-devel-2.0.21-4.el7.x86_64.rpm libgearman-*

在这里插入图片描述
9.下载并解压gearman-mysql-udf-0.6.tar.gz

tar zxf gearman-mysql-udf-0.6.tar.gz

10.进入到解压后的目录 gearman-mysql-udf-0.6后,编译

./configure --libdir=/usr/lib64/mysql/plugin/ --with-mysql

在这里插入图片描述
11.make && make install
12.进入数据库注册udf函数

CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';

在这里插入图片描述
在这里插入图片描述
13.创建函数

CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so'

14.查看是否创建成功

select * from mysql.func;

在这里插入图片描述
15.指定gearmand的服务信息

SELECT gman_servers_set('172.25.13.1:4730');

在这里插入图片描述
16.修改test.sql并导入到数据库中

mysql -p < test.sql

在这里插入图片描述
17.进入数据库后查看触发器

show triggers from test;

在这里插入图片描述
work端:
1.安装gearman并开启

systemctl start gearmand

2.查看gearman端口

netstat -tnlp

在这里插入图片描述
3.在/usr/local/目录下编辑测试页面:

vim worker.php 

在这里插入图片描述
4.后台运行

nohup php /usr/local/worker.php &> /dev/null &

测试:
1.在client端更新mysql数据库的数据:

update test set name='redhat' where id=3;

在这里插入图片描述
2.浏览器访问172.25.13.1.数据同步成功!
在这里插入图片描述

### 如何结合 Redis MySQL 实现混合或多模式的数据存储架构 #### 架构概述 Redis 是一种高性能的内存级键值存储系统,适用于快速读写的场景,而 MySQL 则是一种支持 ACID 特性的关系型数据库,适合用于持久化存储复杂的事务处理。两者可以结合起来形成一个多模式数据存储架构,利用各自的优势来满足不同的业务需求。 这种架构的核心在于将 Redis 作为缓存层,用来加速频繁访问的数据请求,同时将 MySQL 作为后台的持久化存储,确保数据的安全性可靠性[^1]。 --- #### 技术实现细节 ##### 数据分层设计 - **热数据存储于 Redis** 将高频访问的小量数据(如用户会话、计数器、排行榜等)存储到 Redis 中,这些数据通常具有较高的时间敏感度较低的持久化要求[^3]。 - **冷数据存储于 MySQL** 对于需要长期保存或者涉及复杂查询的关系型数据,则将其存储在 MySQL 中。这类数据可能包括订单记录、交易历史或其他结构化的业务信息。 ##### 同步机制 为了保持 Redis MySQL 的数据一致性,可以通过以下方式实现: - **异步复制** 使用 Gearman 或其他消息队列工具完成从 MySQLRedis 的增量同步过程。当 MySQL 中的数据发生变化时,触发相应的事件通知 Redis 更新其对应的缓存条目。 - **定期刷新策略** 配置定时任务周期性地扫描 MySQL 表中的最新改动,并据此调整 Redis 缓存的内容。这种方法虽然简单易行,但在高并发环境下可能会引入额外开销[^4]。 - **双写控制逻辑** 应用程序层面负责协调两次写入操作——即先修改 MySQL 主库后再更新关联的 Redis 键值对。尽管如此,仍需注意可能出现的时间窗口竞争条件以及网络分区带来的潜在风险。 --- #### 故障恢复与高可用保障措施 考虑到分布式系统的固有特性及其运行过程中不可避免的各种异常状况,必须提前规划好应对策略以降低服务中断概率并缩短修复时间窗期长度: - **主备切换方案** 基于 Keepalived 工具配合 VRRP 协议构建虚拟 IP 地址漂移功能, 当检测到当前活动节点失效后能够迅速迁移至备用实例继续提供正常的服务响应[^2]. - **冗余副本维护** 不仅限于单一组件内部实施主从复制拓扑结构(比如 Redis Sentinel / Cluster 模式), 还应该跨不同类型的数据库间建立多层次保护屏障, 确保即使某一部分发生不可逆损坏也能依靠剩余部分重建完整的业务视图. --- ```python import redis from mysql.connector import connect def fetch_data_from_cache(key): r = redis.Redis(host='localhost', port=6379, decode_responses=True) value = r.get(key) if not value: conn = connect(user='root', password='', host='127.0.0.1', database='test') cursor = conn.cursor() query = f"SELECT * FROM users WHERE id={key}" cursor.execute(query) result = cursor.fetchone() if result: r.set(str(result[0]), str(result)) return str(result) return value or 'Not Found' ``` 上述代码片段展示了如何优先尝试从 Redis 获取指定用户的详细资料; 如果未命中则回退至 MySQL 查询原始记录并将结果重新加载进缓存以便下次更快返回相同请求的结果集. --- #### 性能优化建议 最后值得一提的是,在实际部署之前还应充分考虑以下几个方面的因素来进行必要的参数微调工作: - 调整最大连接数限制(`max_connections`)以适应预期负载水平. - 开启管道传输(pipelining)减少往返延迟影响效率表现. - 设置合理的过期策略(TTL),防止无意义占用宝贵资源空间浪费现象的发生. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值