自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(471)
  • 收藏
  • 关注

原创 Zookeeper 特点及关键特性

1 ZooKeeper简介ZooKeeper 是一个开源的分布式协调框架,它的定位是为分布式应用提供一致性服务,是整个大数据体系的管理员。ZooKeeper 会封装好复杂易出错的关键服务,将高效、稳定、易用的服务提供给用户使用。如果上面的官方言语你不太理解,你可以认为 ZooKeeper = 文件系统 + 监听通知机制。1.1 文件系统Zookeeper维护一个类似文件系统的树状数据结构,这种特性使得 Zookeeper 不能用于存放大量的数据,每个节点的存放数据上限为1M。每个子目录项如 Nam

2021-04-16 20:59:44 1

转载 Raft 与 Zab 对比

0 一致性问题一致性算法在实现状态机这种应用时,有哪些常见的问题:1 leader选举1.1 一般的leader选举过程选举的轮次选举出来的leader要包含更多的日志1.2 leader选举的效率会不会出现split vote?以及各自的特点是?1.3 加入一个已经完成选举的集群怎么发现已完成选举的leader?加入过程是否对leader处理请求的过程造成阻塞?1.4 leader选举的触发谁在负责检测需要进入leader选举?2 上一轮次

2021-04-16 20:21:11 4

原创 一致性算法(三):ZAB

1 ZAB介绍ZAB协议全称就是ZooKeeper Atomic Broadcast protocol,是ZooKeeper用来实现一致性的算法,分成如下4个阶段。先来解释下部分名词electionEpoch:每执行一次leader选举,electionEpoch就会自增,用来标记leader选举的轮次peerEpoch:每次leader选举完成之后,都会选举出一个新的peerEpoch,用来标记事务请求所属的轮次zxid:事务请求的唯一标记,由leader服务器负责进行分配。由2部分构成,高32

2021-04-16 20:20:45 8

转载 实例详解 ZooKeeper ZAB 协议

ZooKeeper是什么ZooKeeper是一个分布式协调服务,可用于服务发现、分布式锁、分布式领导选举、配置管理等。这一切的基础,都是ZooKeeper提供了一个类似于Linux文件系统的树形结构(可认为是轻量级的内存文件系统,但只适合存少量信息,完全不适合存储大量文件或者大文件),同时提供了对于每个节点的监控与通知机制。既然是一个文件系统,就不得不提ZooKeeper是如何保证数据的一致性的。本节将将介绍ZooKeeper如何保证数据一致性,如何进行领导选举,以及数据监控/通知机制的语义保证。Z

2021-04-16 20:20:14 5

原创 一致性算法(二):Raft

1 leader选举1.1 刚开始所有server启动都是follower状态然后等待leader或者candidate的RPC请求、或者超时。上述3种情况处理如下:leader的AppendEntries RPC请求:更新term和leader信息,当前follower再重新重置到follower状态candidate的RequestVote RPC请求:为candidate进行投票,如果candidate的term比自己的大,则当前follower再重新重置到follower状态超时:转

2021-04-16 20:02:25 1

转载 一文搞懂 Raft 算法

一文搞懂Raft算法目录raft算法概览leader electionterm选举过程详解log replicationReplicated state machines请求完整流程safetycorner casestale leaderState Machine Safetyleader crash总结references正文raft是工程上使用较为广泛的强一致性、去中心化、高可用的分布式协议。在这里强调了是在工程上,因为在学术理论界,最耀眼的还是

2021-04-15 15:46:24 9

原创 一致性算法(一):Paxos

Paxos 算法Paxos 算法是莱斯利·兰伯特于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。问题分布式系统中的节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。基于消息传递通信模型的分布式系统,不可避免的会发生以下错误:进程可能会慢、被杀死或者重启,消息可能会延迟、丢失、重复,在基础 Paxos 场景中,先不考虑可能出现消息篡改即拜占庭错误的情况。Paxos 算法解决的问题是在一个可能发生上述异常的分布式系统中如何就某

2021-04-14 14:44:01 4

转载 分布式系列文章——Paxos算法原理与推导

