简介(容器编排工具)
Kubernetes 是Google创建管理的容器集群关系系统,开源,开源实现容器集群的自动化部署、自动扩缩容、维护等功能,其目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。
安装kubeadm
kubeadm是kubernetes的集群安装工具,能够快速安装kubernetes集群。
keep foolish, keep sharp
Kubernetes 是Google创建管理的容器集群关系系统,开源,开源实现容器集群的自动化部署、自动扩缩容、维护等功能,其目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。
kubeadm是kubernetes的集群安装工具,能够快速安装kubernetes集群。
堆分为最大堆和最小堆
定义:设数组a存放了n个数据元素,数组下标从0开始,如果当数组下标2i+1<n时存在a[i].key>a[2i+1].key>=a[i].key,当数组下标2i+2<n时,有a[i].key>=a[2i+2].key,这样的数据结构称为最大堆。
最大堆的根节点是堆值中最大的数据元素。
对于最大堆,从根结点到每个叶结点的路径,数组元素组成的序列都是递减有序的
通常把堆的根节点称为堆顶元素。
最小堆(与最大堆类似,这里不再累赘)
在完全二叉树中,第一个非叶子结点a[i] (i = (n - 2) / 2)
创建思路:从第一个非叶子结点开始,找出a[2i+1]和a[2i+2]的最大值,并与a[i]进行比对,若比a[i]小,则说明以a[i]为更结点的堆已经是最大堆,否则,二者交换。以此类推,直到调整到根节点。
值得注意的是:若左右子节点并非叶子结点,与a[i]的调换可能会引起子节点的一连串调整,这也是值得我们注意的地方
1 | /** |
1 | void heapSort(int[] data, int n) { |
Nginx是一款高性能Http服务器、反向代理服务器以及电子邮件(IMAP、POP3)代理服务器,能支撑5万并发,CPU、内存等资源消耗非常低,运行稳定。
1 | version: '3.1' |
虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就实现一台主机对外提供web服务。
通过Nginx可以实现虚拟主机的配置,Nginx支持三种类型的虚拟主机的配置
1 | # CPU多少核就填多少核,充分利用CPU资源 |
在客户端(浏览器)配置代理服务器,通过代理服务器访问指定网址
反向代理服务器架设在服务器端,通过缓存经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器和目标主机对外表现为一个服务器。
1 | version: '3.1' |
1 | worker_processes 1; |
通过location 指定不同的后缀名实现不同的请求转发,通过expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。
具体Expires 定义:给一个资源设定一个过期时间,无需服务器去验证,直接通过浏览器自身确定是否过期,不会产生额外的流量。这种方式适合不经常变动的资源。假如我设置了3d,即三天,表示在三天之内访问这个URL,发送一个请求给服务器,对比服务器该文件最后的更新时间,如果更新时间没有发生变化,则不会从服务器中抓取,返回状态码304,如果有修改,则直接从服务器中直接下载,返回状态200
1 | worker_processes 1; |
类似于交换机,提供消息路由策略。在RabbitMQ中,Producer不是通过信道直接将消息发送给Queue的,而是先发给ExChange,一个ExChange与多个Queue绑定,Producer在传递消息的时候,会传递一个ROUTING_KEY,ExChange会根据这个值按照特定的路由算法,将消息分配给指定的Queue,与Queue一样,ExChange也有持久、临时和自动删除的。
所谓绑定就是一个特定的Exchange与一个特定的Queue绑定起来。ExChange和Queue的绑定可以是多对多的关系。
1 | version: '3.1' |
1 | spring: |
1 |
|
1 | @Component |
添加依赖
1 | <dependency> |
创建一个Feign接口,并添加@FeignClient注解
1 | @FeignClient(name="applicationName") |
@FeignClient注解是任意一个服务提供方的名称,用以创建Ribbon负载均衡器。
修改接口1
@FeignClient(name="applicationName", configuration = FeignConfiguration.class)
有一点值得注意的是,本例中的FeignConfiguration类不能包括在主程序上下文的@ComponentScan中,否则该类中的配置信息就会被所有的@FeignClient共享, 如果只想定义某个FeignClient客户端的配置,该点需要特别注意。此处可以配置@ComponentScan不扫描配置类的所在包
Spring Cloud为Feign添加了Spring MVC的注解支持。
例子一
1 | @FeignClient(name="applicationName") |
例子二
1 | @FeignClient(name="applicationName") |
- 每个数据页都会为存储在本页里面的数据生成一个页目录,在通过主键查找某条记录时可以使用二分法快速定位
- 而根据其它列进行检索时,就只能通过遍历的手段
在没有任何索引的的表中,select语句的执行会进行如下两次遍历
如果两个操作之间访问同一个变量,且这两个操作有一个为写操作,此时这两个操作就存在数据依赖性。
编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。
这里所说的数据依赖性针对单个处理器中的指令序列和单个线程中执行的操作,不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑。
as-if-serial意思就是说:不管怎么重排序(编译器和处理器为了提高并行度),单线程程序的执行结果不能改变。
JMM在具体实现的基本方针是:在不改变正确同步的程序执行结果的前提下,尽可能地为编译器和处理器的优化打开方便之门。
JMM不保证对64位的long型和double型变量的写操作具有原子性。因为当JVM在一些32位的处理器上运行的时候,如果对64为数据的写操作要求原子性,会有比较大的开销,所以JVM可能会把一个64位的long/double写操作拆分成两个32位的写操作的来执行,这两个32位的写操作可能会被分配到不同的总线事务中,此时对这个64位的变量的写操作不具有原子性。
对于未同步或未正确同步的多线程程序,JMM只提供最小安全性: 线程执行时读取到的值, 要么是之前某个线程写入的值, 要么是默认值(0, NULL, false), JMM保证线程读操作读到的值不会无中生有.
为了实现最小安全性, JVM在堆上分配对象时,首先会对内存空间进行清零, 然后才会在上面分配对象(JVM会同步这两个操作), 因此, 在已清零的内存空间分配对象是,域的默认初始化已经完成了.
当线程获取锁的时候,JMM会把该线程对应的本地内存置为无效,从而是的被监视器保护的临界区代码必须从主内存中读取共享变量.
对锁释放和锁获取的内存含义做个总结:
在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。
JAVA的并发采用的是共享内存模型。
线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存存储了该内存以读写共享变量的副本。
A与B之间的通信,需要通过以下2个步骤
在执行程序时,为了提高性能,编译器和处理器通常会对指令做重排序,重排序分为三种:
对于指令重排,JAVA内存模型的处理器重排序规则可以要求JAVA编译器在生成指令序列时,插入特定类型的内存屏障指令,通过内存屏障指令来禁止特定类型的处理器重排序。
内存屏障:指的是重排序时不能把后面的指令重排序到内存屏障之前的位置。
在展示之前,首先补充一点知识:现代处理器使用写缓存区临时保存向内存下入的数据,以保证指令流水线持续运行,避免处理器停顿下来等待向内存写入数据而产生延迟,同时,以批处理的方式刷新缓存区,以及合并写缓存区对统一内存地址的多次写,减少堆内存总线的占用。
这个特性会对内存操作的顺序产生影响:处理器堆内存的读写操作的执行顺序,不一定与内存实际发生的读写操作顺序一致(因为内存操作重排)
如果AB同时执行,可能会得到读取到脏数据,原因如下:
此处由于指令重排,导致A1->A2的顺序变成了A2->A1,所以读取了脏数据。
一般情况下,处理器都不允许对存在数据依赖的操作做重排序。
在JMM中,如果一个操作的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系。
A happens-before B, JMM 并不要求A一定要在B之前执行, JMM仅仅要求前一个操作的结果对后一个操作课件,且前一个操作按顺序排在第二个操作之前.
首先,我们需要了解MySQL的一个简要的架构
值得注意的是,Mysql分为了Server层和存储引擎层:
这里,我们需要特别主义redo log 和 binlog这两个日志模块,前者是InnoDB自带的日志模块,后者是MySQL自带的日志模式。
SQL语句的类型主要分为两种
1 | update tb_student set name = 'wt' where name = 'name' |