文档章节

redis-port的原理及其使用

韩氏集团
 韩氏集团
发布于 2017/02/23 09:07
字数 1420
阅读 582
收藏 0

1. redis 集群的扩容与收缩,最经典的需求

2. 数据异构同步,从 redis 到 mysql等等

3. redis 原有集群的拆分,按业务线打散成多个集群

4. redis 当前内存使用,key占比分析

5. 无用数据的检测和清除

6. 对于 rdb 文件的备份

redis-port原理

简单来说,就是把自已伪装成 slave, 欺骗master来达到数据流同步的目地。

发送sync命令->接收rdb->解析rdb->过滤->回放rdb->回放master推送的同步数据。

1. 支持 psync,例如 --psync 。

2. 从 master 获取 rdb+backlog 速度过慢,可导致 master 主动关闭连接。可以结合 --sockfile=buffer.tmp  --filesize=64GB 参数,这样能使用一个最大 64GB 的文件作为缓冲(循环写,自动释放),能加速 rdb+backlog 的获取,口味更佳。

3. 向 slave restore 的速度,可以通过增加 CPU 以及增加并发连接数实现,分别是 --ncpu=4   --paralle=32。

4. 其实,使用 psync 的话,port 和 master 之间就有 position 的概念了,可以减少同步失败的发生情况,redis-port 会自动重试直到不能。

注意事项

1. 同步时有两个 redis 参数需要注意。

repl-backlog-size 

同步buffer的大小,默认1mb,根据当前数据量大小适当调整,比如10mb。

client-output-buffer-limit

client slave 级别的buffer也要调整,比如 client-output-buffer-limit slave 256mb 128mb 60 。

2. restore 操作只要目标集群存在指定Key,就会fatal,如果没问题可以在代码中去掉err检测。

3. 使用伪装slave的机制,redis-port一定要轮流同步,同时bgsave可不好玩。

4. 代码修改成通用的工具,每次改代码逻辑容易出问题,from和target一定要确认好。

5. 同步时由于源数据量太大,可能工具会中断,调整redis-port并发数和redis上面提到的两个buffer就好。

安装

1、安装redis-port

# go get github.com/CodisLabs/redis-port/releases

默认会下载在/usr/local/src/github.com/CodisLabs下,或者可以在github.com上下载redis-port的新版本。

安装依赖

# go  get  github.com/cupcake/rdb

将下载的版本解压重命名为redis-port后,放到codis安装的同级目录下,例如我的codis安装在

/usr/local/go/src/github.com/CodisLabs,那么将redis-port放到这个目录下即可。

# cd   /usr/local/go/src/github.com/CodisLabs/redis-port/

# make

# ll  /usr/local/go/src/github.com/CodisLabs/redis-port/bin/

total 4920

-rwxr-xr-x. 1 root root 5037040 May 12 11:08 redis-port

redis-port参数说明:

-n N, --ncpu=N

set runtime.GOMAXPROCS to N

-p M, --parallel=M

set number of parallel routines

-i INPUT, --input=INPUT

use INPUT as input file, or if it is not given, redis-port reads from stdin (means '/dev/stdin')

-o OUTPUT, --output=OUTPUT

use OUTPUT as output file, or if it is not given, redis-port writes to stdout (means '/dev/stdout')

-m MASTER, --master=MASTER

specify the master redis

-t TARGET, --target=TARGET

specify the slave redis (or target redis)

-P PASSWORD, --password=PASSWORD

specify the redis auth password

-A AUTH, --auth=AUTH

specify the auth password for target

-e, --extra

dump or restore following redis backlog commands

--redis

target is normal redis instance, default value is false

--codis

target is codis proxy, default value is true

--filterdb=DB

filter specifed db number, default value is '*'

 

DECODE dumped payload to human readable format (hex-encoding)

redis-port  decode   [--ncpu=N]  [--parallel=M]  [--input=INPUT]  [--output=OUTPUT]

 

RESTORE rdb file to target redis

redis-port   restore   [--ncpu=N]   [--parallel=M]   [--input=INPUT]   --target=TARGET   [--codis|--redis]    [--auth=AUTH]   [--extra]  [--faketime=FAKETIME]   [--filterdb=DB]

 

DUMP rdb file from master redis

redis-port   dump  [--ncpu=N]  [--parallel=M]   --from=MASTER   [--password=PASSWORD]   [--output=OUTPUT]  [--extra]

 

SYNC data from master to slave

redis-port   sync  [--ncpu=N]   [--parallel=M]   --from=MASTER   [--password=PASSWORD]   [--psync]

[--filterdb=DB]   --target=TARGET   [--auth=AUTH]  [--codis|--redis]  [--sockfile=FILE  [--filesize=SIZE]] 

 

2、使用redis-port

1)同步原生redis 192.168.34.6:7000 到codis 192.168.34.6:19000,目标是 codis-proxy。

# ./redis-port  sync  --from=192.168.34.6:7000  --codis  --target=192.168.34.6:19000  -n  1

2015/05/12 17:54:11 [INFO] set ncpu = 1, parallel = 1

2015/05/12 17:54:11 [INFO] sync from '192.168.34.6:7000' to '192.168.34.6:19000'

2015/05/12 17:54:11 [INFO] rdb file = 345

2015/05/12 17:54:11 [INFO] total=345 -          345 [100%]  entry=38         

2015/05/12 17:54:11 [INFO] sync rdb done

2015/05/12 17:54:12 [INFO] sync:  +forward=0      +nbypass=0      +nbytes=0

2015/05/12 17:54:13 [INFO] sync:  +forward=0      +nbypass=0      +nbytes=0

2015/05/12 17:54:14 [INFO] sync:  +forward=0      +nbypass=0      +nbytes=14

 

