go-mysql-transfer 伪装从库实现 MySQL 到 Redis 数据同步(完整配置)

文章目录

    • [一、go-mysql-transfer 安装与启动](#一、go-mysql-transfer 安装与启动)
      • [1.1 Linux 下编译](#1.1 Linux 下编译)
      • [1.2 Windows 下编译](#1.2 Windows 下编译)
      • [1.3 配置 go-mysql-transfer](#1.3 配置 go-mysql-transfer)
    • [二、MySQL、Redis 环境准备](#二、MySQL、Redis 环境准备)
      • [2.1 MySQL 配置(修改 mysqld.cnf 文件)](#2.1 MySQL 配置(修改 mysqld.cnf 文件))
      • [2.2 redis.conf 配置](#2.2 redis.conf 配置)
    • [三、MySQL 设置](#三、MySQL 设置)
      • [3.1 测试表(SQL)](#3.1 测试表(SQL))
      • [3.2 MySQL 主库状态查询与同步位置设置](#3.2 MySQL 主库状态查询与同步位置设置)
    • 四、数据同步测试

一、go-mysql-transfer 安装与启动

1.1 Linux 下编译

按照以下步骤编译并启动同步服务:

bash 复制代码
# 1. 开启 Go 模块支持(若未全局开启)
GO111MODULE=on
# 2. 克隆项目(备用仓库地址,确保可访问)
git clone https://gitee.com/mirrors/go-mysql-transfer.git
# 3. 设置 GOPROXY 加速依赖下载
go env -w GOPROXY=https://goproxy.cn,direct
# 4. 编译项目生成可执行文件
go build
# 5. 修改配置文件 app.yml(配置 MySQL、Redis 连接信息等,见下文)
# 6. 启动 go-mysql-transfer 同步服务
./go-mysql-transfer

本文用 windows 示范,Linux 下配置同理。

1.2 Windows 下编译

bash 复制代码
git clone https://gitee.com/mirrors/go-mysql-transfer.git

在 go-mysql-transfer 目录下,命令行编译:

bash 复制代码
cd go-mysql-transfer
go env -w GOPROXY=https://goproxy.cn,direct
go build

编译成功后,项目目录下会生成 go-mysql-transfer.exe 可执行文件(Windows 下默认带 .exe 后缀)。

1.3 配置 go-mysql-transfer

在 go-mysql-transfer 目录下,用编辑器打开 app.yml进行配置:

确保 MySQL 配置的 server_id 和 go-mysql-transfer 的 slave_id 不重复(如主库 server_id=1,从库 slave_id=1001)。

这里可以改为 false,避免加载 statics 文件(否则后面启动可能因文件缺失出错)

定义热点数据的规则(测试表user见下文):

同步策略用 lua 脚本写,这里开启:

在 go-mysql-transfer 目录下自行创建 lua 文件夹,以及 t_user.lua进行测试

t_user.lua 脚本内容如下:

lua 复制代码
local ops = require("redisOps") --加载redis操作模块

local row = ops.rawRow() --当前数据库的一行数据,table类型
local action = ops.rawAction() --当前数据库事件,包括:insert、update、delete等

if action == "insert" or action == "update" then -- 只处理插入和更新操作
    local id = row["id"] --获取ID列的值
    local key = "user:" .. id
    local name = row["name"] --获取name列的值
    local sex = row["sex"]
    local weight = row["weight"] --获取weight列的值
    local age = row["age"]
    
    ops.HSET(key, "id", id) -- 对应Redis的HSET命令
    ops.HSET(key, "name", name) -- 对应Redis的HSET命令
    ops.HSET(key, "sex", sex) -- 对应Redis的HSET命令
    ops.HSET(key, "weight", weight) -- 对应Redis的HSET命令
    ops.HSET(key, "age", age) -- 对应Redis的HSET命令
    -- ops.EXPIRE(key, 1800) -- 若需要设置过期时间可取消注释
elseif action == "delete" then
    local id = row["id"]
    local key = "user:" .. id
    ops.DEL(key)
end

二、MySQL、Redis 环境准备

2.1 MySQL 配置(修改 mysqld.cnf 文件)

进入 MySQL 配置文件的目录:

bash 复制代码
cd /etc/mysql/mysql.conf.d/

可以看到有两个MySQL配置文件,我们操作 mysqld.cnf

bash 复制代码
sudo vim mysqld.cnf 

需要开启:

需开启二进制日志 binlog 并设置为 ROW 模式 (保证行级变更同步的精准性),同时配置唯一 server_id(避免与 go-mysql-transferslave_id 冲突):

bash 复制代码
log-bin=/var/log/mysql/mysql-bin.log  # 开启二进制日志
binlog-format=ROW  # 选择 ROW 模式(记录行级数据变更)
server_id=1        # MySQL 复制所需的 server_id,需全局唯一

重启 MySQL:

bash 复制代码
sudo systemctl restart mysql.service

2.2 redis.conf 配置

允许远程机器连接 Redis,需调整 bind 配置:

conf 复制代码
# bind 127.0.0.1 -::1
# 注释掉原配置改为 
bind 0.0.0.0

关闭保护模式(protected-mode 配置)

conf 复制代码
protected-mode no # 关闭保护模式,允许外部连接

保存配置然后启动 Redis:

bash 复制代码
redis-server redis.conf

三、MySQL 设置

3.1 测试表(SQL)

先创建 user 表,后面测试时再执行增删改操作(用于触发同步流程):

sql 复制代码
-- 若表已存在则删除
DROP TABLE IF EXISTS `user`;
-- 创建 user 表
CREATE TABLE `user` (
 `id` BIGINT,
 `name` VARCHAR (100),
 `weight` SMALLINT,
 `sex` VARCHAR (1),
 `age` INT8,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.2 MySQL 主库状态查询与同步位置设置

执行 SQL 查询 Master 状态(获取 binlog 文件名和偏移量):

sql 复制代码
show master status;

windows 命令行进入 go-mysql-transfer目录,快捷方式:文件资源管理器的地址栏 中直接输入 cmdpowershell ,然后按回车

假设查询结果为:日志名 mysql-bin.000002、偏移量 1350,则通过以下命令重置从数据库的同步起始位置:

bash 复制代码
go-mysql-transfer.exe -config app.yml -position mysql-bin.000002 1350

首次全量数据同步(将 MySQL 已有数据同步到 Redis):

bash 复制代码
go-mysql-transfer.exe -stock

如果是在 linux 下:

bash 复制代码
./go-mysql-transfer -config app.yml -position mysql-bin.000002 1350
./go-mysql-transfer -stock

此时表中还没有插入数据,所以导入数据0条。


四、数据同步测试

原理图:

Redis 和 MySQL 中都没有数据

运行 go-mysql-transfer:

bash 复制代码
go-mysql-transfer.exe

现在往 MySQL 中写入数据:

sql 复制代码
-- 插入、更新、删除测试数据
insert into `user` values (10001, 'gulu', 200, '0', 20);
update `user` set `age` = 21 where id = 10001;
delete from `user` where id = 10001;

Redis 中可以查到对应数据,说明数据已经通过伪装从库 go-mysql-transfer 同步到 Redis 中

相关推荐
天选之女wow几秒前
【Hard——Day8】65.有效数字、68.文本左右对齐、76.最小覆盖子串
linux·运维·redis·算法·leetcode
chushiyunen8 分钟前
redis命令 geo(对地理坐标的支持)
数据库·redis·缓存
baivfhpwxf202313 分钟前
删除数据表SQL,不是删除数据,是删除表结构
数据库·sql
码界奇点1 小时前
深入解析MySQL6存储过程游标与触发器的实战应用与性能优化
数据库·sql·性能优化·七牛云存储
数据知道1 小时前
FastAPI项目:从零到一搭建一个网站导航系统
python·mysql·fastapi·python web·python项目
鸽鸽程序猿1 小时前
【Redis】List类型介绍
数据库·redis·list
帅中的小灰灰1 小时前
C++编程观察者设计模式
数据库·c++·设计模式
2501_941664961 小时前
云计算与边缘计算:新时代数字化转型的双轮驱动
数据库
x***58701 小时前
GitHub星标10万+的Redis项目,使用教程
数据库·redis·github
Leon-Ning Liu1 小时前
MySQL 5.7大表索引优化实战:108GB数据建索引效率提升50%
运维·数据库·mysql