首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis 集群

Redis 集群

作者头像
Carlos Ouyang
发布于 2019-08-19 09:35:09
发布于 2019-08-19 09:35:09
2K00
代码可运行
举报
文章被收录于专栏:Java 学习日记Java 学习日记
运行总次数:0
代码可运行

Redis 集群

1 redis集群简介

1.1 集群的概念

所谓的集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态(高可用)。

1.2 使用redis集群的必要性

问题:我们已经部署好了redis,并且能启动一个redis,实现数据的读写,为什么还要学习redis集群?

  1. 单个redis存在不稳定性。当redis服务宕机了,就没有可用的服务了。
  2. 单个redis的读写能力是有限的。

redis集群是为了强化redis的读写能力。

1.3 如何学习redis集群

  1. redis集群中,每一个redis称之为一个节点。
  2. redis集群中,有两种类型的节点:主节点(master)、从节点(slave)。
  3. redis集群,是基于redis主从复制实现。

所以,学习redis集群,就是从学习redis主从复制模型开始的。

2 redis主从复制

2.1 概念

主从复制模型中,有多个redis节点。其中,有且仅有一个为主节点Master。从节点Slave可以有多个。只要网络连接正常,Master会一直将自己的数据更新同步给Slaves,保持主从同步。

2.2 特点

  1. 主节点Master可读、可写
  2. 从节点Slave只读。(read-only)

因此,主从模型可以提高读的能力,在一定程度上缓解了写的能力。因为能写仍然只有Master节点一个,可以将读的操作全部移交到从节点上,变相提高了写能力。

2.3 基于配置实现

2.3.1 需求

节点

端口

主节点

6380

从节点(两个)

6381、6382

2.3.2 配置步骤

  1. /usr/local 目录下,创建一个 /redis/master-slave 目录
  2. master-slave 目录下,创建三个子目录 6380、6381、6382
  3. 依次拷贝redis解压目录下的 redis.conf 配置文件,到这三个子目录中
  4. 进入 6380 (master) 目录,修改 redis.conf ,将 port 端口修改成 6380 即可
  5. 进入 6381 (slave) 和 6382 目录,分别修改 redis.conf,将 port 端口改成 6381、6382,同时指定开启主从复制。

2.3.3 测试

依次启动主从节点,主节点的日志中会显示从节点的连入。经测试可以看到,主节点可以读写,从节点默认只能读不能写。

3 Sentinel哨兵模式

3.1 主从模式的缺陷

当主节点宕机了,整个集群就没有可写的节点了。由于从节点上备份了主节点的所有数据,那在主节点宕机的情况下,如果能够将从节点变成一个主节点,是不是就可以解决这个问题了呢?是的,这个就是Sentinel哨兵的作用。

3.2 哨兵的任务

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会进行选举,将其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

3.2.1 监控(Monitoring)

  1. Sentinel可以监控任意多个Master和该Master下的Slaves。(即多个主从模式)
  2. 同一个哨兵下的、不同主从模型,彼此之间相互独立。
  3. Sentinel会不断检查Master和Slaves是否正常。

3.2.2 自动故障切换(Automatic failover)

3.2.2.1 Sentinel网络

监控同一个Master的Sentinel会自动连接,组成一个分布式的Sentinel网络,互相通信并交换彼此关于被监视服务器的信息。下图中,三个监控s1的Sentinel,自动组成Sentinel网络结构。

3.2.2.2 故障切换的过程
  1. 投票(半数原则):当任何一个Sentinel发现被监控的Master下线时,会通知其它的Sentinel开会,投票确定该Master是否下线(半数以上,所以sentinel通常配奇数个)。
  2. 选举:当Sentinel确定Master下线后,会在所有的Slaves中,选举一个新的节点,升级成Master节点。其它Slaves节点,转为该节点的从节点。
  3. 当原Master节点重新上线后,自动转为当前Master节点的从节点。

3.3 哨兵模式部署

3.3.1 需求

前提:已经存在一个正在运行的主从模式。

配置三个Sentinel实例,监控同一个Master节点。

3.3.2 配置Sentinel

  1. /usr/local 目录下,创建 /redis/sentinels/ 目录
  2. /sentinels 目录下,以次创建 s1、s2、s3 三个子目录
  3. 依次拷贝 redis 解压目录下的 sentinel.conf 文件,到这三个子目录中
  4. 依次修改s1、s2、s3子目录中的 sentinel.conf 文件,修改端口,并指定要监控的主节点。(从节点不需要指定,sentinel会自动识别)

依次启动三个哨兵后,可以看到日志输出