2)使用redis-port  decode  redis/codis rdb文件。

# cat  /test/dump.rdb |./redis-port  decode  2> /dev/null

{"db":0,"type":"string","key":"a","value":"hello"}

{"db":1,"type":"string","key":"a","value":"9"}

{"db":0,"type":"hash","key":"c","field":"hello","value":"world"}

{"db":0,"type":"expire","key":"c","expireat":1487663341422}

{"db":0,"type":"list","key":"b","index":0,"value":"hello"}

{"db":0,"type":"list","key":"b","index":1,"value":"world"}

 

将rdb文件decode到文件中。

# cat  dump99.rdb |./redis-port   decode  -o  save99.log  -n  1  2> /dev/null

 

3)使用redis-port  restore  rdb文件到codis。

# ./redis-port  restore  -i   dump.rdb   --codis   --target=192.168.34.6:19000  -n  1

2015/05/13 12:01:29 [INFO] set ncpu = 1, parallel = 1

2015/05/13 12:01:29 [INFO] restore from '/test/dump.rdb' to '192.168.34.6:19000'

2015/05/13 12:01:29 [INFO] total = 363 -          363 [100%]  entry=40         

2015/05/13 12:01:29 [INFO] restore: rdb done

 

将redis实例中的rdb文件转成其他格式文件。

#./redis-port  dump  -f  192.168.34.6:7000  |  tee   save.rdb | ./redis-port   decode  -o  save.log  -n  8 2>/dev/null

2017/02/22 14:30:17 main.go:178: [INFO] set ncpu = 1, parallel = 1

2017/02/22 14:30:17 dump.go:29: [INFO] dump from '192.168.34.6:7000' to '/dev/stdout'

2017/02/22 14:30:17 main.go:178: [INFO] set ncpu = 1, parallel = 1

2017/02/22 14:30:17 decode.go:45: [INFO] decode from '/dev/stdin' to 'save.log'

2017/02/22 14:30:17 dump.go:42: [INFO] rdb file = 147

2017/02/22 14:30:17 dump.go:94: [INFO] total = 147 -          147 [100%]

2017/02/22 14:30:17 dump.go:96: [INFO] dump: rdb done

2017/02/22 14:30:17 decode.go:114: [INFO] decode: total =          147  write=325           entry=5          

2017/02/22 14:30:17 decode.go:116: [INFO] decode: done

4)使用redis-port  dump  codis-server生成rdb 文件。

# ./redis-port  dump  -f  192.168.34.6:6379  -o  dump88.rdb

2015/05/13 12:10:58 [INFO] set ncpu = 1, parallel = 1

2015/05/13 12:10:58 [INFO] dump from '192.168.34.6:6379' to 'dump88.rdb'

2015/05/13 12:10:58 [INFO] rdb file = 363

2015/05/13 12:10:58 [INFO] total = 363 -          363 [100%]

2015/05/13 12:10:58 [INFO] dump: rdb done

 

参考:

https://github.com/wandoulabs/redis-port

欢迎加入343595434Codis技术交流群,一起解决问题!

© 著作权归作者所有

韩氏集团
粉丝 0
博文 3
码字总数 9539
作品 0
运维
私信 提问
Redis应用学习——Redis Cluster的集群伸缩

集群伸缩原理 1. 集群伸缩:即集群中节点的增加和减少,在集群伸缩的同时,也伴随着槽位及槽位中数据在节点之间的移动 2. 集群扩容原理: 首先要准备好新的节点:依据上一篇博客中的集群节点...

江左煤郎
2018/11/05
51
0
docker 容器间通信(link)

docker的link是通过使用容器的ip地址来实现多容器之间通信的。关于link在宿主主机网络上的实现原理不在这里介绍。 link格式 测试 由于redis天然的c/s结构和较小的体积,暂用redis测试 下载r...

小昭归来
2016/10/25
217
0
ubuntu14下搭建ssdb主从环境

在工作中接触到了redis,Redis是一个非常高效的key-value的数据库,在项目中广泛使用,但是redis很明显的缺点是对于内存的处理,在项目上线之初,必须对内存规划合理,否则很容易出现内存爆了...

Constants
2014/05/11
5.3K
3
【NoSQL】使用consul和sentinel搭建redis的高可用系统

背景: 传统redis高可用方案只加了sentinel,在主库故障后,虽然可以选主,然后切换只读 参数,但是,对应用来说却需要更改连接的IP或者在hosts中更改解析。算得上是半自动。利用consul系统的...

angry_frog
2017/12/29
0
0
redis高可用架构

一、背景 公司的业务在大量的使用redis,访问量大的业务我们有在使用codis集群,redis 3.0集群,说到redis 3.0集群,我们线上已经跑了半年多了,集群本身没有出现过任务问题,但是由于我们这...

navyaijm2012
2016/02/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
25分钟前
6
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
37分钟前
3
0
jenkins 插件下载加速最终方案

推荐做法 1、告诉jenkins 我哪些插件需要更新 jenkins插件清华大学镜像地址 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 1.进入jenkins系统管理 2.进入插件管...

vasks
42分钟前
4
0
composer爆错:zlib_decode():data error

解决办法:先用 composer diagnose 命令检测 然后 composer self-update 更新composer版本 最后执行 composer update 或者 composer install composer 切换阿里云镜像 用起来还快 composer c...

koothon
49分钟前
4
0
shangcheng-my

1.数据库主键、外键类型为bigint,那么在后台应该用什么类型的变量定义? 后台用string接收,因为前段传过来的一般都是json字符串,后台直接接收,mysql是可以吧数字类型的字符串转换为对应的...

榴莲黑芝麻糊
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部