课堂课题:
什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?
关联任务:
任务五
直播时间:
2019-06-09 15:00:00
课堂内容:
视频链接:
PPT链接:
提交按钮:
小课堂内容格式
标题:
【修真院xx(职业)小课堂】课题名称
开场语:
大家好,我是IT修真院XX分院第X期的学员XX,一枚正直纯洁善良的XX程序员,今天给大家分享一下,修真院官网XX(职业)任务X,深度思考中的知识点——XXX
(1)背景介绍:
背景介绍的时候,尽可能的要宽广,讲清楚来龙去脉,讲清楚为什么会需要这个技术。
(2)知识剖析:
讲知识点的时候,尽可能的成体系,学会成体系的去给别人介绍知识。现在很多做的都是零散的,没有分类。
(3)常见问题:
最少列出1个常见问题。
(4)解决方案:
写清楚常见问题的解决方案。
(5)编码实战:
尽可能的去寻找在真实项目中在用的。如果你能找到某个网站在用你说的知识点,这是最好的。学以致用,否则当成练习题就没有意义了。多准备一些demo,讲解过程中将知识点和demo结合,便于大家理解所讲解的知识点。
(6)拓展思考:
知识点之外的拓展思考,由分享人进行讲解,这些东西就是所谓的深度,也是一个人技术水准高低比较的表现。
(7)参考文献:
引入参加文献的时候,在引用的句子后面加上序号【1】。参考文献中列出详细来源。不要去抄别人的东西,这是一个基本的态度。
(8)更多讨论:
Q1:提问人:问题?
A1:回答人(可以是分享人,也可以是其他学员):回答
Q2:提问人:问题?
A2:回答人(可以是分享人,也可以是其他学员):回答
Q3:提问人:问题?
A3:回答人(可以是分享人,也可以是其他学员):回答
(9)鸣谢:
感谢XX、XX师兄,此教程是在他们之前技术分享的基础上完善而成。
(10)结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
标题:
什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?
开场语:
大家好,我是IT修真院上海分院第13期的学员陈嘉斌,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java(职业)任务6,深度思考中的知识点——什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?
(1)背景介绍:
单机Mysql的年代。当时的业务很相对简单,就是JSP---> Action---->Service---->DAO----->数据库,数据库也就是一个实例而已,无论是Mysql还是Oracle。把这五层缩减为三层的话便是:应用层------>DAO层------>Mysql实例。
NoSQL+MySQL
开始比较流行的是通过文件缓存(MongoDB)来缓解数据库的压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带来了比较高的IO压力。
互联网需求的3高
高并发(就是同一时间的访问量非常大) 2.高可扩(无论是物理主机还是云服务主机,内存资源往往是有限的,scale up不是一个好的解决办法,我们需要scale out横向可伸缩扩展,把一台服务器扩展成多台变成一个集群,而且集群都有负载均衡,分配到每台服务器上的请求也会相对少了) 3.高性能(比如单点故障、数据库容灾备份等都要求有很高的性能)
当单机处理能力达到瓶颈时,将单机复制几份分别部署,这几台单机就构成了一个集群,每一个单机服务器都是这个集群中的一个节点,每个节点都提供相同的服务,集群结构的优点就是系统扩展非常容易,随着业务的发展给集群增加节点就可以了,但是当业务发展到一定程度时增加集群节点对系统性能的提升会不明显。
分布式结构就是将一个完整的系统按照业务功能拆分成一个个独立的子系统,在分布式结构中,每一个子系统被称为服务,这些子系统能够独立运行在Web容器中,再以某种协议进行通信,比如说RPC和Http。
(2)知识剖析:
缓存使用集群主要是为了保证系统的高可用,除了可以分担一台服务器的压力外,当一个缓存服务器宕机,大量缓存失效会导致缓存雪崩,大量请求涌向数据库,数据库瞬时压力过重。这是时用缓存会把宕机的主节点下的从节点上升为主节点,这也是从一方面来保证系统的高可用。
Sentinel Seentinel
负责持续监视主从节点的健康,当主节点挂掉的时候,自动选择一个最优的从节点切换成主节点。客户端来连接集群时会先访问Sentinel,通过Sentinel来查询主节点的地址,然后再连接主节点进行数据交换。当出节点发生故障,客户端会重新请求地址。Sentinel会持续 监视挂掉的主节点,等到恢复后回让它成为新的从节点。
消息丢失
Redis主从采用异步复制,这意味着当主节点挂掉时,从节点可能没有收到全部的同步消息,未同步的消息就会丢失了,如果延迟特别大,那丢失的数据会特别多。Sentinel不能保证消息完全不丢失。 只能尽量保证少丢失
Codis
Codis是Redis集群方案之一,它是中国人开发并开源的。Codis使用Go语言开发,是一个代理中间件,当客户向Codis发送指令时,Codis负责将指令转发到后面的Redis实例来执行,并将返回结果再转发回客户端。
缺点
Codis中所有的key分布在不同的Redis实例中,所以就不能再支持事务,事务只能在单个实例中完成。为了支持扩容,单个key的value不宜过大,官方推荐单个集合总字节量不要超过1MB。Codis因为增加Proxy作为中转层,所以在网络开销上比单个Redis大。
优点
Codis在设计上比Redis官方的Cluster方案简单很多,它将分布式的问题交给了第三方去负责,这样就省去了复杂的分布式一致性代码的编写和维护工作。
Cluster
Redis Cluster 是Redis提供的集群方案,和Codis不同,它是去中心化的,客户端随机的请求任意一个Redis节点,然后由这个Redis节点将请求转发给正确的redis节点。 Redis Cluster将数据划分为16384个slot。按照槽存储分布在多个Redis节点中,可以平滑进行增删节点,因为Redis Cluster是在Redis的主从模式和哨兵模式的基础上实现的,支持高可用和自动故障转移。
(3)常见问题:
redis集群的具体搭建
(4)解决方案:
Redis Cluster
Redis Cluster 使用的数据分布方式是虚拟槽分区,所有的键的哈希值都会映射到0~16383整数槽内,三个主节点分别维护一部分槽。
我们已经知道redis存取key的时候,都要定位相应的槽(slot)。 Redis 集群键分布算法使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 它们的编号为0、1、2、3……16382、16383,这个槽是一个逻辑意义上的槽,实际上并不存在。redis中的每个key都属于这 16384 个哈希槽的其中一个,存取key时都要进行key->slot的映射计算。
HASH_SLOT(key)= CRC16(key) % 16384 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。key经过公式计算后得到所对应的哈希槽,而哈希槽被某个主节点管理,从而确定key在哪个主节点上存取,这也是redis将数据均匀分布到各个节点上的基础。
(5)编码实战:
(6)拓展思考:
(7)参考文献:
https://www.cnblogs.com/hjwublog/p/5681700.html
https://blog.csdn.net/hyl999/article/details/79552348
(8)更多讨论:
Q1:缓存在哪里使用?
A1:缓存通常会在DB之前,action之后,用来减少频繁请求数据库。
Q2:redis支持事务吗?
A2:redis支持事务,但在cluster中,因为槽在不同的节点,所以只支持在同一个节点中的事务
Q3:redis集群有核心管控吗?
A3:cluster是去中心化的,没有核心管控,codis是代理模式的是有核心管控的
(9)鸣谢:
感谢师兄,此教程是在他们之前技术分享的基础上完善而成。
(10)结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~