Redis 主从复制、同步工具redis-shake及批量数据构造
一、Redis主从复制
1. 主从复制的架构分一主一从和一主多从,主从复制的作用有数据备份和读写分离,主从复制分全量复制和增量复制;
2. 主从复制的两个属性
runid:从节点第一次请求复制主节点的时候,主节点会返回runid值;
offset:当前数据的偏移量,从节点请求复制主节点的时候,会携带offset值,让主节点返回从这个偏移量之后的数据;
3. 全量复制
A. 建立连接后,从节点向主节点发送psync命令,请求同步,携带runid和offset值,如果是第一次同步,值为?和-1;
B. 主节点收到psync请求后,发现runid=?和offset=-1,则知道从节点想全量复制,于是返回自己的runid和offset值;
C. 主节点执行bgsave,生成RDB文件,在此期间生成的命令全部放到buffer中,RDB生成完后传送给从节点;
D. 从节点收到RDB文件后,首先清除自己的数据,然后将RDB文件加载到内存;
E. 主节点再把缓冲区的数据发送给从节点;
F. 从节点再把缓冲区的命令加载到内存。
4. 增量复制
如果由于网络问题出现抖动或连接断开,则会导致主从复制不同步,所以当网络连接正常时,则主从之间将发生增量复制;
A. 从节点向主节点发送psync命令,携带已保存的runid和offset值;
B. 主节点判断runid是否和自己的runid一致,如果不一致则执行全量同步,同时判断offset值是否在环形缓冲区内,如果不在则执行全量同步,否则执行增量同步。
二、Redis-Shake
1. Redis-Shake介绍
A. redis-shake是阿里云开源的用于Redis之间数据迁移与过滤的工具,支持解析、恢复、备份和同步功能;
B. 基本原理:
2. 数据同步Docker版实战
A. 前往官网下载最新版本3.1.11包 redis-shake-linux-amd64.tar.gz
B. Dockerfile(记得给redis-shake赋权限,否则启动报错)
FROM busybox COPY redis-shake /usr/local/bin/redis-shake COPY sync.toml /etc/sync.toml CMD /usr/local/bin/redis-shake /etc/sync.toml
C. docker-compose.yml
services: # Redis同步 redis-shake: image: redis-shake:3.1.11 container_name: redis-shake hostname: redis-shake restart: on-failure command: [ "/bin/sh" "-c" "/usr/local/bin/redis-shake" "/etc/sync.toml" "/etc/filter/key.lua" ] networks: - rws-network volumes: - /data/redis-shake/conf/sync.toml:/etc/sync.toml - /data/redis-shake/filter/key.lua:/etc/filter/key.lua - /etc/localtime:/etc/localtime
D. 启动命令:/usr/local/bin/docker-compose -f /configs/redis-shake-compose.yml up -d
E. 日志信息,分三阶段
阶段一:RDB备份日志
阶段二:全量复制日志
阶段三:增量复制日志
F. 过滤指定key(key.lua)
function filter(id, is_base, group, cmd_name, keys, slots, db_id, timestamp_ms) -- 过滤配置文件的数据同步 if cmd_name == "SET" and keys[1] == "system:license:type" then return 1, db_id else return 0, db_id end end
三、Redis批数据构造
1. shell脚本如下,bash test.sh 1
#!/bin/bash
function shell_batch() {
for ((i=0;i<100000;i++))
do
echo -en "test-2023-06-26-rhxy-$i" | redis-cli -h 127.0.0.1 -p 6379 -a 123456 -x set test-windows-$i >> redis.log
done
}
function pipe_batch() {
for ((i=0;i<100000;i++))
do
echo "set test-windows-$i test-2023-06-26-rhxy-$i" >> redis_test_commmand.txt
done
while read line
do
command_array=($line)
printf "*${#command_array[@]}\r\n"
for command in $line
do
printf "\$${#command}\r\n$command\r\n"
done
done < redis_test_commmand.txt > redis_test_data.txt
cat ./redis_test_data.txt | redis-cli -h 127.0.0.1 -p 6379 -a 123456 --pipe
}
if [[ $1 == 2 ]]
then
shell_batch
else
pipe_batch
fi
echo "100000条test开头的数据构造完毕!"
2. 上述脚本采用了两种方式,一种是shell脚本构造,另一种就是Redis pipe方式构造,你会发现方式二速度很快,方式一花费时间与方式二完全不在一个层次。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
2020-04-06 Linux 防火墙(Firewall/Iptables)
2020-04-06 MySQL 安装/常见错误