3.3.3 测试

  1. 手动关闭 6380 节点后,发现重新指定新主节点,并将另外两个节点作为从节点加入
  1. 再次上线 6380,发现被指定为从节点,只能读不能写

4 Redis-cluster集群

4.1 哨兵模式的缺陷

在哨兵模式中,仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力。我们知道只有主节点才具有写能力,那如果在一个集群中,能够配置多个主节点,是不是就可以缓解写压力了呢?是的。这个就是redis-cluster集群模式。

4.2 Redis-cluster集群概念

  1. 由多个Redis服务器组成的分布式网络服务集群;
  2. 集群之中有多个Master主节点,每一个主节点都可读可写;
  3. 节点之间会互相通信,两两相连;
  4. Redis集群无中心节点。

4.3 集群节点复制

在Redis-Cluster集群中,可以给每一个主节点添加从节点,主节点和从节点直接遵循主从模型的特性。当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能。

4.4 故障转移

Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。

集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel。

4.5 集群分片策略

Redis-cluster分片策略,是用来解决key存储位置的。

集群将整个数据库分为16384个槽位slot,所有key-value数据都存储在这些slot中的某一个上。一个slot槽位可以存放多个数据,key的槽位计算公式为:slot_number=crc16(key)%16384,其中 crc16 为 16 位的循环冗余校验和函数。

集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。

4.6 集群redirect转向

由于Redis集群无中心节点,请求会随机发给任意主节点;主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误;客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求。

4.7 集群搭建

4.7.1 准备工作

安装ruby环境

redis 集群管理工具 redis-trib.rb 依赖 ruby 环境,首先需要安装 ruby 环境:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum -y install ruby
yum -y install rubygems
安装ruby和redis的接口程序

拷贝redis-3.0.0.gem至/usr/local下,执行安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gem install /usr/local/redis-3.0.0.gem

或者直接用 gem 在线安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gem install reids
redis-trib.rb 工具

官方提供了此工具用于挂历 redis 集群,该工具就在解压目录的 src 目录下

4.7.2 集群规划

Redis集群最少需要6个节点,可以分布在一台或者多台主机上。以下测试为在一台主机上创建伪分布式集群,不同的端口表示不同的redis节点,如下:

  • 主节点:192.168.56.3:7001 192.168.56.3:7002 192.168.56.3:7003
  • 从节点:192.168.56.3:7004 192.168.56.3:7005 192.168.56.3:7006

在 /usr/local/redis 下创建 redis-cluster 目录,其下创建7001、7002...7006目录,复制 redis.conf 配置文件到每个文件夹,并配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 必选配置
port 700X
bind 192.168.X.X   
cluster-enabled yes 
# 可选配置
daemonized  yes
logfile  /usr/local/redis/redis-cluster/700X/node.log

4.7.3 启动每个结点redis服务

依次以700X下的redis.conf,启动redis节点。(必须指定redis.conf文件)

注意,需要分别进入各个文件夹启动,不然会报 cluster config file 已经被使用的错误

4.7.4 执行创建集群命令

进入到 redis 源码存放目录 src 目录下,执行redis-trib.rb,此脚本是ruby脚本,它依赖ruby环境。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./redis-trib.rb create --replicas 1 192.168.163.88:7001 192.168.163.88:7002 192.168.163.88:7003 192.168.163.88:7004 192.168.163.88:7005 192.168.163.88:7006

这里发现,最新版 redis 已经取消对 redis-trib.rb 的支持,采用示例方法创建集群

新版本的命令大全

4.7.5 查询集群信息

集群创建成功登陆任意redis结点查询集群中的节点情况。

  • -c:表示以集群方式连接redis
  • -h:指定host ip地址
  • -p:指定端口号
  • cluster nodes:查询集群结点信息
  • cluster info:查询集群状态信

4.8 集群管理

4.8.1 添加主节点

4.8.1.1 节点规划

集群创建成功后可以向集群中添加节点,下面是添加一个master主节点,添加7007节点。

配置和启动新节点的步骤略

执行下边命令添加节点(第一个地址为新节点,第二个地址为 cluster 集群中的任意一个节点地址):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./redis-trib.rb add-node  192.168.23.3:7007 192.168.23.3:7001 //已过时
redis-cli --cluster add-node 192.168.163.88:7007 192.168.163.88:7002

运行 redis-cli --cluster check 192.168.163.88:7001 检查状态,发现新节点作为主节点加入,但没有 slot 分配给它。

4.8.1.2 slot槽重新分配

添加完新的主节点后,需要对主节点进行slot槽分配,这样该主节才可以存储数据。

第一步:连接上集群

连接集群中任意一个可用节点都行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
redis-cli --cluster reshard 192.168.163.88:7001
第二步:输入要分配的槽数量

