首页 > 数据库 >redis 集群

redis 集群

时间:2023-08-11 17:15:13浏览次数:34  
标签:redis Redis 插槽 集群 主机 服务器

 

Redis集群
集群解决的问题
代理主机和无中心化集群
Redis集群的特点
Redis集群环境搭建
slots(插槽)
在集群中录入值
查询集群中的值
故障恢复
Redis集群的优缺点
集群解决的问题
服务器的容量不足或者进行并发写操作的用户过多等情况下可以使用多台Redis集群的方式缓解压力。

注:(高并发的写操作,如果是一主多从模式主服务器承受的压力会很大,因此引入集群)

代理主机和无中心化集群
以电商项目的用户、订单、商品三个模块来演示代理主机和无中心化集群。如下图:

用户信息、订单信息、商品信息分别使用三台Redis服务器存储。 这样一来,相应的操作就会去请求相应的Redis服务器。


问题:客户端通过何种方式知道需要去请求哪个服务?

①代理主机方式通过加一层代理服务器解决此问题(不推荐使用)


访问的时候请求代理服务器,由代理服务器进行分发。

局部可以使用主从模式,如果其中某一台Redis服务器挂掉,从机上位变为主服务器继续提供服务。

可以看到,以代理主机方式按照目前的需求搭建集群,至少需要8台服务器。搭建和后期维护都很不方便,所以不推荐使用此方式创建集群,于是引入了无中心化方式的集群!!!

②无中心化搭建Redis集群方式解决此问题(推荐)

任何一台Redis服务器都可以作为集群的入口。比如要访问订单数据,通过用户服务器进入集群,用户服务器会在集群内部把请求进行转移,直到找到订单服务器。

无中心化Redis集群搭建方式最少需要6台服务器即可。和代理主机方式相比优势明显。

Redis集群的特点
Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。

Redis 集群通过分区来提供一定程度的可用性: 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

Redis集群环境搭建
根据上面介绍,我们了解到无中心化集群搭建方式至少需要6台Redis服务器。接下来演示无中心化Redis集群环境搭建:

接下来演示在一台linux主服务器上模拟六台Redis服务器,演示无中心化Redis集群环境的搭建:

①在Linux服务器中新建一个myredis文件夹。如下图:


②创建6个redis实例,端口号为:6379、6380、6381、6389、6390、6391
(如果使用云服务器记得设置这几个端口的安全组)
实现:

6379为主机,6389为从机
6380为主机,6390为从机
6381为主机,6391为从机
vim redis6379.conf 创建配置文件并写入如下内容:


复制出其余5个配置文件


依次通过字符串替换修改5个文件内容(下图是修改redis6381.conf的过程,修改其余配置文件操作类似)


③启动6个Redis服务

格式:redis-server redis6379.conf(启动redis6379服务)


通过ll命令查看,确保如下的节点文件生成成功


④一个集群至少要有三个主节点,先组合创建只有三个主节点的集群(6379、6380、6381)

组合之前,务必请确保所有redis实例启动后,nodes-xxxx.conf文件都生成正常。

Redis版本低的话,需要额外装上rubby环境。新版的redis自带了rubby环境,。我使用的是新版本redis7

redis安装目录下的src目录中可以看到,,关于rubby的文件


使用命令进行合并创建集群
redis-cli --cluster create --cluster-replicas 0 -a 你的redis密码
47.116.4.200:6379 47.116.4.200:6380 47.116.4.200:6381
其中参数:

① -replicas 0 表示创建集群的方式,以0个从机的方式创建集群(此处即为创建仅有三个主机的集群)。
②-a参数填写redis服务器的密码(没有设置密码可以不写-a)
③最后面跟的是服务器的ip和端口号。

⑤启动redis服务后,需要连接Redis。

集群之前的连接redis方式为:redis-cli -p 端口号
集群连接redis方式为:redis-cli -c -p 端口号(使用-c参数表示 采用集群策略连接。因为是无中心化,所以连接任何一个节点(如6379、6380、6381)都可以)


⑥通过 cluster nodes 命令查看集群信息


⑦增加三个从机到集群中去,并设置相应的主机
redis-cli --cluster add-node 47.116.4.200:6389 47.116.4.200:6379 --cluster-slave --cluster-master-id 主机的id (-a Redis密码):增加从节点6389到集群中去,并将其设置为6379主机的从机。

此处的47.116.4.200:6389为目标从机及其端口号
此处的47.116.4.200:6379为目标主机及其端口号
slave 表示此操作要添加从节点
cluster-master-id 主机的id: 要添加到哪一个主节点,集群中主机的id可以通过cluster nodes查看
-a :如果设置了redis密码,需要-a参数并填入密码

以同样的方式,把6390添加为6380的从机;把6391添加为6381的从机。

添加完毕之后通过redis-cli -c -p 6379连接一台集群中的redis服务器。并通过cluster nodes查看节点信息。如下图:


此时可以看到集群中节点已经分为三组:

6379为主机,6389为从机
6380为主机,6390为从机
6381为主机,6391为从机
slots(插槽)
一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个。

插槽用来把值平均分配到不同主机中去,达到分担压力的效果。(比如set k1 v1操作的时候,会计算k1所在插槽值,根据各节点管辖的插槽范围,放入相应的节点中去)

集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽。

集群中的每个节点负责处理一部分插槽。 如下图:

上图中的当前集群有三个主节点, 其中:

节点 6379 负责处理 0 号至 5460 号插槽。
节点 6380 负责处理 5461 号至 10922 号插槽。
节点 6381 负责处理 10923 号至 16383 号插槽。

在集群中录入值
①录入单个值

6381管理的插槽范围是10923 号至 16383 号,12706在其范围内。

