最近有个需求,就是将一个Redis集群中数据转移到某个单机Redis上。html
迁移Redis数据的话,若是是单机Redis,有两种方式:
a. 执行redis-cli shutdown
命令,触发写RDB
和AOF
写磁盘操做,而后将RDB文件和AOF文件都拷贝到新服务器上,而后运行服务器便可。
b. 若是不想暂停服务,能够用工具,好比Redis Dump;也能够采用Redis提供的Master Slave方式同步数据。redis
可是,若是是Redis集群的话,每一个Redis实例上面只有部份数据,这就不太好办了。所以,有必要学习Redis集群的相关知识。数据库
为何Redis须要分片?Redis分片能够:服务器
为何选择哈希分片(hash partitioning)?网络
最简单的分片方式是范围分片,不过范围分片要维护一个映射范围到实例的表,这种方式效率低。ide
例如:若是咱们的数据是user
的形式,咱们能够把user<0>到user<1000>的数据存到1号Redis实例,把user<10001>到user<20000>存到2号Redis实例,依此类推。但若是咱们还有post 工具, , 等各类不一样类型的键,咱们须要为每一种类型定义一个映射范围表。这个比较麻烦。
采用哈希分片就没有这个问题。因为Redis自身是一个Key-Value数据库,能够直接对key这个字符串计算hash,获得一个数字,而后对数字取模(模为redis实例数目)。post
例如:咱们对user<2019>这个键计算哈希获得数字9527520,假设咱们有7个Redis实例,9527520 % 7 = 2,咱们就能知道这个数据存放在2号Redis实例中。学习
分片的不一样实现ui
- 客户端分片(Client side partitioning)意味着,客户端直接选择正确的节点来写入和读取指定键。许多 Redis 客户端实现了客户端分片。
- 代理协助分片(Proxy assisted partitioning)意味着,咱们的客户端发送请求到一个能够理解 Redis 协议的代理上,而不是直接发送请求到 Redis 实例上。代理会根据配置好的分片模式,来保证转发咱们的请求到正确的 Redis 实例,并返回响应给客户端。Redis 和 Memcached 的代理 Twemproxy 实现了代理协助的分片。
- 查询路由(Query routing)意味着,你能够发送你的查询到一个随机实例,这个实例会保证转发你的查询到正确的节点。Redis 集群在客户端的帮助下,实现了查询路由的一种混合形式 (请求不是直接从 Redis 实例转发到另外一个,而是客户端收到重定向到正确的节点)。下面所说的Redis Cluster就是采用查询路由的方式。
从 Redis 3.0 开始,Redis提供了一个官方集群实现:Redis Cluster。
上面这两个文档足够了,下面是个人一些理解。
新增或删除结点
RedisCluster经过哈希槽移动、哈希槽百分比调整、从新分片(Reshard)等操做完成增删结点、数据均衡。
这篇博客挺好的,本身动手试试试试能加深理解,CSDN - Redis Cluster增长节点和Reshard
Redis Cluset的主从模型Master-Slave
好比咱们有6个Redis实例,能够用分别设置A,B,C三台做为Redis Cluster的主服务器,而后设置A1,A2,A3做为从服务器。这样,当主服务器A宕机后,Redis Cluster会自动将请求重定向到A1服务器。