Redis Cluster在線遷移

前言
Redis是一個開源的高性能鍵值對數據庫。它經過提供多種鍵值數據類型來適應不一樣場景下的存儲需求,並藉助許多高層級的接口使其能夠勝任如緩存、隊列系統等不一樣的角色。
Redis持久化了解
爲了讓性能更加優異,Redis默認是把全部的數據都存在內存中的。可是當服務器重啓或程序異常崩潰時,Redis的數據就會所有丟失。所以出現了持久化的概念。持久化就是將存在內存中的數據同步到磁盤來保證持久化。node

一、Redis持久化的方式
兩種: RDB 和 AOF
RDB 持久化能夠在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot)。
AOF 持久化記錄服務器執行的全部寫操做命令,並在服務器啓動時,經過從新執行這些命令來還原數據集。 AOF 文件中的命令所有以 Redis 協議的格式來保存,新命令會被追加到文件的末尾。 Redis 還能夠在後臺對 AOF 文件進行重寫(rewrite),使得 AOF 文件的體積不會超出保存數據集狀態所需的實際大小。
二、持久化的數據有什麼用?
用於重啓後的數據恢復。Redis是一個內存數據庫,不管是RDB仍是AOF,都只是其保證數據恢復的措施;因此Redis在利用RDB和AOF進行恢復的時候,都會讀取RDB或AOF文件,從新加載到內存中。
默認持久化了解
其中RDB就是point-in-time snapshot快照存儲,也是默認的持久化方式。對於RDB可理解爲半持久化模式,即按照必定的策略週期性的將數據保存到磁盤。對應產生的數據文件爲dump.rdb,經過配置文件中的save參數來定義快照的週期。Redis的RDB文件不會壞掉,由於其寫操做是在一個新進程中進行的。 linux

1、準備工做

默認的持久化設置:git

save 900 1                          #當有一條Keys數據被改變時,900秒刷新到Disk一次
save 300 10                        #當有10條Keys數據被改變時,300秒刷新到Disk一次
save 60 10000                    #當有10000條Keys數據被改變時,60秒刷新到Disk一次

利用持久化遷移數據,下面操做在全部主節點執行
##########查看配置信息及當前存儲的key值###########
[root@localhost ~]# redis-cli -c -h 10.10.10.10 -p 6379github

#########保存最新的key值################
redis 10.10.10.10:6379> BGSAVE
Background saving started
##########查看是否保存成功##############
redis 10.10.10.10:6379> LASTSAVE
(integer) 1420367903redis

Redis–BGSAVE
在後臺異步(Asynchronously)保存當前數據庫的數據到磁盤。BGSAVE 命令執行以後當即返回 OK ,而後 Redis fork 出一個新子進程,原來的 Redis 進程(父進程)繼續處理客戶端請求,而子進程則負責將數據保存到磁盤,而後退出。
LASTSAVE
返回最近一次 Redis 成功將數據保存到磁盤上的時間,以 UNIX 時間戳格式表示。數據庫

轉換Unix時間戳的網址
http://tool.chinaz.com/Tools/unixtime.aspxvim

2、安裝部署redis-migrate-tool

官方連接:https://github.com/vipshop/redis-migrate-tool
軟件編譯安裝:api

mkdir /opt/cachecloud/  && cd /opt/cachecloud/
wget https://github.com/vipshop/redis-migrate-tool/archive/master.zip
unzip master.zip
mv redis-migrate-tool-master redis-migrate-tool
cd redis-migrate-tool
mkdir data
autoreconf -fvi
./configure
make
src/redis-migrate-tool -h

3、配置啓動redis-migrate-tool

3.1)配置文件實例:
vim /opt/cachecloud/redis-migrate-tool/rmt.conf緩存

示例1:從rdb文件恢復數據到redis cluster集羣服務器

[source]
type: rdb file
servers:
 - /data/redis/dump1.rdb
 - /data/redis/dump2.rdb
 - /data/redis/dump3.rdb

[target]
type: redis cluster
servers:
 - 127.0.0.1:7379

[common]
listen: 0.0.0.0:8888

示例2:從redis cluster集羣遷移數據到另一個cluster集羣

[source]
type: redis cluster
servers:
- 127.0.0.1:8379

[target]
type: redis cluster
servers:
- 127.0.0.1:7379

[common]
listen: 0.0.0.0:8888

示例3:從redis cluster集羣遷移數據到twemproxy集羣

[source]
type: redis cluster
servers:
- 127.0.0.1:6379

