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 中

相关推荐
谅望者3 小时前
SQL 自连接详解:当数据表需要与自己对话(组织层级实战)
数据库·sql·mysql·oracle·database
姚远Oracle ACE3 小时前
解读 “SQL ordered by Physical Reads (UnOptimized)“
数据库·sql·oracle
山峰哥3 小时前
KingbaseES 表空间与模式优化策略深度研究报告
开发语言·数据结构·数据库·oracle·深度优先
九转苍翎4 小时前
深入解析MySQL(6)——存储过程、游标与触发器
数据库·mysql
武子康4 小时前
Java-164 MongoDB 认证与权限实战:单实例与分片集群 整体认证配置实战 最小化授权/错误速查/回滚剧本
java·数据库·分布式·mongodb·性能优化·系统架构·nosql
金仓拾光集4 小时前
《MongoDB 重建索引要锁库?金仓却能边跑边修》
数据库·mongodb·kingbase·kingbasees·数据库平替用金仓·金仓数据库
金仓拾光集4 小时前
金仓数据库平替MongoDB:医共体数据互通的高效安全之道
数据库·安全·mongodb·kingbase·kingbasees·数据库平替用金仓·金仓数据库
南棱笑笑生4 小时前
20251031在Ubuntu24.04.2中文版下使用diff命令查找两份SDK的差异并删除同样的部分以便比对awk
数据库·sqlserver