输入 500表示要分配500个槽

第三步:输入接收槽的结点id

这里输入的是新加入的节点 7007

第四步:输入源结点id

这里我选择从 7001 作为源节点获取 500 个 slot,也可以输入 all 表示从所有主节点中平均获取。可以输入多个源节点,输入done 表示输入结束。

第五步:检查结果

如果只是从一个源里转移,可以使用一句语句完成操作 redis-cli --cluster reshard 192.168.163.88:7001 --cluster-from 95252ffbf34bb114b859ed7da8a312e28347d5c1 --cluster-to e272188208df9d9080d41a89a0fffd49e503879c --cluster-slots 500

4.8.2 添加从节点

为新增的主节点添加从节点,将 7008 作为 7007 的从节点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
redis-cli --cluster add-node 192.168.163.88:7008 192.168.163.88:7001 --cluster-slave --cluster-master-id e272188208df9d9080d41a89a0fffd49e503879c

若不指定 --cluster-master-id 同时声明了 --cluster-slave,则默认会添加为第二个地址的从节点

若 7008 下面已有 nodes.conf ,添加时可能会报错, 解决方法是删除该文件后再添加

4.8.3 删除节点

使用命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
redis-cli --cluster del-node 192.168.163.88:7001 d5d9af031a714c4fe334e8950de46add16c0e6df

第一个地址为 cluster 任一节点, 后面 id 为需要删除的节点 id

需要注意的是,若删除的节点为主节点,需要将其所拥有的 slot 分配出去后才能删除,不然会报如下错误

将 7007 的 slot 转移回 7001 后删除

5 java程序连接redis集群

5.1 连接步骤

5.1.1 第一步:创建项目,导入jar包

5.1.2 第二步:创建redis集群的客户端

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.junit.Test;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;

import java.util.HashSet;
import java.util.Set;

public class ClusterTest {

    @Test
    public void ClusterConnectionTest() {
        //创建 set 集合封装所有节点信息
        Set<HostAndPort> nodes = new HashSet<>();

        //只需要添加一个节点即可,会自动搜索其它节点
        nodes.add(new HostAndPort("192.168.163.88", 7001));
        /*nodes.add(new HostAndPort("192.168.163.88", 7002));
        nodes.add(new HostAndPort("192.168.163.88", 7003));
        nodes.add(new HostAndPort("192.168.163.88", 7004));
        nodes.add(new HostAndPort("192.168.163.88", 7005));
        nodes.add(new HostAndPort("192.168.163.88", 7006));*/

        //使用节点创建一个 JedisCluster 对象
        JedisCluster jedisCluster = new JedisCluster(nodes);

        //测试连接结果
        System.out.println(jedisCluster.get("wtf"));
    }

    @Test
    public void RedisConnectionTest(){
        Jedis jedis = new Jedis("192.168.163.88", 7001);
        System.out.println(jedis.ping());
        String hello = jedis.get("hello"); //hello 存在 7001
        System.out.println(hello);

        //采用普通方式连接,若数据不是存在此节点,会报错
        /*String wtf = jedis.get("wtf");  //wtf 存在 7002
        System.out.println(wtf);*/
    }
}

5.2 注意事项

连接Redis集群时,需要修改防火墙,开方每一个redis节点的端口。

说明:如果要开发一个范围的端口,可以使用冒号来分割,即: 7001:7008,表示开发7001-7008之间所有的端口,或者使用 setup 工具设置

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
day67_Redis学习笔记_03
  上边的配置说明当前该【从redis服务器】所对应的【主redis服务器】的IP是192.168.5.128,端口是6379。
黑泽君
2018/12/06
4650
day67_Redis学习笔记_03
Redis 从入门到放飞(下)
Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。
芋道源码
2018/12/12
4160
Redis 从入门到放飞(下)
redis主从复制和集群的区别_redis主从复制和redis集群的区别
1、redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。
全栈程序员站长
2022/09/22
1.3K0
redis主从复制和集群的区别_redis主从复制和redis集群的区别
redis cluster集群工作原理_运维工作交接注意事项
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说redis cluster集群工作原理_运维工作交接注意事项,希望能够帮助大家进步!!!
Java架构师必看
2022/05/19
1.4K0
redis cluster集群工作原理_运维工作交接注意事项
1、Redis服务搭建 2、为功能添加缓存功能
2.redis介绍 2.1.什么是redis Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如 下: 字符串类型 散列类型 列表类型 集合类型 有序集合类型。 2.2.redis的应用场景 缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用) 分布式集群架构中的session分离。 聊天室的在线好友列表。 任务队列。(秒杀、抢购、12306等等) 应用排行榜。 网站访问统计。 数据过期处理(可以精确到毫秒)
爱明依
2019/03/12
5720
redis集群的搭建和jedis的使用
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
用户5927264
2019/07/31
1.1K0
Redis主从、哨兵、集群
命名设置: >6380 slaveof 127.0.0.01 6379 slaveof on one ----------配置: -- 注意一点: 一定开启rdb,不能使用aof 从节点配置: 主节点 正常配置即可
HUC思梦
2020/09/03
6230
Redis-21Redis集群模式-Centos6.5上3台主机3主3从的配置及通过代码访问集群
前面几篇博文介绍了 Redis主从 、 Redis哨兵模式 , 现在我们来了解下更加牛逼的Redis集群模式。
小小工匠
2021/08/17
6760
centos6下redis cluster集群部署过程
一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从就搭建好了。redis主从中如果主节点发生故障,不会自动切换,需要借助redis的Sentinel(哨兵模式)或者keepalive来实现主的故障转移。 今天介绍下redis cluster集群模式: redis集群是一个无中心的分布式redis存储架构,可以在多个节点之间进行数据共享,解决了redis高可用、
洗尽了浮华
2018/01/23
1.8K0
centos6下redis  cluster集群部署过程
Redis集群搭建
1.所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽 2.节点的fail是通过集群中超过半数的节点检测失效时才生效 3.客户端与Redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 4.Redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster (簇)负责维护node<->slot<->value。Redis集群中内置了16384个哈希槽,当需要在Redis集群中放置一个key-value时,Redis先对key使用crc16算法算出一个结果,然后把结果对 16384 求余数,这样每个key都会对应一个编号在 0-16383 之间的哈希槽,Redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
江南一点雨
2018/07/31
1.1K0
Redis集群搭建
Redis Cluster集群搭建及节点的添加、删除
Redis Cluster集群搭建及节点的添加、删除
Java架构师必看
2021/05/14
2K0
Redis Cluster集群搭建及节点的添加、删除
redis 集群搭建以及redisli
redis 的配置文件中的bind指定的是redis服务器的网卡ip,也就是redis服务器的ip
py3study
2020/01/06
6030
Redis集群操作手册
[root@bhz004 ~]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7001/redis.conf
HUC思梦
2020/09/03
6980
Redis集群操作手册
深入学习Redis:集群
在前面的文章中,已经介绍了Redis的几种高可用技术:持久化、主从复制和哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡。
beifengtz
2019/07/10
1.8K0
Redis之集群环境搭建
前面文章介绍了Redis的主从复制,虽然该模式能够在一定程度上提高系统的稳定性,但是在数据访问量比较大的情况下,单个master应付起来还是比较吃力的,这时我们可以考虑将redis集群部署,本文就来重点给大家介绍下Redis的集群部署操作。
用户4919348
2019/04/02
7530
Redis之集群环境搭建
【云原生进阶之PaaS中间件】第一章Redis-2.3.3集群模式
        Redis集群是一个提供在多个Redis节点之间共享数据的程序集。它并不像Redis主从复制模式那样只提供一个master节点提供写服务,而是会提供多个master节点提供写服务,每个master节点中存储的数据都不一样,这些数据通过数据分片的方式被自动分割到不同的master节点上。
江中散人_Jun
2023/10/16
6470
【云原生进阶之PaaS中间件】第一章Redis-2.3.3集群模式
如何搭建高可用redis的集群(非常详细,适合新手)
以前总结Redis 的一些基本的安装和使用,大家可以这这里查看Redis 系列文章:https://www.cnblogs.com/zhangweizhong/category/771056.html。
章为忠学架构
2019/08/08
1.4K0
如何搭建高可用redis的集群(非常详细,适合新手)
Redis 集群
sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。
星哥玩云
2022/09/15
9910
Redis 集群
Redis高可用及分片集群
一、主从复制 使用异步复制 一个服务器可以有多个从服务器 从服务器也可以有自己的从服务器 复制功能不会阻塞主服务器 可以通过服务功能来上主服务器免于持久化操作,由从服务器去执行持久化操作即可。
星哥玩云
2022/08/16
5000
Redis高可用及分片集群
一文轻松搞懂redis集群原理及搭建与使用
今天早上由于zookeeper和redis集群不在同一虚拟机导致出了点很小错误(人为),所以这里总结一下redis集群的搭建以便日后所需同时也希望能对你有所帮助。 笔主这里使用的是Centos7.如果你碰到任何问题都可以来问我
全栈程序员站长
2022/07/21
4050
相关推荐
day67_Redis学习笔记_03
更多 >
LV.0
这个人很懒,什么都没有留下~
作者相关精选
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验