一.集群概念
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连接集群