redis分片集群如何搭建与使用

前言

redis可以说在实际项目开发中使用的非常频繁,在redis常用集群中,我们聊到了redis常用的几种集群方案,不同的集群对应着不同的场景,并且详细说明了各种集群的优劣,本篇将以redis 分片集群为切入点,从redis 分片集群的搭建开始,详细说说redis 分片集群相关的技术点;

  • 单点故障;

  • 单机写(高并发写)瓶颈;

  • 单机存储数据容量限制;

  • 集群自动伸缩;

  • 集群自动故障下线与转移;

搭建集群架构图

redis分片集群如何搭建与使用

前置准备

1、准备一台(或6台服务器,条件允许的情况下)虚拟机或服务器;

本例为演示效果准备了一台内存8G的服务器,将通过端口进行master和slave的划分

redis分片集群如何搭建与使用

2、提前下载好redis安装包;

redis分片集群如何搭建与使用

搭建步骤

1、创建6个目录文件,分别用于保存各个redis示例的数据

mkdir 7001 7002 7003 8001 8002 8003

2、在当前目录下创建一个redis.conf文件,内容如下

port 6379# 开启集群功能cluster-enabled yes# 集群的配置文件名称,不需要我们创建,由redis自己维护cluster-config-file /usr/local/soft/redis/6379/nodes.conf# 节点心跳失败的超时时间cluster-node-timeout 5000# 持久化文件存放目录dir /usr/local/soft/redis/6379# 绑定地址bind 0.0.0.0# 让redis后台运行daemonize yes# 注册的实例ipreplica-announce-ip 本机公网IP# 保护模式protected-mode no# 数据库数量databases 1# 日志logfile /usr/local/soft/redis/6379/run.log

3、批量将该配置文件拷贝到各个目录下

echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

redis分片集群如何搭建与使用

redis分片集群如何搭建与使用

4、修改每个目录下redis.conf,将其中的6379修改为与所在目录一致

printf '%sn' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

redis分片集群如何搭建与使用

随机打开某个redis.conf看看是否修改成功

redis分片集群如何搭建与使用

4、使用下面的命令进行启动

/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7001/redis.conf/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7002/redis.conf/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7003/redis.conf/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/8001/redis.conf/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/8002/redis.conf/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/8003/redis.conf

执行完成后,可以看到6个redis实例已经开启

redis分片集群如何搭建与使用

创建集群

通过以上的步骤,就开启了6个redis的实例,但是这些实例之间并没有形成一个集群,接下来就需要执行相关的命令将它们构成一个集群

1、使用如下命令构建集群(5.0之后的版本的命令)

redis-cli --cluster create --cluster-replicas 1 IP地址:7001 IP地址:7002 IP地址:7003 IP地址:8001 IP地址:8002 IP地址:8003

关于上面命令的说明

  • redis-cli –cluster 或者 ./redis-trib.rb:代表集群操作命令;

  • create:代表是创建集群;

  • –replicas 1或者–cluster-replicas 1 :指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1)得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master ;

也可以通过 redis-cli –cluster help 命令进行集群命令的查看;

执行命令后,控制台提示将会使用哪个示例作为master,哪个作为slave;

redis分片集群如何搭建与使用

继续输入yes之后,将会按照上面的策略创建一个集群出来

redis分片集群如何搭建与使用

通过这个输出的日志大概可以得出如下信息:

  • 端口号依次为7001,7002和7003的为master节点;

  • 端口号依次为8001,8002和8003的为slave节点;

  • 端口号依次为7001,7002和7003的master节点,各自分配了一定区间的槽位数,分别是:[0-5460],[5461-10922],[10923-16383],即总共分配16384个槽位;

2、查看集群状态

redis-cli -p 7001 cluster nodes

redis分片集群如何搭建与使用

通过这个命令,可以清楚的看到集群中各个实例节点的主从状态,实例ID(少数身份标识),槽位区间等信息

Redis散列插槽说明

其实对redis分片集群稍有了解的同学应该知道,redis分片集群在逻辑上将集群中的所有节点构成了一块完整的内存空间,数据写入进来后,具体存放到哪个节点呢?所以集群引入了一个逻辑尚的插槽概念,即将集群划分为16384个槽位,集群中的每个节点占据一部分槽位数(这个日志中可以看出来);

那么当某个具体的key写入的时候,集群将会通过一定的算法,将要写入的数据路由到指定的插槽上去;

