企业实战篇redis(4)---集群

Redis集群
Redis Cluster是redis的分布式解决方案,Redis Cluster是分布式架构:即Redis Cluster中有多个节点,每个节点都负责进行数据读写操作,每个节点之间会进行通信。在3.0版本正式推出后,有效地解决了Redis分布式方面的需求。Redis分布式的方案一般由两种:

客户端分区方案,优点是分区逻辑可控,缺点是需要自己处理数据路由,高可用,故障转移等问题;
代理方案,优点是简化客户端分布式逻辑和升级维护便利,缺点是加重架构部署复杂性和性能损耗
现在官方为我们提供了专门的集群方案:Redis Cluster,采用Hash分区
数据分布
数据分区理论基础
分布式数据库首先要解决的问题是整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集。
常见的数据分区规则有hash分区和顺序分区两种
在这里插入图片描述
Hash分区常见有三种:

节点取余分区
定义:根据节点数量N使用公式hash(key)%N,计算出出hash值,用来决定数据映射到哪个节点上
优点:简单,常用于数据库的分库分表规则,一般采用预分区的方案,提前根据数据量规划好分区数。
存在问题:当节点数量变化,需要扩容或者收缩节点,数据节点映射关系需要重新计算会导致数据的重新迁移
注意事项:扩容时采用翻倍扩容,避免数据全量被打乱导致全量迁移
一致性Hash分区
定义:为每个系统分配一个token,范围一般在0~2的32次方,这些token构成一个hash环,数据读写执行节点查找操作时,先根据key计算hash值,然后顺时针找到第一个大于等于该hash值的token节点
优点:加入和删除节点只影响哈希环中相邻的节点,对其他节点无影响
存在问题:
1) 加减节点会造成哈希环中部分数据无法命中,需要手动处理或者或略这部分数据,因此一致性hash常用于缓存场景
2)当使用少量节点时,节点变化将会大范围影响哈希环中数据映射,因此这种方式不适合少量数量节点的分布式方案
3)普通的一致性hash分区在增加节点时需要增加一倍或者减去一般节点才能保证数据和负载的均衡
虚拟槽分区
定义:虚拟槽分区巧妙地使用了哈希分区空间,使用分散性良好的哈希函数把所有数据映射到一个固定范围的整数集合中,整数定义为槽
这个范围一般远远大于节点数,比如Redis Cluster槽的范围是0~16383
槽是集群内数据管理和迁移的基本单位,采用大范围的主要目的是为了方便数据拆分和集群扩展
Redis数据分区
Redis Cluster采用了虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot=CRC16(key)&16383。每一个节点负责维护一部分槽以及槽所映射的键值数据

Redis虚拟槽分区特点
解耦数据和节点之间的关系,简化了节点扩容和收缩的难度
节点自身维护槽的映射关系,不需要客户端或者代理服务维护槽分区元数据
支持节点,槽,键之间的映射关系,用于数据路由,在线伸缩等场景

在这里插入图片描述

节点

Redis Cluster是分布式架构:即Redis Cluster中有多个节点,每个节点都负责进行数据读写操作,每个节点之间会进行通信。

meet操作:
节点之间会相互通信,而meet操作是节点之间完成相互通信的基础,meet操作有一定的频率和规则

分配槽

把16384个槽平均分配给节点进行管理,每个节点只能对自己负责的槽进行读写操作。
由于每个节点之间都彼此通信,每个节点都知道另外节点负责管理的槽范围。

客户端访问任意节点时:对数据key按照CRC16规则进行hash运算,然后对运算结果对16383进行取作,如果余数在当前访问的节点管理的槽范围内,则直接返回对应的数据如果不在当前节点负责管理的槽范围内,则会告诉客户端去哪个节点获取数据,由客户端去正确的节点获取数据

server2:

step1:
在这里插入图片描述
step2手动创建目录和目录下的文件
搭建集群环境使用7001到7006搭建六个集群节点:

 mkdir /usr/local/rediscluster
 cd  /usr/local/rediscluster
 mkdir  700{1..6}

step3在7001 7002 7003 7004 7005 7006目录下编辑文件

cd 7001
vim redis.conf

port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7001/redis.pid"
logfile "/usr/local/rediscluster/7001/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7001"

redis-server redis.conf 
ps aux | grep redis-server

例:
在这里插入图片描述

在这里插入图片描述
同理将其他目录下的该文件编辑并且启动

cp redis.conf  ../7002
 cp redis.conf  ../7003
cp redis.conf  ../7004
 cp redis.conf  ../7005
  cp redis.conf  ../7006

在这里插入图片描述

在每一个目录下启动redis-server redis.conf 

在这里插入图片描述

ps ax #查看

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上的步骤创建了master和slave,集群的状态也被激活,下面来创建集群,使几个成为一个集群。
注意:以下创建方式一被弃用(redis-5.0.3 /src/redis-trib.rb)
在这里插入图片描述
集群创建方式二:

redis-cli --cluster create --cluster-replicas 1 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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看集群创建:

[root@server2 src]# redis-cli --cluster info 127.0.0.1:7001
[root@server2 src]# redis-cli --cluster info 127.0.0.1:7002
[root@server2 src]# redis-cli --cluster info 127.0.0.1:7003
[root@server2 src]# redis-cli --cluster info 127.0.0.1:7004
[root@server2 src]# redis-cli --cluster info 127.0.0.1:7005
[root@server2 src]# redis-cli --cluster info 127.0.0.1:7006

在这里插入图片描述
测试集群:

redis-cli -c -p 7001

测试1存储数据:
在这里插入图片描述
测试2提取数据:
在这里插入图片描述

测试3将7002主宕机后测试
在这里插入图片描述
此时7004接替了7002的数据槽,并且存储了7002的数据
在这里插入图片描述
在这里插入图片描述
测试4将7004也宕机后测试:此时原本的数据丢失
在这里插入图片描述
找回数据方式:

[root@server2 rediscluster]# cd 7002
[root@server2 7002]# ls
appendonly.aof  dump.rdb  nodes.conf  redis.conf  redis.log
[root@server2 7002]# redis-server  redis.conf 
[root@server2 7006]# cd ../7004
[root@server2 7004]# redis-server  redis.conf 

此时数据恢复,在7004可以查看到相关的数据
在这里插入图片描述

添加新的节点

添加新的节点7007 7008
在这里插入图片描述
在这里插入图片描述
将节点添加到集群当中去

redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001

此时新添加的节点7007为master
在这里插入图片描述
将7008添加为7007的slave

[root@server2 7007]# redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave  --cluster-master-id 4cefa3ffd289fc49d5b868d71085184cd3c0d2db

在这里插入图片描述
此时7007虽然有slave,但是没有数据槽
均分数据槽

[root@server2 7007]# redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:7001

测试数据槽被均分给4个主master,原本的数据被随机的分配给其中的一个数据槽。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值