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常用工具之-redis-shake

 

三、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方式构造,你会发现方式二速度很快,方式一花费时间与方式二完全不在一个层次。

 

posted @ 2022-04-06 17:44  如幻行云  阅读(454)  评论(0编辑  收藏  举报