- 博客(92)
- 收藏
- 关注
原创 聊一聊Docker所使用到的Linux底层技术(Namespace,Cgroup与存储驱动和容器引擎)
Namespace首先要理解docker本质上是一个运行在宿主机上的一个进程,用于帮助进程隔离出自己单独的空间.Linux Namespace可以隔离一系列的系统资源,如进程ID,网络资源,用户ID一样Linux现在实现了六种NamespaceUTS Namespace主要用来进行hostname的隔离IPC Namespace用来进行IPC和message queues...
2019-09-28 00:27:28 2662 1
原创 Effective Modern C++读书笔记 (二) 智能指针,move和 forward
auto 的理解变量使用auto进行声明的时候,auto扮演了模板的角色.变量的类型说明符(const , & )则是ParamTypeauto x = 27;const auto cx = x;const auto & rx = cx;//x,rx,cx类型的推导就相当于每个声明都用一个理想化的模板来推导template<typename T> //理想化的模板用来推导x的类型void func_for_x(T param);func_for
2020-10-08 16:10:36 798
原创 Effective Modern C++ 读书笔记(一) 类型推导
Deducing Types模板类型推导template<typename T>void f(ParamType param);编译期间,编译器使用expr进行两个类型推导,一个是针对T,另外一个是针对ParamType的。两个类型通常不同。因为ParamType通常包括对const和reference的修饰如:template<typename T>void f(const T& param);模板类型T的推导不仅仅取决于实参,也取决于ParamTyp
2020-08-29 19:47:24 300
原创 DDIA第三章读书笔记 数据存储与检索(olap相关摘取)
索引索引可以加快读取速度。那为啥不对所有数据建索引呢建索引会带来额外的空间开销写数据的时候,需要更新索引。任何类型的索引都会降低写速度哈希索引bitcask存储引擎内存中维护hashmap,kv分别对应key和其在数据文件的字节偏移量。所以在文件中追加新的kv对的时候,还需要更新hashmap来反映刚写入数据的偏移量。比较适合key数量较少(足够全部放在内存中),但是value数量频繁更新,数量庞大的情况。value数据量可以超过内存大小(靠一次磁盘io加载数据)如果都只追加到一个文件
2020-07-11 20:16:06 487 1
原创 JDK源码阅读计划(Day16) j.u.c之Semaphore
注释阅读Semaphore是计数信号量,允许N个线程同时访问资源。然而Semaphore并不会创建相应的许可证object,它内部仅仅是维护一个计数量。acquire操作会阻塞线程,除非拿到许可证才能继续进行。release操作会添加许可证,让线程去竞争这个许可证。Semaphore默认计数为1,相当于一个二元信号量,可以当作Lock来使用。可以实现为公平和非公平模式继承关系/* * 信号量,适合多个线程一起工作,即在某个时间段,可以有多个线程同时持有锁(线程数量受许可证总量限制) *
2020-05-13 21:42:16 241
原创 JDK源码阅读计划(Day15) j.u.c 之 LockSupport
基于JDK11LockSupport我们参考啃透JAVA并发先跑一个demopublic static void main(String[] args) { Thread t = new Thread(()->{ LockSupport.park(); System.out.println("Start working"); }); //t线程开始运行 t.start();
2020-05-12 11:13:57 189
原创 JDK源码阅读计划(Day14&15) AQS
JDK11AQS若被请求的共享资源空闲,则会把当前请求资源的线程设置为有效的工作线程,并且把共享资源设置为锁定状态。如果被请求的共享资源被占用,就把线程封装为Node加入到一个虚拟队列中,具体是通过CLH队列锁的方式实现。JDK并发包中的CountDownLatch,ReentrantLock,ThreadPoolExecutor,Semaphore,ReentrantReadWriteLock 都是继承自AbstractQueuedSynchronizer这个抽象类,其本质使用一个双向链表维护一个
2020-05-10 22:14:05 226
原创 JDK源码阅读计划(Day13) ConcurrentSkipListMap & 跳表学习
跳表上图可以看到,一个有序单链表,查找某元素的平均时间复杂度为O(n)跳表本质上是在有序链表上建立多层索引,以实现二分查找。以空间换时间的思想,实现增删查改平均时间复杂度为O(lgn)而skipList的结构可能有2种:第一种是每个结点会指向向右和向下的结点,像ConcurrentSkipListMap就是这么设计的 /** * Index nodes represent the levels of the skip list. */ // 跳表索引,存储右侧跟下侧
2020-05-09 20:09:38 214
原创 JDK源码阅读计划(Day12) BitSet
JDK11BitMap原理&使用场景用一个bit来存放一个状态的容器。由于对内存占用少,适合用于处理大规模数据和数据状态不多的情况。毕竟一个bit只对应两个状态。图来自ref假设原来有个int数组[1,2,3,6,7]需要用5*32bit=160bit来保存存储空间。但如果把元素的值作为下标每个下标用一个bit来表示,如0表示不存在该元素,1表示存在。那么只需要在内存空间开辟一...
2020-05-08 14:40:22 225
原创 JDK源码阅读计划(Day11) LinkedHashMap
继承图如下LHM与HashMap/* * LinkedHashMap是有序Map,也是HashMap的子类,其基础结构与HashMap一致 * 这里有序的含义是说其遍历顺序与元素加入的顺序有关 * 该Map中的元素按其加入的顺序,维护一个双向链表,为其额外建立了前后链接 * * 普通情况下,LinkedHashMap的遍历操作中,元素顺序就是其加入到Map时的顺序 * acces...
2020-05-06 21:07:06 185
原创 JDK源码阅读计划(Day10) ConcurrentHashMap 扩容,计数部分
扩容Hash表的扩容一般分为:哈希数组的扩容一般是建立一个原来数组大小两倍的数组,通常由单线程完成数据迁移把旧数组中的各个槽的结点重新分配到新的table中。通常涉及到Key值的rehash而HashMap与ConcurrentHashMap并不会重新计算每个key的hash值,而是数组扩容后,新的索引要么在原idx,要么在idx+n(n为扩容前数组容量)这种处理方式的好处:方便多...
2020-05-05 21:44:44 273
原创 (CMU15-721) An Empirical Evaluation of In-Memory MVCC 论文阅读笔记
不好意思大部分是英文,点进来的应该都是master PHD了吧?这部分是15721第三课的课堂笔记,发现就是相当于把这篇论文讲了一遍。如果只读论文的话还是挺难的。。Multi-version concurrency controlDefinitionDBMS maintains multiple physical versions of a single logical object in ...
2020-05-04 22:22:44 1680
原创 (CMU15-721) An Evaluation of Concurrency Control with One Thousand Cores 论文阅读笔记
摘要CPU核数的增多,给并发控制带来了巨大的压力。该论文实验环境为1024核,并且尝试了七种并发控制的方法,但都失败了。启示我们,面对多核芯片应该要重新设计数据库的架构导论现如今的CPU速度提升往往是靠增大核数,而不是提高单核的处理能力。那么对应的给数据库的并发控制带来了非常大的压力,性能的瓶颈在于多个线程之间的竞争与调度。本文的主要贡献:对于7种并发控制策略扩展性的讨论第一篇在...
2020-05-03 17:13:36 2438 2
原创 JDK源码阅读计划(Day9) ConcurrentHashMap 非扩容,计数部分
JDK11我们可以看到ConcurrentHashMap实现了ConcurrentMap,Serializable这两个接口并且继承了AbstractMap这个抽象类。实现与提供的操作和HashMap类似,都是哈希数组+链表/红黑树,但是key和value不能为null,并且是线程安全的,然而又不像HashTable用synchroinze锁表来保证线程安全,那样做的话效率太低了。重要成员...
2020-05-03 15:10:44 219
原创 JDK源码阅读计划(Day8) HashMap 红黑树部分
红黑树打开尘封已久的算法导论,好好翻开第13章…红黑树的性质是一种二叉搜索树,可以保证在最坏情况下基本动态集合操作的时间复杂度为O(lg n)每个节点增加一个用于表示颜色的存储位红黑树能确保没有一条路径会比其他路径长2倍每个节点属性: color,key,left,right,parent如果结点没有子节点或者父节点,指针可以设为NULL根节点和叶节点是黑色的对于每个节点,从该...
2020-05-01 21:52:11 217
原创 CMU15-721 《What’s really new with NewSQL》论文阅读笔记
Study Notes on Course1Video-bilibiliCourse TopicsFocus on internals of single nodes in-memory database system.Not distributed Systems.论文阅读笔记《What’s really new with NewSQL》NoSQL传统关系模型与强事务保证制约...
2020-05-01 00:15:44 926
原创 JDK源码阅读计划(Day7&8) HashMap 非红黑树部分
JDK11版本今天看到篇文章如何阅读JDK源码,受益良多今后读源码应该带着问题来读,而不是为了读而读!思考问题既要横向比较(HashMap,ConcurrentHashMap或者其他map之间的区别),也要纵向比较(不同JDK版本的HashMap有什么变化)先提出几个面试经常提到的问题,再带着问题来阅读:1.HashMap是线程安全的吗?如果不是,不安全体现在哪里?2.HashMap的...
2020-04-30 20:00:37 249
原创 JDK源码阅读计划(Day6) AbstractMap & AbstractSet
JDK11AbstractMappublic abstract class AbstractMap<K,V> implements Map<K,V> {Map的抽象类实现,那有哪些Map继承了这个抽象类呢?EnumMapHashMapIdentityHashMapLinkedHashMapWeakHashMapTreeMap未来一周的计划就是把这些...
2020-04-29 18:39:51 184
原创 JDK源码阅读计划(Day5) Collections
JDK11CollectionsCollection与Collectioons的区别我想很多面试题都会遇到最大的不同就是前者是这个接口,是List和Set这两个子接口的顶级接口。后者是个容器工具方法类。/* * Tuning parameters for algorithms - Many of the List algorithms have * two imple...
2020-04-28 15:05:34 214
原创 JDK源码阅读计划(Day4) Collection,List,AbstractCollection & AbstractList
JDK11Collection接口public interface Collection<E> extends Iterable<E> {作为一元容器的顶级接口,实现类包括线性表(List,Queue,Stack)和集合(Set)List能够包含重复的元素,Set包含的是不重复元素Bags和multisets可以直接实现该接口Set和List子接口继承了Co...
2020-04-27 15:42:57 195
原创 JDK源码阅读计划[Day3] AbstractStringBuilder,StringBuffer,StringBuilder
JDK11代码参考的是 https://github.com/kangjianwei/LearningJDK/blob/master/src/java/lang/String.javaAbstractStringBuilder这个类方法挺多的,1700多行,只挑一些重要而且陌生的记录下/** * A mutable sequence of characters. * <p>...
2020-04-26 15:11:28 185
原创 JDK源码阅读计划(Day2) String类
JDK11代码参考这位大佬的阅读笔记:https://github.com/kangjianwei/LearningJDK/blob/master/src/java/lang/String.java我们慢慢来String实现了三个接口实现 Serializable 接口,可序列化实现 Comparable 接口,可比较大小实现 CharSequence 接口,StringBuffer...
2020-04-24 19:16:41 183
原创 JDK源码阅读计划(Day1) Object类
JDK8源码阅读计划(一) Object类/** * Class {@code Object} is the root of the class hierarchy. * Every class has {@code Object} as a superclass. All objects, * including arrays, implement the methods of this...
2020-04-24 14:25:37 178
原创 ElasticSearch&Lucene学习总结
ES集群架构搜索领域:基于luceneJson文档数据库: 相对于MongoDB读写性能更佳时序数据分析:如日志处理,监控数据存储,分析和数据化基本概念:节点(Node): 一个ES实例索引(Index): 逻辑概念,配置信息mapping和倒排索引,正排索引文件。索引可以分布在一台或者多台机器分片(Shard): 为了支持更大量的数据,索引一般会按照某个维度分成多个部分。为了可靠性...
2020-03-07 21:23:42 1356
原创 一文总结Spark和Flink的内存模型&执行流程
首先,要做JVM内存模型调优之前先好好审视你的代码质量!算法不行就改算法!!不要什么都交给调优!!!Spark部分摘抄自 https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-apache-spark-memory-management/index.html概述首先要了解Spark的RDD,Shuffle,merge概念...
2020-03-01 11:38:55 1076
原创 流处理系统(Flink, Kafka和Pravega)学习笔记
本文记录一下我比较感兴趣的实时流处理方面的知识,从计算Flink,到存储Pravega,再到消息中间件Kafka,理论知识四大方面学习。如有错误请在评论区指正。实时更新~理论知识三种语义At most Once接收者最多收到一次消息At Least Once发送者给接收者发送消息,如果一直收不到接收者的确诊消息,发送者会一直重发。Exactly Once对于一条消息,接...
2020-02-28 13:35:56 2382
原创 对分布式系统课程电商秒杀项目的再思考
项目源码: https://github.com/AlexanderChiuluvB/DistrubutedSystemProject1.性能角度1.1 从分布式锁的性能角度思考初始版本的解决超卖关键是: Mysql基于版本号的乐观锁机制Redis预存放各种商品的库存,实际场景是不可能的,比较淘宝有千千万万种商品对吧。实际中最多存放热点商品的数据,一开始Redis都是空的,要自己去Mysq...
2020-02-22 23:23:00 808
原创 深入理解Java虚拟机第三版——虚拟机类加载与字节码执行机制
Chapter6 类文件结构无关性的基石Java"一次编写,到处运行"是怎么做到的呢?Java代码编译后的结果是从本地机器码转变为字节码。Java虚拟机不与某种特定语言绑定,而是和".class"文件绑定,Class文件中包含了Java虚拟机指令集,符号表等。因此,JVM不需要关心字节码的源语言。什么是.class是一组以8个字节为基础单位的二进制字节流。文件格式如下:magic[...
2020-02-01 15:43:16 621
原创 Kubernetes In Action 有状态应用编排——Statefulset
本文整理自 CNCF X 阿里巴巴云原生技术公开课回顾一下Deployment的功能支持定义一组pod的期望数量,Controller会为我们维持Pod的数量在期望的版本以及期望的数量。支持配置Pod的发布方式,配置完成后Controler会按照我们给出的策略来更新Pod。支持一键回滚Deployment 认为管理的所有相同版本的Pod都是一模一样的副本但以上应付的是无状态的应用,...
2020-01-16 15:42:12 202
原创 Kubernetes In Action 持久化存储 & Volume
BackgroundK8s的卷可以理解为是pod的一个组成部分,不是独立的的资源,pod的所有容器都可以使用卷,但是必须先挂载在每个需要访问它的容器中。换句话说,不同的container的某个路径只要挂载到同一个卷上,这几个container就可以实现对磁盘空间的共享可用的Volume的类型emptyDir用于存储临时数据的简单空目录,主要用于同一个Pod的运行容器之间共享文件,也可...
2020-01-12 12:54:30 257
原创 Kubernetes In Action 学习笔记 服务发现
为什么要有Service?Pod需要对来自集群内部其他Pod以及来自集群外部的客户端的HTTP请求做出响应service为一组功能相同的pod提供单一不变的接入点的资源,外界只需要通过IP与端口与service建立连接,这些链接会被路由到提供该服务的任意一个Pod上,通过这种方式,客户端不需要知道每个单独的Pod提供服务的Pod地址apiVersion: v1kind: Service...
2020-01-11 18:37:56 447
原创 Kubernetes In Action 学习笔记 Chapter3,4,5 (一)Pod,副本机制,守护进程与Job
PodbackgroundK8s的基本调度单位,一个Pod可以运行一个或者以上数量的容器.我们知道Docker的一个container实际上是一个进程,那么每一个container只能运行一个进程(除非产生子进程).由于不能把多个进程聚集在一个单独的容器中,因此我们需要一个更高级的结构来组织容器,把他们作为一个单独的单元进行管理.隔离程度一个Pod内的所有容器共享Linux Names...
2020-01-11 15:51:06 835
原创 Flink异步IO学习记录
国际惯例,先把官方文档介绍一波加入flink每次IO都要去访问数据库,那么数据库读取都是基于磁盘IO,速度肯定很慢,所以这里会成为流处理的一个性能瓶颈.那么异步IO就是把原来的同步请求异步化,总的耗时被多次IO分摊掉了.Asynchronous interaction with the database means that a single parallel function insta...
2020-01-11 11:16:39 462
原创 一次在K8s上运行Flink的实录
本文先介绍一下K8s的ConfigMap资源和Ingress的基本概念,然后讲一下如何在K8s上部署Flink,最后看一下Flink的Operator又是怎么编写的ConfigMap问题背景:生产环境可能需要多个Config文件,命令行参数和环境变量进行配置组合,因此容器部署的时候,应该把配置从应用程序的镜像中解耦出来,以保证镜像的可移植性.ConfigMap是用来存储通用的配置变量的,类...
2020-01-10 21:44:13 1981
原创 深入了解JAVA虚拟机——垃圾收集器与内存分配策略
首先java虚拟的堆存放着所有的对象实例,那么在进行垃圾回收的时候,如何确定有哪些对象还活着?哪些已经死去了?引用计数算法给对象添加一个引用计数器,每当有一个对象引用它的时候,计数器加一,失效的话计数器减一,任何时候计数器为0的对象都不能再被使用。但是难以解决对象间循环引用的问题。根搜索算法通过一系列名为"GC Roots"的对象作为起始点,从这些节点由上往下搜索,搜索所走过的路径称...
2019-12-01 11:56:59 131
原创 大规模分布式存储系统——存储系统基本知识
硬件基础CPU架构经典的多CPU架构为对称多处理结构(SMP),即在一个计算机上汇集了一组处理器,他们之间对称工作,共享相同的物理内存与总线SMP架构主要是共享,系统中所有资源都是共享的,那么会导致竞争的时候性能下降。为了提高可扩展性,现在主流服务器架构一般为NUMANUMA——Non-Uniform Memory Access 非一致性存储访问IO 总线存储系统的性能瓶颈一般...
2019-11-24 20:48:16 1455
原创 分布式文件与分布式存储系统学习总结(持续更新)
Linux文件系统inode文件存储在硬盘上,硬盘的最小存储单位叫做扇区,每个扇区会存储512byte操作系统在读取硬盘的时候,不会一个个扇区读取,而是会一次性连续读取多个扇区,多个扇区组成一个block。也就是说读取硬盘的时候是按照块来读的。块通常是8个sector组成一个block。文件数据都存储在block中,所以我们还必须要找到一个地方存储文件的metadata,如文件的创建日期...
2019-11-23 00:32:03 1567
原创 Chandy-Lamport分布式快照学习记录和Flink与实现分布式快照的机制
Snapshot Algorithm分布式快照算法是拿来干嘛的?在缺乏全局时钟或者全局时钟不可靠的分布式系统确定全局状态A snapshot algorithm is used to create a consistent snapshot of the global state of a distributed system. Due to the lack of globally sh...
2019-11-13 18:32:21 793
原创 ElasticSearch为啥那么快?总结一下
思考问题:为什么搜索是近实时的?为什么文档的CRUD是实时的?下图是云上一个集群集群中有多个节点索引可以跨节点组成在一个索引下,存储着分片,分片实际上是Lucene Index.Shard分片里面存储着segment,可以看成是Lucene内部的mini-index那么segment有啥呢?Inverted Index主要包括两部分:倒排索引1.一个有序的数...
2019-11-11 23:41:12 1940
原创 Pravega入门--分布式流批统一存储
Flink怎么实现流批统一?提供三层API可以用不同级别的抽象来开发流/批统一通过Table API和SQL来实现流批统一什么是Pravega?首先我们来探讨,为什么需要Pravega?用来实现流批统一的分布式流存储框架.Pravega设计宗旨是成为流的实时存储解决方案.应用程序把数据持久化存储到Pravega中,然后Pravega的Stream可以有无限制的数量并且持久化存储...
2019-11-07 22:26:49 1682
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人