Redis初学17:集群

集群

简介

Redis 集群实现了对Redis的水平扩容,即启动 N 个 redis 节点,将整个数据库分布存储在这 N 个节点中,每个节点存储总数据的 1/N 。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

集群搭建

这次因为电脑性能渣渣,开不了那么多台虚拟机,就在一台服务器上模拟了。

集群的搭建最少需要6个节点

我们既然要搭建集群,那么master节点至少要3个,slave节点也是3个,为什么呢?
这是因为一个redis集群如果要对外提供可用的服务,那么集群中必须要有过半的master节点正常工作!!!
基于这个特性,如果想搭建一个能够允许 n 个master节点挂掉的集群,那么就要搭建2n+1个master节点的集群。

所以综上,易得至少需要6个节点才能搭建一个redis集群。

redis集群搭建流程

  1. 配置基本信息
    我这里弄了6个配置文件,分别是redis6370.conf(6379端口)、redis6371.conf(6371端口)、redis6380.conf(6380端口)、redis6381.conf(6381端口)、redis6390.conf(6390端口)、redis6391.conf(6391端口),拿redis6370.conf举例,里面的配置如下:
include /www/wwwroot/Redis学习/redis.conf

port 6370

pidfile "/var/run/redis_6370.pid"

dbfilename "dump6370.rdb"

dir "/www/wwwroot/Redis学习/集群/6370"

logfile "/www/wwwroot/Redis学习/集群/log/redis_err_6370.log"

# 打开集群模式
cluster-enabled yes

# 设定节点配置文件名
cluster-config-file nodes-6370.conf

# 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。
cluster-node-timeout 15000

注意:使用的是阿里云服务器的同学还需要开放服务器和阿里云安全组中对应的端口。

  1. 启动上述6个节点的redis服务
  2. 将六个节点合成一个集群
    所有节点启动好后,我们去你安装redis的目录底下,找到src目录。
    在src目录底下,输入以下命令创建集群
redis-cli --cluster create --cluster-replicas 1 118.31.109.17:6370 118.31.109.17:6380 118.31.109.17:6390 118.31.109.17:6371 118.31.109.17:6381 118.31.109.17:6391 -a 123456

注意:这里用的必须是你本机的ip地址。
说明:
前面三个是master代表的是,后面三个是slave;
“-a”后面是你设置的redis的密码,有密码的情况下得加,不然会报以下错误:
在这里插入图片描述
输入之后如下图:
在这里插入图片描述
有一个要你确认的步骤,输入yes确认。

注意:到了这里你可能会遇到一种情况,显示Waiting for the cluster to join并一直等待,如下图:
在这里插入图片描述
原因:
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口,集群总线端口为redis客户端连接的端口 + 10000
如:redis端口为6379,则集群总线端口为16379
故所有服务器的点需要开通redis的客户端连接端口和集群总线端口。如果有安全组,也要放开这两个端口

搭建集群成功,会显示关于集群里面服务器的信息,如下图:
在这里插入图片描述
这里我们把 All 16384 slots covered 这一行记一下,我们后面还会讲到。

集群的使用

集群登录

我们之前是使用redis-cli -p port的方式登录的,在集群中使用这种方式登录,可能直接进入读主机,存储数据时,会出现MOVED重定向操作。所以,应该以集群方式登录。

所以我们采用集群的方式登录,如下:

redis-cli -c -p port

说明:–c 参数实现自动重定向
这样设置数据时会自动切换到相应的写主机。

查看集群信息

我们可以通过cluster nodes命令查看集群的信息,如下图:
在这里插入图片描述
redis cluster 如何分配这六个节点?
一个集群至少要有三个主节点。
而我们之前搭建集群的命令中选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
所以这也说明了搭建集群还是最少得要有6个节点。

分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

什么是slots

我们上面在搭建完集群之后记录了一行内容,All 16384 slots covered,现在来说说它是什么意思。

一个 Redis 集群包含 16384 个插槽(hash slot),数据库中的每个键都属于这 16384 个插槽的其中一个,
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16(循环冗余校检) 校验和 。

集群中的每个节点负责处理一部分插槽。
举个例子, 如果一个集群可以有主节点, 其中:
节点 A 负责处理 0 号至 5460 号插槽。
节点 B 负责处理 5461 号至 10922 号插槽。
节点 C 负责处理 10923 号至 16383 号插槽。
如下图:
在这里插入图片描述

在集群中插入值

在集群中插入值跟我们平常一台主机插入值有稍微一点不同。
在集群中每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。

在集群中插入值这个过程就是计算你key的插槽,然后匹配到相应的redis节点中去获取value.
如下图:
在这里插入图片描述

上图中我们插入一个新值key1,然后经过计算之后得出的插槽值为9189,根据每台主机分配到的插槽范围,将这个值放到对应插槽范围的主机中去,如:9189就属于6380端口底下的主机所在的插槽,所以这个插入值就被分配到6380端口所在的主机中去了

那如果我们插入多个key和value呢?
答案:不在一个slot下的键值,是不能使用mget,mset等多键操作,如下图:
在这里插入图片描述
但是我们可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去,如下图:
在这里插入图片描述

redis集群的好处与不足

好处

  • 实现扩容
  • 分摊压力
  • 无中心配置相对简单

不足

  • 多键操作是不被支持的
  • 多键的Redis事务是不被支持的。lua脚本不被支持
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值