MySQL通过go-mysql-transfer实时同步数据到Redis

黄凌龙
2023-12-01

我自己在实践的时候遇到很多坑,把遇到的问题都分享给大家
Linux下:
结合go_mysql_transfer产品手册
在Linux上安装好redis和mysql。
redis安装:
git clone https://gitee.com/mirrors/redis.git -b 6.2
cd redis
make
make test
make install

启动:
mkdir redis-data
把redis文件夹下 redis.conf 拷贝到 redis-data
修改 redis.conf
requirepass 修改密码 123456 //这行可以直接在redis.conf末尾加就行,汉字(修改密码)不要
daemonize yes //这行的好处是可以让redis服务运行在后台
cd redis-data
redis-server redis.conf
通过 redis-cli 访问 redis-server
redis-cli -h 127.0.0.1 -a 123456
上边配置登录密码过程是可选的,如果没配置密码,直接redis_cli即可,若配置了密码也可以redis_cli,但进去之后还需验证密码,输入auth 123456(密码)即可。
#默认安装在 /usr/local/bin
redis-server 是服务端程序
redis-cli 是客户端程序

如果给redis设置了登录密码一定要记住(我的是123456)。//如果没有可忽略
比如你通过redis_cli 登录后并不能直接使用,还需输入命令auth + 密码 (对于我即 auth 123456)

Linux下和Windows上配置主(mysql)从(my_mysql_transfer)关系有一点差异,
实际上my_mysql_transfer就是一个伪数据库,通过配置好与mysql的连接,即可得到mysql的数据信息,然后再同步到Redis。

linux下需配置my.cnf(windows是my.ini),一般my.cnf在/etc/mysql里面。对于linux系统,你可以通过locate /my.cnf 来定位文件
具体配置内容:

//网上是这样教的
log_bin=mysql_bin
binlog_format=ROW
server_id=2
//其实这样会报错,需要在这三行的前边加上[mysqld],如下
[mysqld]
log_bin=mysql_bin
binlog_format=ROW
server_id=2

重点来了,一定一定要重启mysql服务
systemctl status mysqld
有些朋友需要输入systemctl status mysql , 不需要那个d,具体为什么有兴趣可以百度不用纠结。

先下载好my_mysql_transfer(Linux版本的)
点击下载my_mysql_transfer
下载完成后进入目录执行go build

最重要的是去配置my_mysql_transfer的app.yml文件
截取部分app.yml内容
内容配置有几个细节点,首先mysql的密码pass必须要正确;
其次redis的地址不能直接用虚拟机的地址,必须用127.0.0.1,当然如果你用了服务器另谈;
还有很重要的一点,如果安装redis的时候你设置了登录密码, 一定要把(redis_pass: 123456 #redis密码)解开注释,否则连接不上redis,默认是注释掉的;数据库的库名和表名一定要一致

# mysql配置
addr: 127.0.0.1:3306
user: root
pass: Nswdsm58@
charset : utf8
slave_id: 1001 #slave ID
flavor: mysql #mysql or mariadb,默认mysql
#web admin相关配置
enable_web_admin: true #是否启用web admin,默认false
web_admin_port: 8060 #web监控端口,默认8060
#目标类型
target: redis # 支持redis、mongodb、elasticsearch、rocketmq、kafka、rabbitmq
#redis连接配置
redis_addrs: 127.0.0.1:6379 #redis地址,多个用逗号分隔
redis_pass: 123456 #redis密码
#规则配置
rule:
  -
    schema: test #数据库名称
    table: t_user #表名称
 
    lua_file_path: lua/t_user.lua   #lua脚本文件
    #lua_script:   #lua 脚本
    value_encoder: json  #值编码,支持json、kv-commas、v-commas;默认为json

    #redis相关
    redis_structure: string # 数据类型。 支持string、hash、list、set、

接着执行 nohup go-mysql-transfer & (让这个进程在后台工作)
这里可以通过jobs命令查看后台进程数量
重点:如果通过jobs没看到有任务在运行,说明nohup go-mysql-transfer & 失败了,给大家一个调试的方法,直接输入./go-mysql-transfer 它会告诉你哪里有问题,再逐步排查。
到此为止,已经可以同步数据了,对于我这里,在mysql上使用test库,操作t_user表,后去登录redis客户端, 使用keys * 即可看到同步过来的键值, 通过命令get 键值 ,即可看到详细数据。

补充:
go_mysql_transfer首先会在app.yml中寻找规则,如果你没有使用lua脚本配置自定义规则, 它会默认用它自己的规则(可通过观察app.yml这个文件看到默认规则,就我上边的用get来查看键值,可以自己配置成hash的存储方式等等)。

当然如果你想用lua脚本的规则,必须把上边的(lua_file_path: lua/t_user.lua #lua脚本文件)解开注释, 在当前目录下创建一个lua目录, 里面创建一个t_user.lua文件
这样my_mysql_transfer就会按照你配置的lua脚本的规则来同步mysql到redis
我自己的内容:

local ops = require("redisOps")

local row = ops.rawRow()
local action = ops.rawAction()

if action == "insert" or action == "update" then
    local id = row["id"]
    local key = "user:" .. id
    local name = row["nick"]
    local sex = row["sex"]
    local height = row["height"]
    local age = row["age"]
    ops.HSET(key, "id", id)
    ops.HSET(key, "nick", name)
    ops.HSET(key, "sex", sex)
    ops.HSET(key, "height", height)
    ops.HSET(key, "age", age)
elseif action == "delete" then
    local id = row['id']
    local key = "user:" .. id
    ops.DEL(key)
end

如果你采用了我的这个lua配置规则,就需要在redis中用hget 键值 来查看内容,因为我采用的是hash的存储方式。

Windows版本配置规则大同小异

Windows直接运行 go-mysql-transfer.exe

官方文档上写了go_mysql_transfer产品手册
#Linux在my.cnf文件
#Windows在my.ini文件
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 go-mysql-transfer 的 slave_id 重复

常见问题

position问题:
进入mysql,执行 show master status
使用File和Position列的值
执行命令: ./go-mysql-transfer -config app.yml -position binlog.000002 123
windows和linux下编译好的包地址

链接:https://pan.baidu.com/s/1xd_PWKYMWiUcQ1atbPZsYA?pwd=nwz4
提取码:nwz4

遇到过太多障碍,但都一一解决了, 若有任何问题欢迎评论区留言!

 类似资料: