redis集群和分布式

一.集群概念

1.为什么要集群

解决单点故障问题
实现高可用

2.什么是集群

集群就是多个服务器做相同的事情,每个服务器都是完整的一个应用,多个服务器是复制的概念(做的业务,包含的模块都是一样的)
举例:
2个厨师每个厨师都要负责 洗菜,切菜,炒菜

1 + 1 = 2

二.分布式概念

1.为什么要分布式

2.什么是分布式

分布式就是多个服务器做不同的事情,每个服务器只是负责整个项目的一部分功能,所有服务器合起来才是一个完成的应用

举例:
3个厨师,一个厨师只负责 洗菜 , 一个厨师只负责切菜,一个厨师只负责炒菜

0.5 + 0.5 = 1

三.Redis的三种集群模式

1.主从复制(读写分离)

就一个主Redis,多个从Redis, 从Redis的数据是主Redis复制过来的 , 写操作(保存,删除,修改,查询)请求主Redis
而从Redis只能读

好处:分担读的压力

缺点:不分担些的压力 ,不解决数据量大的问题 ,主挂了,没办法自动的提升从为主

2.Redis哨兵

在主从的基础上增加了哨兵,监控主的健康状态,自动的进行从到主的提升

3.Redis-cluster集群

什么是集群

 多主多从,多主实现了分布式数据存储,多主之间相互关联

数据存储方案

分布式数据存储 , 槽位运算 ,算法CRC16(key) % 16384

Redis

一.Redis概念

1.NOSQL

非关系性数据库

1.1.什么是NOSQL

数据库 ,存数据的,解决并发,单点故障

1.2.NOSQL分类

redis非关系性和MySQL关系性

2.Redis

非关系性数据库

2.1.什么是Redis

解决并发大的问题,集群

2.2.Redis的有点
2.3.Redis的使用场景

并发高,单点故障

1.3.连接池的使用

​ 连接池的作用如下

  • 限定了最大并发连接数,防止Redis服务过多的连接

  • 避免重复创建和关闭连接,节约内存资源,和时间资源

    连接池参数设置

  • 最小连接数

  • 最大连接数

  • 创建连接超时

  • 设置连接畅通时机

四.Redis的持久化配置

1.配置文件介绍
1.1.配置项介绍
  • bind : 指定的ip才能访问
  • port : 默认端口
  • timeout : 连接超时
  • loglevel : 日志的级别
  • logfile : 日志文件输出路径
  • databases : 数据库数量
  • save 900 1 : RDB持久方式,900 秒有一个数据修改进行持久化
  • appendonely : AOF持久方式
2.持久化配置
2.1.RDB
2.2.AOF

五.Redis的淘汰策略

1.淘汰策略
1.1.为什么要淘汰
2.2.淘汰策略

六.集群理解

1.集群概念
1.1.为什么要集群
  • 防止单点故障
  • 实现高可用(作业能力)
1.2.集群和分布式

a.集群概念

b.分布式概念

c.图解集群

d.图解分布式

e.集群和分布式的区别

1.3.什么是分布式
1.4.集群和分布式的区别
1.5.集群的特性

集群应该具有如下特性:

  • 可扩展性

  • 高可用性

1.6.集群的能力

集群应该具备如下能力:

  • 负载均衡

    把请求根据某种算法相对平衡的路由到集群的应用

  • 错误恢复

    集群下的某个应用挂了需要找到能用的服务继续处理请求

  • 主备切换

    对于应用的集群,某个应用挂掉了,集群中需要有其他的应用顶上以处理请求。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pc5Kv7pn-1580916507243)(images/1573695402166.png)]

2.Redis集群概念
2.1.Redis为什么做集群
  • 防止单点故障
  • 处理高并发
  • 处理大量数据
2.2.Redis主从复制
  • 什么是主从复制

    主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

    写请求到主Redis,读请求到从Redis ,读/写的路由需要负载均衡器(主Twemproxy/从Twemproxy) ,而主从Redis的负载均衡器需要做主备切换(keeplived)

    图例:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PR8Waqvv-1580916507250)(images/1573695812943.png)]

  • 主从复制的作用

    数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

    故障恢复:当主节点出现问题时可以由从节点提供服务实现快速的故障恢复;实际上是一种服务的冗余

    负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

    读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量。

    高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

  • 主从的缺点

    不具备自动容错和恢复功能 :主从宕机会影响前端的部分请求失败,需要重启机器或者手动切换前端IP才能恢复

    主机宕机数据丢失:宕机前部分有部分数据未同步到从机,切换IP后会引入数据不一致降低系统可用性

    数据大的问题:数据量特别大一个主是存储不了

2.3.Redis哨兵模式
  • 什么是哨兵模式

    当主服务器中断服务后,可以将一个从服务器升级为主服务器,以便继续提供服务,但是这个过程需要人工手动来操作。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。

    图例:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c6lQdhkU-1580916507254)(images/1573696452540.png)]

    主观下线:

    客观下线:

    故障转移:

2.4.Redis-Cluster集群

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0DNA1NM0-1580916507264)(images/1573697135046.png)]

  • 为什么要Redis-Cluster

    redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台redis服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容

  • 什么是Redis-Cluster

    Redis-Cluster采用无中心结构,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据

  • 数据分散存储

    Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384

  • 容错机制-投票

    为了防止主节点数据丢失,可以为每个主节点可以准备特点数目的备节点,主节点挂掉从节点可以升级为主节点(哨兵模式) 。

    容错机制指的是,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作. 故障节点对应的从节点自动升级为主节点 , 如果某个主挂掉,而没有从节点可以使用,那么整个Redis集群进入宕机状态

七.Redis集群搭建

1.环境准备
1.1.Redis 3.2

​ 需要 6 台 redis 服务器。搭建伪集群。

​ 需要 6 个 redis 实例。

​ 需要运行在不同的端口 6379-6384

1.2.Ruby语言运行环境

​ 我们需要使用ruby脚本来实现集群搭建

  • Ruby 打包系统RubyGems

    RubyGems简称gems,是一个用于对 Ruby组件进行打包的 Ruby 打包系统

  • Redis的Ruby驱动redis-xxxx.gem

  • 创建Redis集群的工具redis-trib.rb

2.Redis安装
2.1.安装6台Redis

在Window搭建6个伪集群

每个Redis创建启动脚本start.bat,内容如下

title redis-3679
redis-server.exe redis.windows.conf
2.2.Redis配置

修改redis.windows.conf,端口号分别对应:6379、6380、6381、6382、6383、6384。

开启cluster-enabled :cluster-enabled yes

指定集群配置文件: cluster-config-file nodes-6379.conf,cluster-config-file nodes-6379.conf 是为该节点的配置信息,这里使用 nodes-端口.conf命名方法。服务启动后会在目录生成该文件。

指定超时:cluster-node-timeout 15000

开启持久:appendonly yes

2.3.安装Ruby

rubyinstaller-2.6.3-1-x64.exe 傻瓜式安装即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ViUDMzL7-1580916507269)(images/1573699878425.png)]

2.4.安装Ruby驱动

1.解压Ruby驱动(rubygems-2.7.7) , 进入根目录,执行

ruby setup.rb

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rP98QE9z-1580916507273)(images/1573699927339.png)]

2.切入到Redis目录执行(6379的Redis目录) gem install redis

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PZPrbXjA-1580916507282)(images/1573699963621.png)]

2.5.执行集群构建脚本

1.启动6个Redis

2.拷贝redis-trib.rb到Redis目录(6379的Redis目录)

3.在6379根目录执行构建脚本:

redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384

4.在出现 Can I set the above configuration? (type ‘yes’ to accept): 请确定并输入 yes 。成功后的结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HLREuDOg-1580916507287)(images/1573701010499.png)]

2.6.测试集群命令

启动客户端:redis-cli –c –h 127.0.0.1 –p 6379 , 可以跟任何节点的端口

查看整个集群:cluster info

查看当前Redis:info replication

查看槽位:cluster nodes

2.7.集群代码测试
@Test
public void testCluster() throws IOException, InterruptedException {
    Set<HostAndPort> nodes = new HashSet<>();
    nodes.add(new HostAndPort("127.0.0.1", 6379));
    nodes.add(new HostAndPort("127.0.0.1", 6380));
    nodes.add(new HostAndPort("127.0.0.1", 6381));
    nodes.add(new HostAndPort("127.0.0.1", 6382));
    nodes.add(new HostAndPort("127.0.0.1", 6383));
    nodes.add(new HostAndPort("127.0.0.1", 6384));
    JedisCluster cluster = new JedisCluster(nodes);
    try {
        String res = cluster.get("name");
        System.out.println(res);
    	//cluster.quit();
    } catch (Exception e) {
    	e.printStackTrace();
    	//cluster.quit();
    }
}

八.Redis相关面试题

1)简单说一下你对分布式理解?

2)简单说一下你对集群理解?

3)说一下分布式和集群联系和区别

4)redis集群方式有哪些?

5)简单说一下redis-cluster里面槽?

Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做`哈希槽 (hash slot)`的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用`CRC16`算法来取模得到所属的`slot`,然后将这个key 分到哈希槽区间的节点上,具体算法就是:`CRC16(key) % 16384`。

6)简单说一下redis-cluster里面选举投票机制

7)怎么通过命令连接redis集群 -c

8)怎么通过jedis连接集群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值