IT修真院·小课堂丨互联网职业小课堂在线学习平台

课堂课题:

什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?

关联任务:

任务五

直播时间:

2019-07-13 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)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?     中品

辅导师兄 [真传弟子]JAVA-孙壮壮


标题:

什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?

开场语:

大家好,我是IT修真院上海分院第14期的学员孔晓平,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java(职业)任务6,深度思考中的知识点——什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?

1)背景介绍:

JavaEE项目,如果部署在一台Tomcat上,所有的请求,都由这一台服务器处理,存在很大风险:

A:并发处理能力有限

(一般单台服务器处理的并发量为250左右,超过250,可能会出现数据丢失,链接不稳定的情况)。因为单服务器的性能有限制。所以单台Tomcat的最大连接数有限制。

B:容错率低,一旦服务器故障,整个服务就无法访问了。

eBay 19996月停机22小时的事故,中断了约230万的拍卖,使eBay的股票下降了9.2个百分点。

C:单台服务器计算能力低,无法完成复杂的海量数据计算。

提高CPU主频和总线带宽是最初提供计算机性能的主要手段。但是这一手段对系统性能的提供是有限的。接着人们通过增加CPU个数和内存容量来提高性能,于是出现了向量机,对称多处理机(SMP)等。但是当CPU的个数超过某一阈值,这些多处理机系统的可扩展性就变的极差。主要瓶颈在于CPU访问内存的带宽并不能随着CPU个数的增加而有效增长。与SMP相反,集群系统的性能随着CPU个数的增加几乎是线性变化的。

D:那么什么是集群呢?

集群是是指将多台服务器集中在一起,每台服务器都实现相同的业务,做相同的事情。但是每台服务器并不是缺一不可,存在的作用主要是缓解并发压力和单点故障转移问题。可以利用一些廉价的符合工业标准的硬件构造高性能的系统。实现:高扩展、高性能、低成本、高可用!

2)知识剖析:

缓存使用集群主要是为了保证系统的高可用,除了可以分担一台服务器的压力外,当一个缓存服务器宕机,大量缓存失效会导致缓存雪崩,大量请求涌向数据库,数据库瞬时压力过重。这是时用缓存会把宕机的主节点下的从节点上升为主节点,这也是从一方面来保证系统的高可用。

2.1伸缩性

在一些大的系统中,预测最终用户的数量和行为是非常困难的,伸缩性是指系统适应不断增长的用户数的能力。提高这种并发会话能力的一种最直观的方式就增加资源(CPU,内存,硬盘等),集群是解决这个问题的另一种方式,它允许一组服务器组在一起,像单个服务器一样分担处理一个繁重的任务,我们只需要将新的服务器加入集群中即可,对于客户来看,服务无论从连续性还是性能上都几乎没有变化,好像系统在不知不觉中完成了升级