[target]
type: twemproxy
hash: fnv1a_64
hash_tag: "{}"
distribution: ketama
servers:
- 127.0.0.1:6380:1 server1
- 127.0.0.1:6381:1 server2
- 127.0.0.1:6382:1 server3
- 127.0.0.1:6383:1 server4

[common]
listen: 0.0.0.0:34345
threads: 8
step: 1
mbuf_size: 512
source_safe: true

3.2)軟件運行:

cd /opt/cachecloud/redis-migrate-tool
src/redis-migrate-tool -c rmt.conf -o log -d

3.3)狀態查看:經過redis-cli鏈接redis-migrate-tool監控的端口,運行info命令

$redis-cli -h 127.0.0.1 -p 8888
127.0.0.1:8888> info
# Server
version:0.1.0
os:Linux 2.6.32-573.12.1.el6.x86_64 x86_64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:9199
tcp_port:8888
uptime_in_seconds:1662
uptime_in_days:0
config_file:/ect/rmt.conf

# Clients
connected_clients:1
max_clients_limit:100
total_connections_received:3

# Memory
mem_allocator:jemalloc-4.0.4

# Group
source_nodes_count:32
target_nodes_count:48

# Stats
all_rdb_received:1
all_rdb_parsed:1
rdb_received_count:32
rdb_parsed_count:32
total_msgs_recv:7753587
total_msgs_sent:7753587
total_net_input_bytes:234636318
total_net_output_bytes:255384129
total_net_input_bytes_human:223.77M
total_net_output_bytes_human:243.55M
total_mbufs_inqueue:0
total_msgs_outqueue:0
127.0.0.1:8888>

3.4)數據校驗:

$src/redis-migrate-tool -c rmt.conf -o log -C redis_check
Check job is running...

Checked keys: 1000
Inconsistent value keys: 0
Inconsistent expire keys : 0
Other check error keys: 0
Checked OK keys: 1000

All keys checked OK!
Check job finished, used 1.041s

附加工具:redis-port

安裝go:

wget https://dl.google.com/go/go1.7.5.linux-amd64.tar.gz
tar zxvf go1.7.5.linux-amd64.tar.gz
mv go /usr/local/
mkdir $HOME/work
echo 'export GOROOT=/usr/local/go' >>/etc/profile 
echo 'export PATH=$PATH:$GOROOT/bin' >>/etc/profile
echo 'export GOPATH=$HOME/work' >>/etc/profile
source /etc/profile
# go version
go version go1.7.5 linux/amd64

下載 redis-port

redis-port地址
使用示例1

./redis-port  restore  --input=x/dump.rdb  --target=dst_host:dst_port   --auth=dst_password  
[--filterkey="str1|str2|str3"] [--targetdb=DB] [--rewrite] [--bigkeysize=SIZE] [--logfile=REDISPORT.LOG]
參數說明

x/dump.rdb : 自建 redis 的 dump 文件路徑
dst_host : 目的數據庫 redis 域名
dst_port : 目的數據庫 redis 端口
dst_password : 目的數據庫 redis 密碼
str1|str2|str3 : 過濾具備 str1 或 str2 或 str3 的 key
DB : 將要同步入目的數據庫 redis 的 DB
rewrite : 覆蓋已經寫入的 key
bigkeysize=SIZE : 當寫入的 value 大於 SIZE 時,走大 key 寫入模式

根據 redis-port 日誌查看數據同步狀態

根據redis-port日誌查看同步狀態
Redis Cluster在線遷移

當出現restore: rdb done時數據同步完成。

使用示例2

./redis-port  sync  --from=src_host:src_port --password=src_password  --target=dst_host:dst_port   
--auth=dst_password  [--filterkey="str1|str2|str3"] [--targetdb=DB] [--rewrite] [--bigkeysize=SIZE] 
[--logfile=REDISPORT.LOG]
參數說明

src_host : 自建 redis 域名(或者 IP)
src_port : 自建 redis 端口
src_password : 自建 redis 密碼
dst_host : 目的數據庫 redis 域名
dst_port : 目的數據庫 redis 端口
dst_password : 目的數據庫 redis 密碼
str1|str2|str3 : 過濾具備 str1 或 str2 或 str3 的 key
DB : 將同步入目的 redis 的 DB
rewrite : 覆蓋已經寫入的 key
bigkeysize=SIZE : 當寫入的 value 大於 SIZE 時,走大 key 寫入模式

根據 redis-port 日誌查看數據同步狀態
Redis Cluster在線遷移

根據redis-port日誌查看同步狀態當出現sync rdb done時全量同步完成,進入增量同步的模式。

相關文章
相關標籤/搜索