分布式系列文章——Paxos算法原理与推导Paxos算法在分布式领域具有非常重要的地位。但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难。网上有很多讲解Paxos算法的文章,但是质量参差不齐。看了很多关于Paxos的资料后发现,学习Paxos最好的资料是论文《Paxos Made Simple》,其次是中、英文版维基百科对Paxos的介绍。本文试图带大家一步步揭开Paxos神秘的面纱。Paxos是什么Paxos算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决

2021-04-14 14:41:00 16

转载 RocketMQ 与 Kafka 性能对比大揭秘

1、文件布局1.1 Kafka 文件布局Kafka 文件在宏观上的布局如下图所示:正如上图所示,Kafka 文件布局的主要特征如下:文件的组织以 topic + 分区进行组织,每一个 topic 可以创建多个分区,每一个分区包含单独的文件夹,并且是多副本机制,即 topic 的每一个分区会有 Leader 与 Follow,并且 Kafka 内部有机制保证 topic 的某一个分区的 Leader 与 follow 不会存在在同一台机器,并且每一台 broker 会尽量均衡的承担各个分区的 Lea

2021-04-12 21:11:13 12

原创 RocketMQ 与 Kafka 主要异同

相同点总得来讲两者底层原理有很多相似之处,RocketMQ借鉴了Kafka的设计两者均采用顺序写、零拷贝机制进行写消息与发送消息,极大地保证了系统的性能不同点部署架构不同高可用RocketMQ在高可用设计上粒度只控制在Broker。其保证高可用是通过master-slave主从复制来解决的。Kafka控制高可用的粒度是放在分区上。每个topic的leader分区和replica分区都可以在所有broker上负载均衡的存储。Kafka的这种设计相比RocketMQ这种主从复制的设计有以

2021-04-12 21:02:04 19

原创 RocketMQ 核心原理总结

Topic 的路由机制介绍路由注册机制之前,先简单看下 RocketMQ 的整体架构:Producer:消息生产者,用于向消息服务器发送消息;NameServer:路由注册中心;Broker:消息存储服务器;Consumer:消息消费者,该流程图中未涉及;联通性:A. NameServer 之间互不通信,无法感知对方的存在。B. Producer 生产者与 NameServer 集群中的一台服务器建立长连接,并持有整个 NameServer 集群的列表。C. Broker 服务会与

2021-04-12 18:23:05 17

原创 Kafka 请求处理流程、重平衡流程