这里有个点需要注意,数据key不是与节点绑定,而是与插槽绑定。

redis集群会根据key的有效部分计算插槽值,分两种情况:

  • key中包含”{}”,且“{}”中至少包含1个字符,“{}”中的部分是有效部分;

  • key中不包含“{}”,整个key都是有效部分;

举例来说:key是num,那么就根据num计算,如果是{应用名称}num,则根据“应用名称”计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值

下面不妨看下效果

redis分片集群如何搭建与使用

通过上面的演示可以发现,经过集群计算的key将会分配到不同的插槽上,也就是说,key是与插槽绑定,而不是与某个节点绑定,想想为什么会这样呢?

思考下面这个需求

如何将同一类数据固定的保存在同一个Redis实例?

简单来说,如果key的分配完全没有规则的话,当涉及到某个业务类的数据对应的key随机分配到不同的节点上面时,取值的时候就会出现像上面的重定向跨节点的问题,一定程度上提升性能;

解决办法

这一类数据使用相同的有效部分,例如key都以{业务ID}为前缀

redis分片集群如何搭建与使用

集群伸缩(添加节点)

reids的cluster模式下,有一个比较强的功能就是集群的伸缩能力,即在现有的集群基础上,可以根据实际的业务需求,进行集群的伸缩,下面来演示下给上面的集群添加一个新节点的步骤;

1、在当前目录下拷贝一个目录

redis分片集群如何搭建与使用

2、修改配置文件的端口

sed -i s/6379/7004/g 7004/redis.conf

redis分片集群如何搭建与使用

3、启动这个实例

/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7004/redis.conf

redis分片集群如何搭建与使用

4、使用下面的命令将7004实例假如集群

redis-cli --cluster add-node IP:7004 IP:7001

redis分片集群如何搭建与使用

5、再次查看集群状态

redis-cli -p 7001 cluster nodes

redis分片集群如何搭建与使用

通过上面的状态信息发现,7004这个节点虽然加入了集群,并成了master,但是集群并没有给它分配任何的插槽

6、分配插槽

分配插槽的基本思路是,从现有的某个节点上迁移部分插槽到新的节点即可,执行下面的命令进行插槽分配

redis-cli --cluster reshard 101.34.23.80:7001

执行命令后将出现下面的提示,这里输入你要转移的插槽数量

redis分片集群如何搭建与使用

将7004对应的实例ID输入即可

redis分片集群如何搭建与使用

redis分片集群如何搭建与使用

输入yes后开始移动插槽

redis分片集群如何搭建与使用

redis分片集群如何搭建与使用

移动完成后,再次查看集群状态,这时候7004对应的节点就分配到了从0 ~ 500的数量的插槽

redis分片集群如何搭建与使用

故障转移

redis的cluster模式的集群,还具备一定的故障转移能力,比如在上面的架构模式下,当集群中的某个master节点宕机之后,会出现什么情况呢?下面我们来模拟下这个过程,看看效果如何

1、使用watch命令监控下集群的状态

通过这个命令可以实时查看集群的动态日志变化

watch redis-cli -p 7001 cluster nodes

redis分片集群如何搭建与使用

2、手动将7002实例的master宕机

redis-cli -p 7002 shutdown

redis分片集群如何搭建与使用

从上面的监控日志不难发现,当7002挂掉后,过了一会儿与集群以及它的从节点8003失去了联系,然后8003这个节点升级为master节点;

3、手动将7002实例启动起来

/usr/local/soft/redis/redis60/src/redis-server /usr/local/soft/redis/7002/redis.conf

redis分片集群如何搭建与使用

再次分析日志,可以看到这时候7002只能以slave的身份加入了集群,事实上在某些情况下,我们仍然希望这个宕机的节点恢复后依然是主节点,这该怎么办呢?这就涉及到了手动故障转移,主要操作步骤如下:

  • 使用redis-cli连接7002节点;

  • 执行cluster failover命令;

在上面执行之后的情况下,7002是一个slave节点

redis分片集群如何搭建与使用

执行 CLUSTER FAILOVER 命令,观察日志动态变化,通过日志变化,可以看到,命令执行完毕后,7002很快就变成了master,而8003成了slave;

redis分片集群如何搭建与使用

通过以上步骤就完成了redis的cluster模式下的故障转移的过程

使用redistemplate访问分片集群

1、引入依赖

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis</artifactId></dependency>

2、将配置文件中的集群地址修改成下面这样即可

