1. 项目背景与核心目标
最近在RockyLinux 8环境下测试了redis-shake工具的数据同步功能,这个经历让我想分享一些实战心得。redis-shake是阿里云开源的一款Redis数据迁移与同步工具,支持多种场景下的数据操作,而RockyLinux作为RHEL的替代发行版,在企业级环境中应用越来越广泛。
这次测试的主要目标是验证redis-shake在不同Redis实例间的数据同步能力,特别是在RockyLinux 8这个相对较新的系统环境下的兼容性和性能表现。通过实际测试,我发现了一些官方文档中没有详细说明的配置技巧和性能优化点,这些经验对于需要在类似环境中实施Redis数据迁移的团队应该会很有帮助。
2. 环境准备与工具安装
2.1 系统环境配置
RockyLinux 8作为测试平台,首先需要确保系统基础环境就绪。我使用的是最小化安装的RockyLinux 8.5版本,内核版本为4.18.0-348.el8.x86_64。建议在开始前执行以下系统更新:
sudo dnf update -y sudo dnf install -y epel-releaseredis-shake是Go语言编写的工具,因此需要安装Go运行环境。在RockyLinux 8上安装Go 1.17+版本的命令如下:
sudo dnf install -y golang验证安装是否成功:
go version2.2 redis-shake获取与编译
可以从GitHub获取redis-shake的最新源码:
git clone https://github.com/alibaba/RedisShake cd RedisShake make编译完成后,会在当前目录生成redis-shake二进制文件。为了方便使用,可以将其移动到系统PATH包含的目录:
sudo mv redis-shake /usr/local/bin/注意:如果遇到编译错误,可能是由于Go版本不兼容导致的。建议使用Go 1.17或更高版本。
3. 同步测试配置详解
3.1 基础同步配置
redis-shake支持多种同步模式,我们主要测试从源Redis到目标Redis的单向同步。创建配置文件sync.conf,内容如下:
source.type: standalone source.address: 192.168.1.100:6379 source.password_raw: source_redis_password target.type: standalone target.address: 192.168.1.101:6379 target.password_raw: target_redis_password # 同步模式配置 sync.type: sync sync.parallel: 32 sync.batch_size: 1024 sync.key_exists: rewrite关键参数说明:
- sync.parallel:并发线程数,根据服务器CPU核心数调整
- sync.batch_size:每次批量同步的数据量
- sync.key_exists:目标端已存在相同key时的处理策略(rewrite表示覆盖)
3.2 性能优化配置
在RockyLinux 8环境下,通过以下配置可以显著提升同步性能:
# 网络优化 http_profile: -1 qps: 1000000 # 内存优化 filter.db.whitelist: 0,1,2 # 只同步指定的DB filter.key.whitelist: "user:*" # 只同步特定模式的key # 日志配置 log.file: /var/log/redis-shake.log log.level: info提示:在大数据量同步场景下,建议将log.level设置为warn或error,减少日志IO对性能的影响。
4. 同步测试执行与监控
4.1 启动同步进程
使用以下命令启动同步任务:
redis-shake -type=sync -conf=sync.conf为了确保进程在后台稳定运行,可以使用nohup结合screen或tmux:
nohup redis-shake -type=sync -conf=sync.conf > /dev/null 2>&1 &4.2 监控同步状态
redis-shake提供了内置的HTTP接口用于监控同步状态。在配置文件中启用http_profile后,可以通过以下命令查看:
curl http://localhost:9320/metric输出示例:
{ "rdb_received_bytes": 12582912, "rdb_parsed_ok": true, "increment_bytes": 3145728, "total_entries": 12543, "full_sync_remaining_bytes": 0, "full_sync_total_bytes": 12582912 }关键指标说明:
- rdb_received_bytes:已接收的RDB文件大小
- increment_bytes:增量同步数据量
- full_sync_remaining_bytes:全量同步剩余数据量
5. 常见问题与解决方案
5.1 网络连接问题
在测试过程中,可能会遇到源Redis或目标Redis连接不稳定的情况。可以通过以下方式排查:
- 检查网络连通性:
telnet 192.168.1.100 6379- 检查Redis配置:
redis-cli -h 192.168.1.100 config get bind redis-cli -h 192.168.1.100 config get protected-mode- 检查防火墙设置:
sudo firewall-cmd --list-ports sudo firewall-cmd --add-port=6379/tcp --permanent sudo firewall-cmd --reload5.2 性能瓶颈分析
当同步速度不理想时,可以从以下几个方面排查:
- 网络带宽:使用iftop或nethogs监控网络流量
- 服务器负载:使用top或htop查看CPU和内存使用情况
- Redis性能:使用redis-cli --latency检测Redis响应时间
优化建议:
- 增加sync.parallel值(不超过CPU核心数的2倍)
- 调整sync.batch_size(建议512-4096之间)
- 在低峰期执行全量同步
5.3 数据一致性验证
同步完成后,建议进行数据一致性检查。可以使用以下方法:
- 使用redis-cli对比key数量:
redis-cli -h 192.168.1.100 dbsize redis-cli -h 192.168.1.101 dbsize- 抽样检查特定key的值:
redis-cli -h 192.168.1.100 get user:1001 redis-cli -h 192.168.1.101 get user:1001- 使用redis-full-check工具进行全量比对(阿里云提供)
6. RockyLinux 8特定优化
在RockyLinux 8环境下,针对redis-shake的性能优化有以下几点经验:
- 内核参数调整:
echo 'net.core.somaxconn = 2048' | sudo tee -a /etc/sysctl.conf echo 'vm.overcommit_memory = 1' | sudo tee -a /etc/sysctl.conf sudo sysctl -p- 文件描述符限制:
echo '* soft nofile 65535' | sudo tee -a /etc/security/limits.conf echo '* hard nofile 65535' | sudo tee -a /etc/security/limits.conf- 使用性能更好的I/O调度器:
echo 'echo deadline > /sys/block/sda/queue/scheduler' | sudo tee -a /etc/rc.local sudo chmod +x /etc/rc.local- 禁用透明大页(THP):
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' | sudo tee -a /etc/rc.local7. 高级功能测试
7.1 断点续传测试
redis-shake支持断点续传功能,这在长时间同步过程中非常有用。测试方法:
- 启动同步任务
- 在同步过程中手动终止redis-shake进程
- 重新启动redis-shake,观察是否从断点处继续
配置文件需要添加:
# 断点续传配置 sync.resume_from_break_point: true break_point_path: /var/lib/redis-shake7.2 多DB同步策略
当源Redis有多个DB需要同步时,可以灵活配置:
# 同步所有DB filter.db.whitelist: "" # 只同步特定DB filter.db.whitelist: 0,1,2 # 排除特定DB filter.db.blacklist: 157.3 Key过滤功能
redis-shake支持基于正则表达式的key过滤:
# 只同步user:开头的key filter.key.whitelist: "user:*" # 不同步temp:开头的key filter.key.blacklist: "temp:*"8. 性能测试数据
在RockyLinux 8环境下,使用不同配置测试了100万条记录的同步性能:
| 配置 | 同步时间 | 平均QPS |
|---|---|---|
| 默认配置 | 12分35秒 | 1,315 |
| 并行度32 | 8分12秒 | 2,032 |
| 并行度64+批量4096 | 5分48秒 | 2,873 |
| 优化网络参数后 | 4分56秒 | 3,378 |
测试环境:
- 服务器:4核8G内存
- 网络:千兆局域网
- Redis版本:6.2.6
- 数据特征:平均key大小128字节,value大小512字节
9. 生产环境部署建议
基于测试经验,给出以下生产环境部署建议:
资源规划:
- 每100GB数据预留至少2核CPU和4GB内存
- 网络带宽应至少是数据量的2倍(考虑RDB传输)
高可用方案:
- 使用supervisor或systemd管理redis-shake进程
- 配置日志轮转,避免日志文件过大
sudo cp RedisShake/logrotate/redis-shake /etc/logrotate.d/监控集成:
- 通过HTTP接口集成到Prometheus监控系统
- 配置关键指标告警(如同步延迟、错误率)
安全建议:
- 使用TLS加密Redis连接
- 配置文件设置适当权限(chmod 600)
- 定期清理断点文件
10. 与其他工具的对比
在RockyLinux 8环境下,redis-shake相比其他Redis同步工具的优势:
| 特性 | redis-shake | redis-migrate-tool | rump |
|---|---|---|---|
| 支持断点续传 | ✓ | × | × |
| 并行同步 | ✓ | ✓ | × |
| Key过滤 | ✓ | × | × |
| 增量同步 | ✓ | ✓ | × |
| 监控接口 | ✓ | × | × |
| RockyLinux 8兼容性 | ✓ | 需要编译 | ✓ |
11. 实际应用场景
根据测试结果,redis-shake在RockyLinux 8环境下特别适合以下场景:
- 跨机房Redis迁移:利用断点续传功能,应对不稳定的跨机房网络
- Redis版本升级:从旧版本同步数据到新版本实例
- 数据拆分:将特定模式的key同步到专用Redis实例
- 灾备建设:建立实时同步的灾备Redis实例
- 云迁移:将本地Redis数据同步到云Redis服务
12. 测试总结与经验分享
经过在RockyLinux 8上的全面测试,redis-shake表现出了良好的稳定性和性能。几个关键经验值得分享:
批量大小(batch_size)对性能影响显著,建议根据网络延迟调整:
- 低延迟环境:1024-4096
- 高延迟环境:512-1024
并行度(parallel)并非越大越好,超过CPU核心数2倍后收益递减
在RockyLinux 8上,禁用透明大页(THP)可减少性能波动
对于TB级数据同步,建议分批次进行,每批不超过500GB
同步过程中监控目标Redis内存使用,避免OOM
最后,建议在正式使用前,先在测试环境进行同等数据量的同步测试,记录基准性能数据,这样在生产环境部署时能更准确地预估时间和资源需求。