Kafka 请求处理流程响应式模型Kafka 采用的是一种 响应式(Reactor)模型,那么什么是响应式模型呢?简单的说,Reactor 模式是事件驱动架构的一种实现方式,特别适合应用于处理多个客户端并发向服务器端发送请求的场景,如下图所示Kafka 的 broker 端有个 SocketServer 组件,类似于处理器,SocketServer 是基于 TCP 的 Socket 连接的,它用于接受客户端请求,所有的请求消息都包含一个消息头,消息头中都包含如下信息Request type (也

2021-04-12 17:27:32 10

原创 Kafka Broker Controller、副本机制

Broker Controllerbroker 之间也有一个控制器组件(Controller),它是 Kafka 的核心组件。它的主要作用是在 ZooKeeper 的帮助下管理和协调整个 Kafka 集群,集群中的每个 broker 都可以称为 controller,但是在 Kafka 集群启动后,只有一个 broker 会成为 Controller 。ZooKeeper 的数据是保存在节点上的,每个节点也被称为znode,znode 节点是一种树形的文件结构,它很像 Linux 操作系统的文件路径,Z

2021-04-12 17:27:19 9

原创 Kafka 顺序消费问题

自定义分区器定义分区器public class MyPartitioner implements Partitioner { private final AtomicInteger counter = new AtomicInteger(0); @Override public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster clus

2021-04-12 17:26:49 4

原创 Kafka Consumer 核心知识

Kafka Consumer应用程序使用 KafkaConsumer 从 Kafka 中订阅主题并接收来自这些主题的消息,然后再把他们保存起来。应用程序首先需要创建一个 KafkaConsumer 对象,订阅主题并开始接受消息,验证消息并保存结果。一段时间后,生产者往主题写入的速度超过了应用程序验证数据的速度,这时候该如何处理?如果只使用单个消费者的话,应用程序会跟不上消息生成的速度,就像多个生产者像相同的主题写入消息一样,这时候就需要多个消费者共同参与消费主题中的消息,对消息进行分流处理。Ka

2021-04-12 17:26:25 8

原创 Kafka Producer 核心知识

Kafka Producer消息的产生非常简单,但是消息的发送过程还是比较复杂的,如图我们从创建一个ProducerRecord 对象开始,ProducerRecord 是 Kafka 中的一个核心类,它代表了一组 Kafka 需要发送的 key/value 键值对,它由记录要发送到的主题名称(Topic Name),可选的分区号(Partition Number)以及可选的键值对构成。在发送 ProducerRecord 时,我们需要将键值对对象由序列化器转换为字节数组,这样它们才能够在网络上传输

2021-04-12 17:24:18 17

原创 Kafka 的 Java Api 与 SpringBoot Api

Java 操作 Kafka依赖<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>2.0.0</version> </dependency>Producer方式一:同步调用public class MyKafKaProd

2021-04-12 17:23:45 4

原创 Kafka 基础知识与重要配置

基础知识什么是 KafkaKafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区、多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统。Kafka 的基本术语消息:Kafka 中的数据单元被称为消息,也被称为记录,可以把它看作数据库表中某一行的记录。批次:为了提高效率, 消息会分批次写入 Kafka,批次就代指的是一组消息。主题:消息的种类称为 主题(Topic),可以说一个主题代表了一类消息。相当于是对消息进行分类。主题

2021-04-12 17:22:28 10

原创 Kafka 安装与基本操作

Kafka安装部署单机模式1、下载kafka。https://kafka.apache.org/downloads2、安装解压。已经编译好的,直接解压就行(tar -zxvf kafka_2.11-2.0.0.tgz )3、启动zookeeper。因为 kafka 的注册中心是 zk,所以需要先启动zookeeper节点kafka 内置了 zookeeper 的服务,所以在 bin 目录下提供了 zk 的启动和关闭脚本 zookeeper-server-start.sh 和 zoo

2021-04-11 19:28:34 13

原创 HBase 的 Java Api

整合依赖 <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.2.5</version> </dependency> <dependency>

2021-04-11 18:30:44 7

原创 HBase 安装与 Hbase Shell

Docker 安装 HBase搜索 HBase 镜像docker search hbase下载 HBase 镜像docker pull harisekhon/hbase创建容器docker create --name myhbase \-p 2181:2181 -p 16000:16000 -p 16010:16010 -p 16020:16020 -p 16030:16030 \harisekhon/hbase启动容器docker start myhbase登录 HBase

2021-04-11 18:30:25 5

原创 HBase 列族属性

一、创建表及属性查看创建一个测试表 test,列族为 cf:create 'test', {NAME => 'cf'}默认属性如下:hbase > describe 'test'{NAME => 'cf', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING =>

2021-04-11 18:30:11 5

原创 HBase 基础知识

HBase基础知识一、HBase简介HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协调工具。二、HBase三要素1、主键:Row Key (主键是用来检索记录的主键,访问hbase table中的行,只有三种方式

2021-04-11 18:29:51 19 1

原创 Docker 挂载 Nginx 配置注意事项

1.说说挂载挂载含义:启动时覆盖,运行时新增共享挂载作用:docker 一般是非持久化存储,重启关闭可能导致数据丢失挂载内容:日志(启动失败时可以查看)配置文件(先写好)运行数据2.Docker 挂载 Nginx 两点注意两点注意:1)我们不是直接挂载 nginx.conf 而是 conf.d 目录下的 server 配置注:先使用原文件,启动后再修改,易报错相应的配置文件如下(只包含 server 部分)server { listen 80;

2021-03-15 00:30:41 37

原创 Git 原理分析:存储对象、树对象、提交对象

在上一篇我们分析了如何在开发中使用 Git, 但是 Git 的底层原理到是什么呢?1.GIT 存储对象(HashMap)Git 是一个内容寻址文件系统,其核心部分是一个简单的键值对数据库(key-value data store),你可以向数据库中插入任意内容,它会返回一个用于取回该值的 hash 键。# 将 'Let us go' 存入键值库,然后返回相应对象的key值echo 'Let us go' | git hash-object -w --stdin4ab1f81f376332da3ca

2021-03-13 23:58:29 15

原创 Git 与 SVN 及核心命令总结(附SourceTree)

在上一篇 我们介绍了 Git 及它支持的通信协议,这篇我们就来看看如何使用Git。1.Git 核心命令git 客户端安装(无脑下一步就行):官方客户端: httpsd://git-scm.com/downloads其它客户端:https://tortoisegit.org/download/1.1 配置管理在刚装完git的需要配置 email 和 name,然后才能使用 Git,那怎么配置呢?#查看所有配置信息git config -l#查看系统级别配置(git安装目

2021-03-13 23:57:31 16

原创 Maven 执行原理:生命周期、插件(及自定义插件示例)

现在有甲乙丙三个人,他们合作去开发一个购物网站:甲:订单处理模块乙:商品管理模块丙:其他模块每个人单独在自己的系统中进行开发,这时候最终需要把单个分散的系统整合成一个完成的,怎么办?Copy到一个人的机器上,大家眼睛都盯着这个电脑,然后啪啦啪啦copy。如果说在整合的时候,你发现哪个哥们他写的模块有问题。数据库的整合,订单模块里面的内容需要调用到商品模块的内容。当你中招了之后,这是好事,犯了错,才能解决嘛。纵观整个软件开发历史,也有几十年的历史了吧,当你现在的遇到的一些问题,我们

2021-03-13 23:52:08 10

原创 Maven 配置与依赖冲突问题

maven的理想:像一种什么设计模式?—模板方法模式自动走完标准的构建流程:清理 --> 编译 --> 測试 --> 报告 --> 打包 --> 部署统一入口,所有配置在一个pom里搞定1.maven生命周期、阶段maven有三个完全独立的生命周期(LifeCycle):Clean,Build,Site。每个生命周期都由一系列阶段(Phase)组成,执行其中某个阶段时,必须将当前周期的所有阶段执行完。LifeCycle和Phase具体的对应关系如下图:各个生.

2021-03-13 23:48:30 16

原创 Swagger 配置信息详解(涉及源码分析)

先来说说 Swagger 有什么用,相较于使用 markdown 或者 word 写接口文档,Swagger 自动生成 API 文档,然后在 web 端暴露,并且 API 文档与 API 定义同步更新,这解决了前后端交互时接口更改但协商不及时的问题。另外,Swagger 还内置了在线测试功能,使得开发与接口测试一条龙,因此 Swagger 现在被很多公司使用。Swagger 需要引入两个依赖包:<dependency> <groupId>io.springfox</

2021-03-13 23:47:02 35

原创 Swagger 常用主题、注解及具体实例(超全)

在上一篇我们详细的介绍了使用 Swagger 时需要做的配置,现在已经能得到一个我们自己想要的页面了但是,这也看不明白啊。。。接口连个中文说明都没有。。。所以,Swagger 提供了很多注解,就是让我们去为每个类、每个接口/参数、每个Model 写解释说明的。1.用于类的注解@Api:资源描述标识这个类是 Swagger 的资源,@Api(tags = "商户相关接口")@RestController@RequestMapping("/merchants")public class Mer

2021-03-13 23:45:01 26

原创 【SpringBoot】内嵌 Web 服务器原理:源码流程

1.内嵌Tomcat–jar包启动原理内嵌 tomcat 的启动流程大致如下:org.springframework.boot.SpringApplication#refreshContextorg.springframework.context.support.AbstractApplicationContext#refreshorg.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#onRef

2021-03-01 21:42:40 44

原创 【SpringBoot】启动原理(三):run 方法解析

run(String… args)解析1.run函数/*** Run the Spring application, creating and refreshing a new ApplicationContext*/public ConfigurableApplicationContext run(String... args) { //计时器 StopWatch stopWatch = new StopWatch(); stopWatch.start(); Conf

2021-03-01 21:42:24 43 1

原创 【SpringBoot】启动原理(二):构造 SpringApplication

进入SpringApplicationpublic static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { return new SpringApplication(primarySources).run(args);}我们根据DemoApplication跟进代码,发现其调用的SpringApplication类的run方法。这个方法就干了2件事:一

2021-03-01 21:42:03 7

原创 【SpringBoot】启动原理(一):Jar 启动实现

概述Spring Boot 提供了 Maven 插件 spring-boot-maven-plugin,可以方便的将 Spring Boot 项目打成 jar 包或者 war 包。考虑到部署的便利性,我们绝大多数 99.99% 的场景下,我们会选择打成 jar 包。这样,我们就无需在部署项目的服务器上,配置相应的 Tomcat、Jetty 等 Servlet 容器。下面,我们来打开一个 Spring Boot jar 包,看看其里面的结构。如下图所示,一共分成四部分:Spring Boot ja

2021-03-01 21:41:46 44

原创 【SpringBoot】自动装配原理(三):ConfigurationClassBeanDefinitionReader 过滤条件注解

条件注解条件注解是Spring4提供的一种bean加载特性,主要用于控制配置类和bean初始化条件。在springBoot,springCloud一系列框架底层源码中,条件注解的使用到处可见。不少人在使用@ConditionalOnBean注解时会遇到不生效的情况,依赖的 bean 明明已经配置了,但就是不生效。到底@ConditionalOnBean和bean加载的顺序有没有关系呢?跟着源码,一探究竟。问题演示:@Configurationpublic class Configuration1

2021-03-01 21:41:32 15 2

原创 【SpringBoot】自动装配原理(二):AutoConfigurationImportSelector 的 selectImports

AutoConfigurationImportSelector该类实现ImportSelector接口,最重要的是实现selectImports方法,该方法的起到的作用是,根据配置文件(spring.factories),将需要注入到容器的bean注入到容器。selectImports public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata))

2021-03-01 21:41:10 108

原创 【SpringBoot】自动装配原理(一):AutoConfigrationImportSelector 回调流程

自动装配自动装配功能总体来说由 @EnableXXX注解 + @Import再配合@Conditional注解可以实现条件自动装配在SpringBoot中核心注解为@EnableAutoConfiguration@EnableAutoConfiguration通常情况下,springBoot应用启动类不会直接标注此注解,而是通过@SpringBootApplication注解来实现:发现 @SpringBootApplication中包含了 @SpringBootConfiguration

2021-03-01 21:40:51 37

原创 【SpringBoot】如何实现自定 starter

Starter是Spring Boot中的一个非常重要的概念,Starter 相当于模块,它能将模块所需的依赖整合起来并对模块内的Bean根据环境(条件)进行自动配置。使用者只需要依赖相应功能的Starter,无需做过多的配置和依赖,Spring Boot就能自动扫描并加载相应的模块。比如我们在Maven的依赖中加入spring-bootstarter-web 就能使项目支持 Spring MVC,并且 Spring Boot 还为我们做了很多默认配置,无需再依赖spring-web、 spring-we

2021-03-01 21:40:15 29

原创 Spring 注解驱动原理(四):使用 annotatedClass 构造之 ConfigurationClassPostProcessor

入参为 ConfigureClass 之 ConfigurationClassPostProcessor 处理postProcessBeanDefinitionRegistry() public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { int registryId = System.identityHashCode(registry); if (this.regis

2021-02-28 18:51:27 35 2

原创 Spring 注解驱动原理(三):使用 annotatedClass 构造之注册配置类

入参为 ConfigureClass当创建注解处理容器时,如果传入的初始参数是具体的注解Bean定义类时,注解容器读取并注册。AnnotationConfigApplicationContext 通过调用注解Bean定义读取器AnnotatedBeanDefinitionReader 的 register() 方法向容器注册指定的注解Bean,注解Bean定义读取器向容器注册注解Bean的源码如下:// 注册多个注解Bean定义类public void register(Class<?&gt

2021-02-28 00:55:13 66

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除