(0)Redis-port原理:

首先是看到下面这篇文档开始研究的redis-port

http://www.itnpc.com/news/web/146085373656602.html  简要截图如下:

上面的两点实际上是实现4个功能,在redis-port安装包README.md的文档中也有介绍

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

* **RESTORE** rdb file to target redis

* **DUMP** rdb file from master redis

* **SYNC** data from master to slave

静态分析RDB文件就是指:decode

解析以及恢复RDB是指:restore

从redis上dumpRDB是指:dump

redis和codis同步数据是指:sync

所以按照README.md的说法看就是将redis-port以slave身份同步redis上的数据到codis

简书上赶集网DBA写了一篇关于redis-port的使用文章很受益,指路:

http://www.jianshu.com/p/a5eec15de485

(1)为方便看我下面的文档,铺一下我的部署情况如下:

IP

主机名

zookeeper

codis

redis

mysql

192.168.6.11

wyt1

follower

proxy:19002、slot2对应group2:codis-server8001(主)8002(从)

redis-server:6001

slave:6666

192.168.6.10

wyt2

leader

dashboard:18080、proxy:19001、fe:8080、slot1对应group1:codis-server7001(主)7002(从)

master:6666

192.168.6.9

wyt3

follower

slave:6666

(2)准备好redis上需要导入codis的数据

(保证key没有和codis封装的redis重复,有重复的就会以新导入的redis上的为准,因为这里是重新解读rdb文件,原有的codis封装的某一个key会被替换掉)

这里的redis的数据准备我是从mysql的test库中u_2表迁移上去的,

当然你可以自己在redis里面set,或者原本就有数据,我这里正好介绍一下mysql----->redis的操作。

准备步骤如下。

2.1)准备protocol,用redis的pipe把mysql的数据导进redis:

这个步骤实际上是将mysql的字段拼接成redis可以读懂的protocol,

官网指路:英: https://redis.io/topics/protocol  中: http://www.redis.cn/topics/mass-insert.html

[why@wyt1 scripts]$ vim mysql-to-redis.sql

[why@wyt1 scripts]$ cat mysql-to-redis.sql

select

CONCAT('*3\r\n','$','3\r\n','SET\r\n',

'$',LENGTH(empno), '\r\n',empno,'\r\n',

'$',LENGTH(ename), '\r\n',ename, '\r'

)

from test.u_2 ;

[why@wyt1 scripts]$

简单的解释一下protocal:

*<参数数量> CR LF

$<参数 1 的字节数量> CR LF

<参数 1 的数据> CR LF

...

$<参数 N 的字节数量> CR LF

<参数 N 的数据> CR LF

拼接后应该是:

*3\r\n$3\r\nSET\r\n$LENGTH(empno)\r\nempno\r\n$LENGTH(ename)\r\nename\r

*3\r\n:是指3个参数即下面有几个$,这里是set、empno、ename,其实就是SET KEY VALUE,如果是使用hset的命令就是*4,

后面的格式就是“$+命令或者字段长度+”。

2.2)使用redis的管道将mysql表中的数据迁移到redis

[why@wyt1 scripts]$ mysql -uroot -pwhy -P6666 -h192.168.6.10 -N --raw < /home/why/redis-3.0.7/scripts/mysql-to-redis.sql |/home/why/redis-3.0.7/src/redis-cli -a whyredis -h 192.168.6.11 -p 6001 --pipe

Warning: Using a password on the command line interface can be insecure.

All data transferred. Waiting for the last reply...

Last reply received from server.

errors: 0, replies: 14

3)安装和使用redis-port

3.1)编译:

源码地址:https://github.com/CodisLabs/redis-port

[why@wyt1 packages]$ unzip redis-port-master.zip -d /home/why/codis/application/codis/src/

[why@wyt1 packages]$ cd /home/why/codis/application/codis/src/

[why@wyt1 src]$ mv redis-port-master/ /home/why/codis/application/codis/src/github.com/CodisLabs/redis-port