一开始,请求进入6379,执行set k1 值操作时,计算k1的插槽值,发现k1插槽值不在6379服务器管理范围内,于是会转移请求找到6381服务器并执行set操作。

②尝试录入多个值

无法计算多个key的插槽值。集群中mset不能执行成功。

如果非要在集群中录入多个值,可以使用添加分组的方法

key值后面添加{ 组名 },就可以根据组名计算插槽,而不用再根据key值计算。此方法插入即可成功。如下图:


查询集群中的值
①cluster keyslot key:计算key值的插槽数


②cluster countkeysinslot 插槽值:计算插槽中有几个key(键)


注意: 虽然当前12706插槽中有一个k1,但12706在 6381节点的管辖的插槽值范围(10923~16383) 内。此命令只能计算当前6380节点管辖的插槽值范围(5461~10922) 内的数据。上图中的12706超出范围,因此返回0。

③cluster getkeysinslot 插槽数 个数:返回count个插槽中的key

上图表明,此时的4576插槽中只有一个k3。

故障恢复
此时我们搭建的集群中为三组“一主一从”,如果集群中某台主机挂掉,其从机立马上位接替主机工作,继续提供服务。此即为故障恢复。 如下图:


此时思考:如果此时再次重启6379服务器,6379的角色是什么?

答案是重启6379服务器,6379角色变为6389的从机,上位主机后的6389服务器依然是主机。如下图:


再次思考:如果集群中某台主机挂掉之后,此主机的所有从机也都挂掉了(如下图),整个集还能正常提供服务吗?


答案为不一定。主要要看配置文件。
某一段插槽的主从都挂掉时,集群能否提供服务主要看配置信息(cluster-require-full-coverage ):

cluster-require-full-coverage 为yes,那么 某一段插槽的主从都挂掉时,整个集群都挂掉
cluster-require-full-coverage 为no ,那么 某一段插槽的主从都挂掉时,只是该段插槽数据不能使用,也无法存储;其他段插槽依旧正常提供服务。
Redis集群的优缺点
优点:多台服务器集群可以分摊并发操作压力、实现扩容。

缺点:不支持多键操作(如mset命令会操作失败)、不支持多键的Redis事务、不支持lua脚本.

标签:redis,Redis,插槽,集群,主机,服务器
From: https://www.cnblogs.com/ruiy/p/17623432.html

相关文章

  • Redis系列18:过期数据的删除策略
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集群模式追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级......
  • SSDB Redis替代品
    SSDB是一个快速的用来存储十亿级别列表数据的开源NoSQL数据库。项目地址:https://github.com/ideawu/ssdbhttp://ssdb.io/特性替代 Redis 数据库,Redis的100倍容量LevelDB网络支持,使用C/C++开发RedisAPI兼容,支持Redis客户端适合存储集合数据,如list,hash,zse......
  • Redis/SSDB+Twemproxy安装与使用
    目前对于互联网公司不使用Redis的很少,Redis不仅仅可以作为key-value缓存,而且提供了丰富的数据结果如set、list、map等,可以实现很多复杂的功能;但是Redis本身主要用作内存缓存,不适合做持久化存储,因此目前有如SSDB、ARDB等,还有如京东的JIMDB,它们都支持Redis协议,可以支持Redis客户端......
  • 揭秘华为云GaussDB(for Redis)丨大key治理
    本文分享自华为云社区《华为云GaussDB(forRedis)揭秘第31期:大key治理》,作者:高斯Redis官方博客。从DBA的视角看,大Key无疑是引起Redis线上问题的常见原因。为了解决大Key隐患,业务首先要遵守合理的开发规范,减少大Key的产生和访问依赖。但有时大Key是在程序运行过程中悄悄产生的,让......
  • 揭秘华为云GaussDB(for Redis)丨大key治理
    本文分享自华为云社区《华为云GaussDB(forRedis)揭秘第31期:大key治理》,作者:高斯Redis官方博客。从DBA的视角看,大Key无疑是引起Redis线上问题的常见原因。为了解决大Key隐患,业务首先要遵守合理的开发规范,减少大Key的产生和访问依赖。但有时大Key是在程序运行过程中悄悄产生的,让人......
  • rancher2.7.5创建集群
    通过安装rancher2.7.5(dokcer版本)步骤,我们已经将docker单机版的rancher安装完成了,下面我们通过图形界面创建集群,首先我们先看一下rancher的首页信息:1.点击首页进入首页页面,然后点击创建按钮创建一个新的集群 2.点击完成后我们可以看到有Kubernetes集群,以及各个厂商提供的不同......
  • Redis:单机、哨兵、集群、主从复制
    学习自:redis的4种模式,单机,哨兵、主从复制、集群_redis单机和集群_本郡主是喵的博客-CSDN博客深入理解Redis的单机、主从、哨兵、集群四种模式为什么redis被称为redis服务器?因为redis在运行时是被注册为一个进程(服务),我们将其称为redis服务器。1、单机模式安装redis,启动服务后,......
  • ActiveMQ集群应用
    博客分类: 企业应用 ActiveMQ集群    ActiveMQ具有强大和灵活的集群功能,但在使用的过程中会发现很多的缺点,ActiveMQ的集群方式主要由两种:Master-Slave和BrokerCluster。1、Master-Slave    Master-Slave方式中,只能是Master提供服务,Slave是实时......
  • redis持久化
    redis持久化RDB过程:redis使用fork函数复制一份当前进程(父进程)的副本(子进程)父进程继续接受并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件当子进程写完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成在执行fork的时候操作系统会......
  • 在Java中操作Redis_Spring Data Redis使用方式_其他类型的数据操作
        ......