2.2高可用性(High availability

   单一服务器的解决方案并不是一个健壮方式,因为容易出现单点失效。像银行、账单处理这样一些关键的应用程序是不能容忍哪怕是几分钟的死机。它们需要这样一些服务在任何时间都可以访问并在可预期的合理的时间周期内有响应。高可用性集群的出现是为了使集群的整体服务尽可能可用,以便考虑计算硬件和软件的易错性。如果高可用性集群中的主节点发生了故障,那么这段时间内将由次节点代替它。次节点通常是主节点的镜像,所以当它代替主节点时,它可以完全接管其身份,并且因此使系统环境对于用户是一致的。

2.3负载均衡(Load balancing

负载均衡集群为企业需求提供了更实用的系统。如名称所暗示的,该系统使负载可以在计算机集群中尽可能平均地分摊处理。该负载可能是需要均衡的应用程序处理负载或网络流量负载。这样的系统非常适合于运行同一组应用程序的大量用户。每个节点都可以处理一部分负载,并且可以在节点之间动态分配负载,以实现平衡。

2.4高性能 (High Performance )

通常,第一种涉及为集群开发并行编程应用程序,以解决复杂的科学问题。这是并行计算的基础,尽管它不使用专门的并行超级计算机,这种超级计算机内部由十至上万个独立处理器组成。但它却使用商业系统,如通过高速连接来链接的一组单处理器或双处理器 PC,并且在公共消息传递层上进行通信以运行并行应用程序。因此,您会常常听说又有一种便宜的 Linux 超级计算机问世了。但它实际是一个计算机集群,其处理能力与真的超级计算机相等。

 

2.知识剖析

缓存使用集群主要是为了保证系统的高可用,除了可以分担一台服务器的压力外,当一个缓存服务器宕机,大量缓存失效会导致缓存雪崩,大量请求涌向数据库,数据库瞬时压力过重。这是时用缓存会把宕机的主节点下的从节点上升为主节点,这也是从一方面来保证系统的高可用。

缓存应该在什么情况下使用集群?

缓存里面主要放一些平时不怎么变动的数据用于提供数据查询,然而当读取数据请求过大,超过单一缓存承载极限那么缓存就崩了。而如果这样的情况不使用缓存的话,数据库性能限制就要分库,分表加上读写分离,极大的提高了成本。所以使用缓存可以节约大量经费,而缓存集群提高了缓存应对突发情况性能,有更强的应变能力。

Sentinel

Sentinel负责持续监视主从节点的健康,当主节点挂掉的时候,自动选择一个最优的从节点切换成主节点。客户端来连接集群时会先访问Sentinel,通过Sentinel来查询主节点的地址,然后再连接主节点进行数据交换。当出节点发生故障,客户端会重新请求地址。Sentinel会持续 监视挂掉的主节点,等到恢复后回让它成为新的从节点。 

消息丢失

Redis主从采用异步复制,这意味着当主节点挂掉时,从节点可能没有收到全部的同步消息,未同步的消息就会丢失了,如果延迟特别大,那丢失的数据会特别多。Sentinel不能保证消息完全不丢失。 只能尽量保证少丢失

Codis

CodisRedis集群方案之一,它是中国人开发并开源的。Codis使用Go语言开发,是一个代理中间件,当客户向Codis发送指令时,Codis负责将指令转发到后面的Redis实例来执行,并将返回结果再转发回客户端。

缺点

Codis中所有的key分布在不同的Redis实例中,所以就不能再支持事务,事务只能在单个实例中完成。为了支持扩容,单个keyvalue不宜过大,官方推荐单个集合总字节量不要超过1MBCodis因为增加Proxy作为中转层,所以在网络开销上比单个Redis大。

优点

Codis在设计上比Redis官方的Cluster方案简单很多,它将分布式的问题交给了第三方去负责,这样就省去了复杂的分布式一致性代码的编写和维护工作。

Cluster 

Redis Cluster Redis提供的集群方案,和Codis不同,它是去中心化的,客户端随机的请求任意一个Redis节点,然后由这个Redis节点将请求转发给正确的redis节点。 Redis Cluster将数据划分为16384slot。按照槽存储分布在多个Redis节点中,可以平滑进行增删节点,因为Redis Cluster是在Redis的主从模式和哨兵模式的基础上实现的,支持高可用和自动故障转移。

3)常见问题:

redis集群的具体搭建

4)解决方案:

Redis Cluster 

Redis Cluster 使用的数据分布方式是虚拟槽分区,所有的键的哈希值都会映射到0~16383整数槽内,三个主节点分别维护一部分槽。

我们已经知道redis存取key的时候,都要定位相应的槽(slot) Redis 集群键分布算法使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 它们的编号为0123……1638216383,这个槽是一个逻辑意义上的槽,实际上并不存在。redis中的每个key都属于这 16384 个哈希槽的其中一个,存取key时都要进行key->slot的映射计算。

HASH_SLOTkey= 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集群有核心管控吗?

A3cluster是去中心化的,没有核心管控,codis是代理模式的是有核心管控的

9)鸣谢:

感谢师兄,此教程是在他们之前技术分享的基础上完善而成。

10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

 


评论

[上海|结业弟子]JAVA-徐元祥 发表于 2019-07-15 14:15:45 #1

对redis的理解很不错了

回复

请您登录 后进行评论