这里为什么要改名字,因为编译的时候会找这个目录,/home/why/codis/application/codis/src/github.com/CodisLabs/redis-port/pkg/

[why@wyt1 packages]$ cd /home/why/codis/application/codis/src/github.com/CodisLabs/

[why@wyt1 CodisLabs]$ cd redis-port/

[why@wyt1 redis-port]$ make

make: Warning: File `Makefile' has modification time 9.8e+05 s in the future

fatal: Not a git repository (or any of the parent directories): .git

go build -i -o bin/redis-port ./cmd

make: 警告:检测到时钟错误。您的创建可能是不完整的。

忽略警告后发现bin目录已经建好里面有编译好的redis-port,工具是能够正常使用的。

[why@wyt1 redis-port]$ ls

bin  cmd  Godeps  Makefile  MIT-LICENSE.txt  pkg  README.md  vendor  version  wandoujia_license.txt

[why@wyt1 redis-port]$ cd bin

[why@wyt1 bin]$ ls

redis-port  version

[why@wyt1 bin]$

3.2)命令参数使用:

详见 https://github.com/CodisLabs/redis-port

Options

  • -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 '*'

或者是

[why@wyt1 bin]$ ./redis-port -h

Usage:

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

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

redis-port sync     [--ncpu=N]  [--parallel=M]   --from=MASTER   [--password=PASSWORD] [--psync] [--filterdb=DB] --target=TARGET [--auth=AUTH] [--redis|--codis] [--sockfile=FILE [--filesize=SIZE]]

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

redis-port --version

Options:

-n N, --ncpu=N                    Set runtime.GOMAXPROCS to N.

-p M, --parallel=M                Set the number of parallel routines to M.

-i INPUT, --input=INPUT           Set input file, default is stdin ('/dev/stdin').

-o OUTPUT, --output=OUTPUT        Set output file, default is stdout ('/dev/stdout').

-f MASTER, --from=MASTER          Set host:port of master redis.

-t TARGET, --target=TARGET        Set host:port of slave redis.

-P PASSWORD, --password=PASSWORD  Set redis auth password.

-A AUTH, --auth=AUTH              Set auth password for target.

--faketime=FAKETIME               Set current system time to adjust key's expire time.

--sockfile=FILE                   Use FILE to as socket buffer, default is disabled.

--filesize=SIZE                   Set FILE size, default value is 1gb.

-e, --extra                       Set true to send/receive following redis commands, default is false.

--redis                           Target is normal redis instance, default is false.

--codis                           Target is codis proxy, default is true.

--filterdb=DB                     Filter db = DB, default is *.

--psync                           Use PSYNC command.

[why@wyt1 bin]$

可以看到redis-port一共有4种使用:decode、restore、dump、sync,这里我们用sync实现redis到codis

创建一个存放输出日志的位置和文件

[why@wyt1 redis-port]$ mkdir log

[why@wyt1 redis-port]$ cd log

[why@wyt1 log]$ touch redis-to-codis.log

导入之前看一下现在的组一和组二的数据,group1上9个key,group2有9个key(纯属巧合哈)

3.3)使用redis-port:

这里后台执行命令

[why@wyt1 redis-port]$  nohup ./bin/redis-port sync --ncpu=1 --from=192.168.6.11:6001 --password=whyredis --target=192.168.6.11:19002 --auth=codiswyt >> /home/why/codis/application/codis/src/github.com/CodisLabs/redis-port/log/redis-to-codis.log  2>&1 &

[2] 58292

[why@wyt1 redis-port]$

看到日志redis-to-codis.log 输出如下:

看到group1和group2中都导入了数据

可以查看一下,这个进程是一直在工作的

[why@wyt1 redis-port]$ ps -ef | grep redis-port|grep -v grep

why       58292  23483  2 09:44 pts/1    00:00:02 ./bin/redis-port sync --ncpu=1 --from=192.168.6.11:6001 --password=whyredis --target=192.168.6.11:19002 --auth=codiswyt

3.4)观察redis-port工作

但是只要别同步的redis服务不断,redis-port的日志是一直在写的,

当向redis继续插入数据时,可以看到log的输出变化,下图58那里

[why@wyt1 bin]$ ./redis-cli -a whyredis -p 6001

127.0.0.1:6001> get 11370

"SMITH"

127.0.0.1:6001> set idol tfboys

OK

127.0.0.1:6001> set monkey yyqx

OK

127.0.0.1:6001> set rabbit wjk

OK

127.0.0.1:6001> quit

再同时多插入数据看看同步的情况,将mysql中的u_3表的数据添加到codis

[why@wyt1 scripts]$ vim mysql-to-redis-u3.sql

[why@wyt1 scripts]$ cat mysql-to-redis-u3.sql

select

CONCAT('*3\r\n','$','3\r\n','SET\r\n',

'$',LENGTH(empno), '\r\n',empno,'\r\n',

'$',LENGTH(job), '\r\n',job, '\r'

)

from test.u_3 ;

[why@wyt1 scripts]$

[why@wyt1 scripts]$  mysql -uroot -pwhy -P6666 -h192.168.6.10 -N --raw < /home/why/redis-3.0.7/scripts/mysql-to-redis-u3.sql |/home/why/redis-3.0.7/src/redis-cli -a whyredis -h 192.168.6.11 -p 6001 --pipe

Warning: Using a password on the command line interface can be insecure.

All data transferred. Waiting for the last reply...

Last reply received from server.

errors: 0, replies: 14

[why@wyt1 scripts]$

看到下图516的那个地方是突然增加的。

然后停掉6001的redis,看一下redis-port是否会自动断开,6001的正常关闭

已经查不到redis-port的进程,[why@wyt1 redis-port]$ ps -ef | grep redis-port|grep -v grep

看一下redis-to-codis.log日志的输出:是error了,redis-port自己就停了

导入u_2之后检查一下redis-port是按照crc32原理将redis数据导入两个slot:

查源redis上的数据

[why@wyt1 redis-3.0.7]$ ./src/redis-cli -a whyredis -p 6001 -h 192.168.6.11

192.168.6.11:6001> keys *

1) "11370"

2) "11935"

3) "11567"

4) "11699"

5) "11500"

6) "11783"

7) "11655"

8) "11877"

9) "11522"

10) "11901"

11) "11845"

12) "11789"

13) "11903"

192.168.6.11:6001>

看一下上面13个key分布在codis两个slot的情况

[why@wyt1 bin]$ ./redis-cli -a codiswyt -p 8002

127.0.0.1:8002> keys *

1) "11522"

2) "name"

3) "7839"

4) "11783"

5) "7900"

6) "11655"

7) "birth"

8) "7876"

9) "11567"

10) "11370"

11) "11845"

12) "11935"

13) "11789"

14) "7499"

15) "gender"

16) "7902"

17) "7698"

127.0.0.1:8002> quit

[why@wyt1 bin]$ ./redis-cli -a codiswyt -p 7002 -h 192.168.6.10

192.168.6.10:7002> keys *

1) "7788"

2) "11877"

3) "age"

4) "11699"

5) "11500"

6) "11901"

7) "11903"

8) "7521"

9) "7844"

10) "7566"

11) "7782"

12) "7934"

13) "7654"

14) "7369"

Redis-port安装使用实现redis迁移codis,以及简单redis pipe实现将mysql迁移redis的更多相关文章

  1. 全新安装Mac OSX 开发者环境 同时使用homebrew搭建 PHP,Nginx ,MySQL,Redis,Memcache ... ... (LNMP开发环境)

    https://segmentfault.com/a/1190000000606752

  2. linux下redis的安装与部署及基础命令

    <1>下载安装文件:redis-3.2.5.tar.gz 放在opt目录下 <2> tar -zxvf redis-3.2.5.tar.gz,备份redis.conf到自己的目 ...

  3. MySQL迁移到SQLServer

    手头有个Java老项目,数据库是基于MySQL的,我们要把它迁移到SQLServer2008. 采用微软的SSMA For MySQL:迁移助手Microsoft SQL Server Migrati ...

  4. redis cluster安装部署(测试环境)

    redis 应用于web前端,做缓存和数据存取的速度是挺可观的,最近看了一些资料,手痒了,就弄了一个测试环境,两台方案,试用一下. ##Redis 集群部署## 一,方案调研: 参考博客: http: ...

  5. Redis的安装及学习

    最近因为做Chatbot项目需要对于NoSQL数据库进行研究,调研范围包括MongoDB和Redis.本文将介绍Redis在Windows环境的安装及如何利用python来操作Redis数据库. Re ...

  6. Linux中Redis的安装

    一.下载redis redis官网地址:http://www.redis.io/ 下载地址:http://download.redis.io/releases/ redis中文文档地址:http:// ...

  7. Linux系统下Redis缓存安装配置

    Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器.楼主是一枚JAVA后端程序员,也算是半个运维工程师了.在Linux服务器上搭建Redis,怎么可以 ...

  8. linux上redis的安装与配置

    1.redis安装 wget http://download.redis.io/releases/redis-4.0.8.tar.gz tar xzf redis-4.0.8.tar.gz ln -s ...

  9. redis的安装配置

    主要讲下redis的安装配置,以及以服务的方式启动redis 1.下载最新版本的redis-3.0.7  到http://redis.io/download中下载最新版的redis-3.0.7 下载后 ...

随机推荐

  1. NodeJS Stream 四:Writable

    什么是可写流 可写流是对数据流向设备的抽象,用来消费上游流过来的数据,通过可写流程序可以把数据写入设备,常见的是本地磁盘文件或者 TCP.HTTP 等网络响应. 看一个之前用过的例子 process. ...

  2. JS-鼠标滚轮事件 和 阻止默认行为

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. 微信小程序怎么做出前端table的效果

    wxml代码: <view class="container">     <view class="table">         &l ...

  4. SDWebImage源码解读之干货大总结

    这是我认为的一些重要的知识点进行的总结. 1.图片编码简介 大家都知道,数据在网络中是以二进制流的形式传播的,那么我们该如何把那些1和0解析成我们需要的数据格式呢? 说的简单一点就是,当文件都使用二进 ...

  5. html 一般标签 常用标签 表格

    body的属性: bgcolor                页面背景色 background            背景壁纸.图片 text                    文字颜色 top ...

  6. sql查询调优之where条件排序字段以及limit使用索引的奥秘

       奇怪的慢sql 我们先来看2条sql 第一条: select * from acct_trans_log WHERE  acct_id = 1000000000009000757 order b ...

  7. java_JDBC(4)

    一.Statement import java.sql.*; public class TestJDBC { public static void main(String[] args) { Conn ...

  8. 关于j2ee工程发布到was上后,部分更新,例修改web.xml配置文件不起作用的原因解析【转】

    在WAS中,应用的配置是从config/cells....目录下读取:而资源从/installedApps目录下读取 故当配置文件(例web.xml)发生改变时,只更新应用程序资源文件/install ...

  9. SQL SERVER运维日记--收缩数据库

    一个小故事 某天,小王正在和HR妹妹闲聊,正HAPPY时,,突然收到系统告警消息,数据库磁盘被剩余空间500M,OMG,不行,磁盘快满了,要是业务要停了,,那就小王只能删库到跑路了,,, 先检查下,有 ...

  10. 读书笔记 effective c++ Item4 确保对象被使用前进行初始化

    Item4 确保对象被使用前进行初始化 C++在对象的初始化上是变化无常的,例如看下面的例子: Int x; 在一些上下文中,x保证会被初始化成0,在其他一些情况下却不能够保证.看下面的例子: Cla ...