spring:  redis:    cluster:      nodes:       - 集群IP:7001       - 集群IP:7002       - 集群IP:7003       - 集群IP:7004       - 集群IP:8001       - 集群IP:8002       - 集群IP:8003

至于具体的代码部分,可以参考下面的这个测试案例

	@Autowired    private RedisTemplate<String,String> redisTemplate;    //localhost:8083/set?key=b&value=123    @GetMapping("/set")    public void set(@RequestParam String key,@RequestParam String value){        redisTemplate.opsForValue().set(key,value);    }    //localhost:8083/get?key=b    @GetMapping("/get")    public String get(@RequestParam String key){        return redisTemplate.opsForValue().get(key);    }

读到这里,这篇“redis分片集群如何搭建与使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

文章标题:redis分片集群如何搭建与使用,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/24672

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月13日 下午11:41
下一篇 2022年9月13日 下午11:42

相关推荐

  • Redis实现限流器的方法有哪些

    方法一:基于Redis的setnx的操作 我们在使用Redis的分布式锁的时候,大家都知道是依靠了setnx的指令,在CAS(Compare and swap)的操作的时候,同时给指定的key设置了过期实践(expire),我们在限流的主要目的就是为了在单位时间内,有且仅有N数量的请求能够访问我的代…

    2022年9月10日
    60500
  • MySQL索引结构实例分析

    简介 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。 优点: 1、类似大学图书馆建书目索…

    2022年9月1日
    59900
  • MySQL触发器如何创建与删除

    1.为什么需要触发器 有一些表是互相关联的,比如说商品表和库存表,我们对商品表的数据进行操作,那么对应的库存表还得发生变化,这样才可以保证数据的完整。如果我们是自己手动维护的话,比较麻烦。这个时候我们可以使用触发器,创建一个触发器,让商品信息数据的插入操作自动触发库存数据的插入操作等,这样我们就不需…

    2022年9月18日
    83100
  • microsoft visual c++可不可以卸载

    microsoft visual c++可以卸载吗 microsoft visual c++不建议卸载。 1.Microsoft Visual C++ Redistributable Package是Visual C++的运行时组件和库 2.很多软件,尤其是游戏所必须的 Microsoft VC++…

    2022年9月2日
    2.3K00
  • python标准库模块之json库怎么使用

    前言 json,全称为JavaScript Object Notation,也就是JavaScript对象标记,通过对象和数组的组合表示数据,虽然构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。 作用 主要用于将python对象编码为json格式输出或存储,以及将json格式对象解码为py…

    2022年9月21日
    86700
  • video接口指的是什么

    video接口指的是“复合视频接口”,是音频、视频分离的视频接口,一般由三个独立RCA插头组成,其中V接口连接混合视频信号,为黄色插口;L接口连接左声道声音信号,为白色插口;R接口连接右声道声音信号,为红色插口。 本教程操作环境:windows7系统、Dell G3电脑。 video是什么接口 复合…

    2022年9月2日
    1.6K00
  • 使用ajax要不要引入jquery

    使用ajax不需要引入jquery;ajax全称是“Asynchronous javascript and XML”,也即异步JavaScript和XML,是指一种创建交互网页应用的网页开发技术,JavaScript原本就支持ajax,若是使用原生的ajax请求,当然不需要引入jquery。 本文操…

    2022年8月31日
    70900
  • windows msedge.exe应用程序有什么功能

    “msedge.exe”指的是“Microsoft Edge”网页浏览器软件;“Microsoft Edge”是由Microsoft开发的网页浏览器,该浏览器在2015年被正式命名,并且内置在了Windows10版本中;该浏览器与IE浏览器相比,Edge将支持现代浏览器功能,比如扩展。 本教程操作环…

    2022年9月10日
    1.3K00
  • Javascript如何将数组转换为对象

    将数组转换为对象 如果要将数组转换为对象,非常快的方法莫过于spread运算符(…)。 var plants = [‘Saturn’, ‘Earth’, ‘Uranus’, ‘Mercury’, ‘Venus’, ‘Earth’, ‘Mars’, ‘Jupiter’];var plant…

    2022年8月31日
    58800
  • jquery如何监听select的改变

    监听步骤:1、利用change()给select元素绑定改变事件,并设置事件处理函数,语法“$(“select”).change(function() {…});”;2、在事件处理函数中,设置事件触发后需要执行的代码,语法“alert(“选项已被改变&…

    2022年9月13日
    4.0K00
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部