Redis学习笔记---Redis的分区的意义与方式,官方cluster分区

Redis学习笔记—Redis的分区的意义与方式

  1. 分区是将数据分布在多个Redis实例(Redis主机)上,以至于每个实例只包含一部分数据。

1.官方cluster分区

  1. Redis3.0之后,Redis官方提供了完整的集群解决方案。
  2. 方案采用去中心化的方式,包括:sharding(分区)、replication(复制)、failover(故障转移)。称为RedisCluster。
  3. Redis5.0前采用redis-trib进行集群的创建和管理,需要ruby支持
  4. Redis5.0可以直接使用Redis-cli进行集群的创建和管理
    在这里插入图片描述
  5. 由上图可知有三部分的交互,Redis master和Redis master,Redis Master和 RedisClient,Redis Master和Redis Slaver的交互

2.去中心化

  1. RedisCluster由多个Redis节点组构成,是一个P2P(点对点)无中心节点的集群架构,各个节点的通信依靠Gossip协议传播的集群。

3.Gossip协议

  1. Gossip协议是一个通信协议,一种传播消息的方式,起源于:病毒传播。
  2. Gossip协议基本思想就是:
    1. 一个节点周期性(每秒)随机选择一些节点,并把信息传递给这些节点。
    2. 这些收到信息的节点接下来会做同样的事情,即把这些信息传递给其他一些随机选择的节点。
  3. 信息会周期性的传递给N个目标节点。这个N被称为fanout(扇出)gossip协议包含多种消息,包括meetpingpongfailpublish等等。
  4. 通过gossip协议,cluster可以提供集群间状态同步更新、选举自助failover等重要的集群功能。
    在这里插入图片描述

4.slot(hash槽,Redis存储用的就是slot的概念)

  1. redis-cluster把所有的物理节点映射到[0-16383]slot上,基本上采用平均分配和连续分配的方式。
  2. 比如上图中有5个主节点,这样在RedisCluster创建时,slot槽可按下表分配:
    在这里插入图片描述
  3. cluster负责维护节点和slot槽的对应关系 value------>slot-------->节点
  4. 当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16算法(一种hash算法) 算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
  5. 比如
    1. set name zhaoyun
    2. hash("name")采用crc16算法,得到值:1324203551%16384=15903
    3. 根据上表15903在13088-16383之间,所以name被存储在Redis5节点。
    4. slot槽必须在节点上连续分配,如果出现不连续的情况,则RedisCluster不能工作,详见容错。

5.RedisCluster的优势

  1. 高性能
    1. Redis Cluster 的性能与单节点部署是同级别的。
    2. 多主节点、负载均衡、读写分离
  2. 高可用
    1. Redis Cluster 支持标准的 主从复制配置来保障高可用和高可靠。
    2. failover(故障转移)
    3. Redis Cluster 也实现了一个类似 Raft 的共识方式,来保障整个集群的可用性。
  3. 易扩展
    1. 向 Redis Cluster 中添加新节点,或者移除节点,都是透明的,不需要停机。
    2. 水平、垂直方向都非常容易扩展。
    3. 由于数据分区,所以可以存储海量数据,数据存储
  4. 原生
    1. 部署 Redis Cluster 不需要其他的代理或者工具,而且 Redis Cluster 和单机 Redis 几乎完全兼容。

6.集群搭建

  1. 三主带三从

  2. 搭建集群,解压redis压缩包,进入src目录中进行install操作,可以在install的命令中规定路径

    
    cd src && make install PREFIX=/.../.../redis/7001
    
    make install PREFIX=/.../.../redis/7001
    
  3. 修改配置文件,改端口,改bind属性,保护节点改成no,cluster-enable改成yes

  4. 创建启动脚本,start.sh

    cd 7001/bin 
    ./redis-server redis.conf 
    cd .. 
    cd .. 
    cd 7002/bin ./redis-server 
    redis.conf 
    cd .. 
    cd ..
    
  5. 给启动脚本赋予权限,chmod u+x start.sh (赋写和执行的权限)

  6. 创建redis集群,其中cluster-replicas 1表示一个从机,创建集群写在前面的一定是主机

    ./redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 
    127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
    
  7. 创建完集群后会显示如下:
    在这里插入图片描述

  8. 使用命令客户端连接集群

    1. 连接集群方式
     ./redis-cli -h 127.0.0.1 -p 7001 -c
    
    1. 存数据name:001name:002计算hash值,会将计算出的hash值放到对应的hash槽内,所以会出现从7001定向到7002的现象
    127.0.0.1:7001> set name:001 zhaoyun
    OK
    127.0.0.1:7001> set name:002 zhaoyun2
    -> Redirected to slot [8545] located at 127.0.0.1:7002
    OK
    
  9. 查看集群状态的命令:cluster info

    127.0.0.1:7002> cluster info
    cluster_state:ok
    cluster_slots_assigned:16384
    cluster_slots_ok:16384
    cluster_slots_pfail:0
    cluster_slots_fail:0
    cluster_known_nodes:6
    cluster_size:3
    cluster_current_epoch:6
    cluster_my_epoch:2
    cluster_stats_messages_ping_sent:11243
    cluster_stats_messages_pong_sent:10937
    cluster_stats_messages_meet_sent:4
    cluster_stats_messages_sent:22184
    cluster_stats_messages_ping_received:10935
    cluster_stats_messages_pong_received:11247
    cluster_stats_messages_meet_received:2
    cluster_stats_messages_received:22184
    
  10. 查看节点的状态命令:cluster nodes

    127.0.0.1:7002> cluster nodes
    1506f98e3c8dac9586531b4e02e475ee7af4572f 127.0.0.1:7004@17004 slave 910b50994c3fcd7e1f92738681c4db70c2aa3bfd 0 1612695884000 4 connected
    95eded2b53e955597818e9fa93b3c00efa80e118 127.0.0.1:7005@17005 slave 75b011a8ea54060b6e078ddd5cd844f0d36129ae 0 1612695883000 5 connected
    3d7576fd14f406958d488b8538b8bc2af29f2341 127.0.0.1:7001@17001 master - 0 1612695883000 1 connected 0-5460
    910b50994c3fcd7e1f92738681c4db70c2aa3bfd 127.0.0.1:7002@17002 myself,master - 0 1612695884000 2 connected 5461-10922
    4a7a3cf2b14f172599e26c26b63151826a992e61 127.0.0.1:7006@17006 slave 3d7576fd14f406958d488b8538b8bc2af29f2341 0 1612695884000 6 connected
    75b011a8ea54060b6e078ddd5cd844f0d36129ae 127.0.0.1:7003@17003 master - 0 1612695884971 3 connected 10923-16383
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值