- 博客(119)
- 收藏
- 关注
原创 Redis集群模式高可用原理
什么是 Cluster 集群Redis 集群是一种分布式数据库方案,集群通过分片(sharding)来进行数据管理(「分治思想」的一种实践),并提供复制和故障转移功能。将数据划分为 16384 的 slots,每个节点负责一部分槽位。槽位的信息存储于每个节点中。它是去中心化的,如图所示,该集群有三个 Redis 节点组成,每个节点负责整个集群的一部分数据,每个节点负责的数据多少可能不一样。...
2021-11-30 12:36:24
415
原创 Redis哨兵模式高可用原理
我们知道主从复制是高可用的基石,从库宕机依然可以将请求发送给主库或者其他从库,但是 Master 宕机,只能响应读操作,写请求无法再执行。所以主从复制架构面临一个严峻问题,主库挂了,无法执行「写操作」,无法自动选择一个 Slave 切换为 Master,也就是无法故障自动切换。什么是哨兵(Sentinel)搭建实例采用三个哨兵形成集群,三个数据节点(一主两从)方式搭建,如下图所示:...
2021-11-29 07:40:38
618
原创 Redis主从复制
主从复制概述有了 RDB 和 AOF 再也不怕宕机丢失数据了,但是 Redis 实例宕机了怎么实现高可用呢?既然一台宕机了无法提供服务,那多台呢?是不是就可以解决了。Redis 提供了主从模式,通过主从复制,将数据冗余一份复制到其他 Redis 服务器。前者称为主节点 (master),后者称为从节点 (slave);数据的复制是单向的,只能由主节点到从节点。为了保证副本数据的一致性,主从架...
2021-11-29 07:40:25
662
原创 Redis持久化机制
我们通常将 Redis 作为缓存使用,提高读取响应性能,一旦 Redis 宕机,内存中的数据全部丢失,假如现在直接访问数据库大量流量打到 MySQL 可能会带来更加严重的问题。另外慢慢的从数据库读取放到 Redis 性能必然比不过从 Redis 获取快,也会导致响应变慢。Redis 为了实现无畏宕机快速恢复,设计了两大杀手锏,分别是 AOF(Append Only FIle)日志和 RDB 快...
2021-11-28 16:31:08
428
原创 Redis为什么这么快
到底有多快根据官方数据,Redis 的 QPS 可以达到约 100000(每秒请求数),有兴趣的可以参考官方的基准程序测试《How fast is Redis?》,地址:https://redis.io/topics/benchmarks基于内存实现Redis 是基于内存的数据库,跟磁盘数据库相比,完全吊打磁盘的速度。不论读写操作都是在内存上完成的,我们分别对比下内存操作与磁盘操作的差...
2021-11-28 16:04:51
506
原创 Redis 客户端 Jedis 的特性和原理
Redis 作为目前通用的缓存选型,因其高性能而倍受欢迎。Redis 的 2.x 版本仅支持单机模式,从 3.0 版本开始引入集群模式。Redis 的 Java 生态的客户端当中包含 Jedis、Redisson、Lettuce,不同的客户端具备不同的能力是使用方式,本文主要分析 Jedis 客户端。Jedis 客户端同时支持单机模式、分片模式、集群模式的访问模式,通过构建 Jedis 类对象...
2021-11-15 15:46:06
807
原创 ActiveMQ中拉模式与推模式
拉模式(点对点消息)如果没有消费者在监听队列,消息将保留在队列中,直至消息消费者连接到队列为止。在这种模型中,消息不是自动推动给消息消费者的,而是要由消息消费者从队列中请求获得。推模式(发布订阅消息)在该模型中,消息会自动广播,消息消费者无须通过主动请求或轮询主题的方法来获得新的消息。消息队列比较核心的应用场合有三个:解耦、异步和削峰在消息队列中一种常用的消息推送类型是推拉模式下面是推...
2021-09-27 09:59:27
488
原创 弹力设计之降级设计
所谓的降级设计(Degradation),本质是为了解决资源不足和访问量过大的问题。当资源和访问量出现矛盾的时候,在有限的资源下,为了能够扛住大量的请求,我们就需要对系统进行降级操作。也就是说,暂时牺牲掉一些东西,以保障整个系统的平稳运行。一般来说,我们的降级需要牺牲掉的东西有:降低一致性。从强一致性变成最终一致性。停止次要功能。停止访问不重要的功能,从而释放出更多的资源。简化功能...
2021-09-27 09:59:19
91
原创 弹力设计之限流设计
保护系统不会在过载的情况下出现问题,我们就需要限流。我们在一些系统中都可以看到这样的设计,比如,我们的数据库访问的连接池,还有我们的线程池,还有 Nginx 下的用于限制瞬时并发连接数的 limit_conn 模块,限制每秒平均速率的 limit_req 模块,还有限制 MQ 的生产速,等等。限流的策略限流的目的是通过对并发访问进行限速,相关的策略一般是,一旦达到限制的速率,那么就会触发相应...
2021-09-26 09:20:02
97
原创 弹力设计之熔断设计
熔断机制这个词肯定不陌生,它的灵感来源于我们电闸上的“保险丝”,当电压有问题时(比如短路),自动跳闸,此时电路就会断开,我们的电器就会受到保护。不然,会导致电器被烧坏,如果人没在家或是人在熟睡中,还会导致火灾。所以,在电路世界通常都会有这样的自我保护装置。同样,在我们的分布式系统设计中,也应该有这样的方式。前面说过重试机制,如果错误太多,或是在短时间内得不到修复,那么我们重试也没有意义了,此时应...
2021-09-26 09:19:56
107
原创 弹力设计之重试设计
关于重试,这个模式应该是一个很普遍的设计模式了。当我们把单体应用服务化,尤其是微服务化,本来在一个进程内的函数调用就成了远程调用,这样就会涉及到网络上的问题。网络上有很多的各式各样的组件,如 DNS 服务、网卡、交换机、路由器、负载均衡等设备,这些设备都不一定是稳定的。在数据传输的整个过程中,只要任何一个环节出了问题,最后都会影响系统的稳定性。重试的场景所以,我们需要一个重试的机制。但是,我...
2021-09-24 10:08:11
90
原创 弹力设计之幂等性设计
所谓幂等性设计,就是说,一次和多次请求某一个资源应该具有同样的副作用。用数学的语言来表达就是:f(x) = f(f(x))。比如,求绝对值的函数,abs(x) = abs(abs(x))。为什么我们需要这样的操作?说白了,就是在我们把系统解耦隔离后,服务间的调用可能会有三个状态,一个是成功(Success),一个是失败(Failed),一个是超时(Timeout)。前两者都是明确的状态,而超时...
2021-09-24 10:08:02
84
原创 弹力设计之异步通讯设计
前面所说的隔离设计通常都需要对系统做解耦设计,而把一个单体系统解耦,不单单是把业务功能拆分出来,正如上面所说,拆分完后还会面对很多的问题。其中一个重要的问题就是这些系统间的通讯。通讯一般来说分同步和异步两种。同步通讯就像打电话,需要实时响应,而异步通讯就像发邮件,不需要马上回复。各有千秋,我们很难说谁比谁好。但是在面对超高吐吞量的场景下,异步处理就比同步处理有比较大的优势了,这就好像一个人不可能...
2021-09-23 10:12:48
143
原创 弹力设计之隔离设计
隔离设计对应的单词是 Bulkheads,中文翻译为隔板。但其实,这个术语是用在造船上的,也就是船舱里防漏水的隔板。一般的船无论大小都会有这个东西,大一点的船都会把船舱隔成若干个空间。这样,如果船舱漏水,只会进到一个小空间里,不会让整个船舱都进水而导致整艘船都沉了,如下图所示。我们的软件设计当然也“漏水”,所以为了不让“故障”蔓延开来,需要使用“隔板”技术,来将架构分隔成多个“船...
2021-09-23 10:12:36
149
原创 弹力设计简介
弹力设计又叫容错设计,其中着眼于分布式系统的各种“容忍”能力,包括容错能力(服务隔离、异步调用、请求幂等性)、可伸缩性(有 / 无状态的服务)、一致性(补偿事务、重试)、应对大流量的能力(熔断、降级)。可以看到,在确保系统正确性的前提下,系统的可用性是弹力设计保障的重点。系统可用性测量对于分布式系统的容错设计,在英文中又叫 Resiliency(弹力)。意思是,系统在不健康、不顺,甚至出错的情...
2021-09-22 09:26:47
120
原创 分布式系统之全栈监控
首先,我们需要全栈系统监控,它就像是我们的眼睛,没有它,我们就不知道系统到底发生了什么,我们将无法管理或是运维整个分布式系统。所以,这个系统是非常非常关键的。而在分布式或 Cloud Native 的情况下,系统分成多层,服务各种关联,需要监控的东西特别多。没有一个好的监控系统,我们将无法进行自动化运维和资源调度。这个监控系统需要完成的功能为:全栈监控;关联分析;跨系统调用的串联;实时...
2021-09-22 09:26:40
205
原创 分布式系统的技术栈
构建分布式系统的目的是增加系统容量,提高系统的可用性,转换成技术方面,也就是完成下面两件事。大流量处理。通过集群技术把大规模并发请求的负载分散到不同的机器上。关键业务保护。提高后台服务的可用性,把故障隔离起来阻止多米诺骨牌效应(雪崩效应)。如果流量过大,需要对业务降级,以保护关键业务流转。说白了就是干两件事。一是提高整体架构的吞吐量,服务更多的并发和流量,二是为了提高系统的稳定性,让系统的可用...
2021-09-18 14:51:49
246
原创 分布式系统架构简介
最近几年,我们一直在谈论各式各样的架构,如高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等。还有和这些架构相关的管理型的技术方法,如 DevOps、应用监控、自动化运维、SOA 服务治理、去 IOE 等。面对这么多纷乱的技术,很多团队或是公司都是一个一个地去做这些技术,非常辛苦,也非常累。这样的做法就像我们在撑开一张网里面一个一个的网眼。其实,只要我们能够找到这张网的“纲...
2021-09-18 14:35:45
430
原创 https原理解读
https这项技术现在已经应用得非常广泛了。随着苹果、Google等各大互联网领头企业纷纷在自己的操作系统、浏览器等主流产品中强制要求使用https,http的淘汰也正式进入了倒计时。其实https对于客户端开发人员来说并没有什么需要特别注意的地方,因为代码和写http请求时并没有什么两样。但也正是因为这个原因,导致许多客户端开发人员对https并不了解,只知道它是安全的加密网络传输,对其具体的...
2021-09-03 10:32:52
132
原创 存储过程在SQL中的应用
SQL 的存储过程,它是 SQL 中另一个重要应用,和视图一样,都是对 SQL 代码进行封装,可以反复利用。它和视图有着同样的优点,清晰、安全,还可以减少网络传输量。不过它和视图不同,视图是虚拟表,通常不对底层数据表直接操作,而存储过程是程序化的 SQL,可以直接操作底层数据表,相比于面向集合的操作方式,能够实现一些更复杂的数据处理。存储过程可以说是由 SQL 语句和流控制语句构成的语句集合,它和...
2021-08-21 08:02:33
422
原创 视图在SQL中的应用
我们之前对 SQL 中的数据表查询进行了讲解,今天我们来看下如何对视图进行查询。视图,也就是我们今天要讲的虚拟表,本身是不具有数据的,它是 SQL 中的一个重要概念。从下面这张图中,你能看到,虚拟表的创建连接了一个或多个数据表,不同的查询应用都可以建立在虚拟表之上。视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。比如,针对一个公司的销售人...
2021-08-21 08:02:18
625
原创 SQL函数
函数在计算机语言的使用中贯穿始终,在 SQL 中我们也可以使用函数对检索出来的数据进行函数操作,比如求某列数据的平均值,或者求字符串的长度等。从函数定义的角度出发,我们可以将函数分成内置函数和自定义函数。在 SQL 语言中,同样也包括了内置函数和自定义函数。内置函数是系统内置的通用函数,而自定义函数是我们根据自己的需要编写的,下面讲解的是 SQL 的内置函数。什么是 SQL 函数当我们学习编程...
2021-08-20 10:49:59
745
原创 SQL是如何执行的
虽然 SQL 是声明式语言,我们可以像使用英语一样使用它,不过在 RDBMS(关系型数据库管理系统)中,SQL 的实现方式还是有差别的。接下里从数据库的角度来思考一下 SQL 是如何被执行的。Oracle 中的 SQL 是如何执行的我们先来看下 SQL 在 Oracle 中的执行过程:从上面这张图中可以看出,SQL 语句在 Oracle 中经历了以下的几个步骤。语法检查:检查 ...
2021-08-20 10:22:38
399
原创 Mysql索引
提起优化 SQL,可能会把它理解为优化索引。简单来说这也不算错,索引在 SQL 优化中占了很大的比重。索引用得好,可以将 SQL 查询的效率提升 10 倍甚至更多。但索引是万能的吗?既然索引可以提升效率,只要创建索引不就好了吗?实际上,在有些情况下,创建索引反而会降低效率。索引是万能的吗?首先我们需要了解什么是索引(Index)。数据库中的索引,就好比一本书的目录,它可以帮我们快速进行特定...
2021-08-17 14:42:27
73
原创 秒杀系统设计
前言高并发下如何设计秒杀系统?这是一个高频面试题。这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识。秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个)的商品(比如:手机),以极低的价格(比如:0.1元),让大量用户参与活动,但只有极少数用户能够购买成功。这类活动商家绝大部分是不赚钱的,说白了是找个噱头宣传自己。虽说秒杀只是一个促销活动,但对技术...
2021-08-10 15:04:19
323
原创 Java中的双重检查锁(double checked locking)
在实现单例模式时,如果未考虑多线程的情况,就容易写出下面的错误代码:public class Singleton { private static Singleton uniqueSingleton; private Singleton() { } public Singleton getInstance() { if (null == uni...
2019-10-05 11:08:06
57
原创 Redis分布式锁的实现
分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本文将基于Redis实现分布式锁。可靠性为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件:互斥性。在任意时刻,只有一个客户端能持有锁。不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。具有容错性。只要大部分的...
2018-12-20 21:41:07
43
原创 高并发环境下的限流策略
本文将从以下几个方面分析限流策略:什么是限流限流算法限流算法的应用什么是限流在开发高并发系统时,有很多手段来防止系统过载:缓存、降级、限流。缓存的目的是提升系统访问速度和增大系统的吞吐量,降级和限流的目的如下:降级降级是当服务出问题或者影响到核心流程的性能时需要暂时屏蔽掉某些功能,等高峰或者问题解决后再打开。降级一般有几种实现手段,自动降级和人工降级:1、通过配置降级开关,实...
2018-12-19 20:42:23
77
原创 分布式事务的解决方案
本文从以下几个方面介绍分布式事务的解决方案:为什么会有分布式事务分布式事务经典模型分布式事务解决方案为什么会有分布式事务假设有如下一个架构,这是一个简单的电商架构平台,两个应用节点,一个数据库,一个负载均衡器。这个架构下,每天会产生将近 100W 的订单量。那么一个月的数据量就会超过 3000W。而随着数据量的不断扩大,对于订单表的相关查询操作的性能开销就越来越大。并且响应耗时也...
2018-12-16 14:09:20
42
原创 单点登录解决方案
本文将从以下几个方面介绍单点登录问题,和单点登录的解决方案:http 协议的特性集群环境下的 session 共享问题关于负载均衡算法分析session 共享问题的解决办法http 协议无状态性Http 协议本身是无状态的,客户端只需简单的向服务器发送请求,获取结果。无论是客户端还是服务器都没必要记录彼此过去的行为,每一次请求之间都是独立的。然而我们发现如果能够提供一些按照...
2018-12-15 21:57:10
143
原创 Java NIO之Selector
最后介绍一下Selector,选择器提供选择执行已经就绪的任务的能力,这使得多元I/O成为了可能,就绪执行和多元选择使得单线程能够有效地同时管理多个I/O通道。选择器的执行主要分为以下几个步骤:1、创建一个或者多个可选择的通道(SelectableChannel)2、将这些创建的通道注册到选择器对象中3、选择器会记住开发者关心的通道,它们也会追踪对应的通道是否已经就绪4、开发者调用一个选择...
2018-12-08 18:11:10
41
原创 Java NIO之Buffer
Buffer是固定大小的数据的容器,其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索。缓冲区的工作与通道紧密联系,待传递出去的数据被置于一个缓冲区,被传送到通道;待传回的缓冲区的传输,一个通道将数据放置在所提供的缓冲区中。这种在协同对象之间进行的缓冲区数据传递是高效数据处理的关键。Buffer类的层次图下图是Buffer类的层次图。在顶部是通用Buffer类,Buffer...
2018-12-08 17:48:23
34
原创 Java NIO之Channel
本文开始讲解Java NIO 的三个核心组件,Channel,Buffer,Selector。先从Channel开始,Channel指的是通道。Channel用于在字节缓冲区和位于通道另一侧的实体(通常是一个文件或套接字)之间有效地传输数据。通道是一种途径,借助该途径,可以用最小的总开销来访问操作系统本身的I/O服务。通道基础首先,看一下基本的Channel接口,下面是Channel接口的完整...
2018-12-06 23:53:54
60
原创 Java BIO模型
前面介绍了IO的分类和区别,本文将实现一个输入字符表达式,输出算术结果的BIO程序。通过该程序帮助进一步理解什么是同步阻塞IO。服务端BIOServer,启动服务端,并循环监听客户端连接,每监听到一个请求,创建一个新线程处理数据。注意serverSocket.accept()方法,在未接收到连接时,会一直阻塞。public class BIOServer { //默认的端口号 ...
2018-12-06 22:12:58
32
原创 MyBatis二级缓存原理解析
MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。什么是二级缓存如上图所示,当开一个会话时,一个SqlSession对象会使用一个Executor对象来完成会话操作,MyBatis的二级缓存机制的关键就是对这个Executor对象做文章。如果用户配置了"cacheEnabled=true",那么MyBatis在为SqlSessi...
2018-12-05 22:10:03
68
原创 MyBatis一级缓存原理解析
MyBatis是一个简单,小巧但功能非常强大的ORM开源框架,它的功能强大也体现在它的缓存机制上。MyBatis提供了一级缓存、二级缓存 这两个缓存机制,能够很好地处理和维护缓存,以提高系统的性能。本文将介绍MyBatis的一级缓存,并深入源码解析MyBatis一级缓存的实现原理。什么是一级缓存?每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对...
2018-12-05 22:02:42
197
1
原创 MyBatis事务管理机制
MyBatis作为Java语言的数据库框架,对数据库的事务管理是其非常重要的一个方面。本文将从事务的分类、配置和实现分析MyBatis的事务管理的实现机制。MyBatis事务的分类对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close)。对应地,MyBatis将事务抽象成了Transaction接口:其接口定义如下:...
2018-12-05 21:53:14
56
原创 Mybatis数据源和连接池
本文将从以下几个方面介绍Mybatis的数据源和连接池:MyBatis数据源DataSource分类数据源DataSource的创建过程DataSource什么时候创建Connection对象MyBatis数据源DataSource分类MyBatis数据源实现是在以下四个包中:MyBatis把数据源DataSource分为三种:1、UNPOOLED:不使用连接池的数据源...
2018-12-05 21:40:26
61
原创 Mybatis初始化机制解析
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。本文从深入分析Mybatis的初始化过程。...
2018-12-04 23:28:34
29
原创 分布式一致性协议2PC与3PC
为了解决分布式一致性问题,涌现出了一大批经典的分布式一致性算法,其中最著名的就是2PC、3PC和Paxos。本文将介绍其中的2PC和3PC。2PC即Two-Phase Commit,译为二阶段提交协议。3PC即Three-Phase Commit,译为三阶段提交协议。2PC2PC,二阶段提交协议,即将事务的提交过程分为两个阶段来进行处理:准备阶段和提交阶段。事务的发起者称协调者,事务的执行者称...
2018-12-03 23:37:31
44
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人