• 幕客老师召集小伙伴
  • python自动化运维项目实战
  • nginx从入门到实战
  • 阿里云与Centos7实战

课程十、Redis集群

一、Redis集群过程

1、集群概念

2、Redis集群的缺陷

    (1)不能支持事务处理

    (2)不支持那些需要同时处理多个键的 Redis 命令。

    (3)  当一个节点出现故障时,没发做到故障转移数据必须丢失。

      (4) cluster环境下slave默认不接受任何读写操作,在slave执行readonly命令后,可执行读操作

      (5) client端不支持多key操作(mget,mset等),但当keys集合对应的slot相同时支持mget操作见:hash_tag

      (6)  不支持多数据库,只有一个db,select 0。

      (7) JedisCluster 没有针对byte[]的API,需要自己扩展(附件是我加的基于byte[]的BinaryJedisCluster  api)

         目前"Jedis-3.0.0-SNAPSHOT"已支持BinaryJedisCluster和基于hash_tag的mget操作.

3、CLUSTER MEET过程

客户端通过CLUSTER MEET命令,向节点加入新的成员节点。

步骤一、打开cluster-enabled yes

否则将出现的提示:ERR This instance has cluster support disabled

# vim /etc/redis/6379.conf

www.iaskjob.com:6379> CLUSTER MEET www.iaskjob.com 6380
OK

www.iaskjob.com:6379> CLUSTER MEET www.iaskjob.com 6381
OK

 

www.iaskjob.com:6379> CLUSTER INFO
cluster_state:fail
cluster_slots_assigned:4
cluster_slots_ok:4
cluster_slots_pfail:0

  a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态.

  b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

  c:初始化时,没有完整的分配16384个SLOT

 

二、集群中的slot

1、redis通过分片的方式来保存数据。

2、一个集群中总共有:16384个slot,及0-16384个

3、将一个或多个槽进行指派,指派給对应节点

如:

www.iaskjob.com:6379> FLUSHDB
OK
www.iaskjob.com:6379> CLUSTER FLUSHSLOTS
OK

www.iaskjob.com:7000>CLUSTER ADDSLOTS 0 1 2 3 ... 5000

用脚本运行,表示将slot 1到slot 5000 指派給7000服务

for i in {0..5000}; do redis-cli -p 6379 cluster addslots
$i ;done

for i in {5001..10000}; do redis-cli -p 6380 cluster addsl
ots $i ;done

for i in {10001..16383}; do redis-cli -p 6381 cluster adds
lots $i ;done

如果参数错误,或者超过了指定范围,将出现:

(error) ERR Invalid or out of range slot

 

4、通过 CLUSTER INFO  或者 CLUSTER NODES查看状态

5、客户端登陆测试

Linux下redis-cli 通过-c 的参数进入到集群模式。

否则,默认将进入单机模式,客户端会打印出MOVED错误。

www.iaskjob.com:6380> CLUSTER INFO
cluster_state:ok

 

三、集群中执行命令

  1. //集群(cluster)  
  2. CLUSTER INFO 打印集群的信息  
  3. CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。   
  4.   
  5. //节点(node)  
  6. CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。  
  7. CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。  
  8. CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。  
  9. CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。   
  10.   
  11. //槽(slot)  
  12. CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。  
  13. CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。  
  14. CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。  
  15. CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。  
  16. CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。  
  17. CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。  
  18. CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。   
  19.   
  20. //键 (key)  
  21. CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。  
  22. CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。  
  23. CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。  

 

四、客户端向集群请求流程

如果查找所属键不属于本节点,则跳转到对应节点,此间客户端共发起两次连接。

1、模拟客户端请求

redis-cli -c -p   

www.iaskjob.com:6379> set msg "happy new year"     #第一次执行的时候,将向客户端发送 Redirected 信息
-> Redirected to slot [6257] located at www.iaskjob.com:6380
OK
www.iaskjob.com:6380> get msg     #已经成功的跳转到了6380的服务器上
"happy new year"

2、计算键属于哪个SLOT

www.iaskjob.com:6380> CLUSTER KEYSLOT "msg"
(integer) 6257
www.iaskjob.com:6380> CLUSTER KEYSLOT "name"
(integer) 5798
www.iaskjob.com:6380> CLUSTER KEYSLOT "a"
(integer) 15495

 

五、重新分片

关于Redis得重新分片请看这篇内容

 

六、redis默认的分片管理脚本

redis-trib.rb  Redis 集群命令行工具位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片。
参考这篇帖子

 

七、访问正在迁移数据节点的数据

1、当节点正在重新分片时,如果正好有客户端请求过来,这时节点的数据由于迁移,已经不存在本节点上,那么这时,服务端将抛出错误。

 

 

 

2、ASK和MOVED错误区别

共同点:返回的错误都会导致客户端转向

区别1:错误返回场景不同,ASK用在迁移槽过程时候

区别2:MOVED客户端会进行缓存记忆,而ASK是临时性的,也就是下次请求还是会打到老的节点上。

 

3、

 

 

课程十、Redis集群

Pingbacks已打开。

引用地址

暂无评论

发表评论