高并发 高性能 高可用 MySQL 实战
第1章 课程介绍
本章对课程内容、知识点、授课过程进行引导性说明。
1. 问卷调查
你真的搞懂MySQL底层原理了吗?
你知道如何改善慢查询性能吗?
你知道如何架设高性能集群吗?
你知道未来数据库的发展趋势吗?
这些问题很重要! 因为….
工作中:MySQL高性能集群越来越流行
面试中:深入考察MySQL原理、性能调优
职业规划:需要根据技术发展方向选择职业路径
2. 精通MySQL 应该怎么学?从理论到实战
从数据表逻辑结构,到优化数据表的性能
从数据查询原理,到改善慢SQL性能
从单点到集群
从学习单点原理,到掌握集群原理
从高性能单点,到高性能集群
从单点快速部署,到集群快速部署
从现在到未来
从5.x版本,到8.0版本
从原生单体数据库,到原生分布式数据库
从学习技术原理,到理解技术趋势
以上三点就是本课程的主线
以技术原理作为坚实基础
以真实场景作为学习环境
以架构思维作为学习目标
3. 什么是“三高”
高并发:同时处理的事务数高
高性能:事务/SQL的执行速度高
高可用:系统可用时间高
为什么不直接讲“三高”“三高”只是目的,并不是手段,手段有 ...
面试杂谈
MYSQL alter操作alter应该不会锁表吧 就会加一个MDL锁 innoDB支持在线DDL alter的时候不会阻塞对表的读写,然后百度 alert千万数据表的时候需要使用percona的 pt-online-schema-change ,他会建立一个与原来表结构相同的新表,然后把数据全部复制过去,最后替换表来完成大数据量表新增一个字段。
volatile这个是为了各个核心数据一致性的,有修改缓冲区和失效队列,但是修改缓冲区的内容什么时候刷新到主内存,核心什么时候操作失效队列,这个是核心自己来控制的在并发场景下,核心自己控制就会出问题所以需要屏障来告诉核心什么时候操作。java提供了关键字对底层原理封装,由开发人员来决定怎么做,volatile就是屏障,来告诉核心这个时候该刷新主内存,操作失效队列了
7.常见的MESI协议就是基于总线嘎探实现的。
8.MESI解决了缓存一致性问题,但是还是不能将CPU性能压榨到极致。
9.为了进一步压榨CPU,所以引入了 store buffer 和invalidate queue。
10.store buffer和invalidate q ...
MYSQL单路排序和双路排序
什么单路排序,什么是双路排序filesort 文件排序方式:
单路排序:是一次性取出满足行的全部字段,然后再内存中排序,然后返回结果。(占用内存更大,但是不需要回表)用trace工具可以看到sort_mode信息里显示< sort_key, additional_fields >或者<sort_key,packed_additional_fields >
双路排序:是先取出id、排序字段。在内存中排完序以后,再根据id去回表查出其他所需字段,然后返回结果。(占用内存更小,但需要回表)用trace工具可以看到sort_mode信息里显示<sort_key, rowid > MySQL 通过比较系统变量 max_length_for_sort_data(默认1024字节)的大小和需要查询的字段总大小来
判断使用哪种排序模式。如果 字段的总长度小于max_length_for_sort_data ,那么使用 单路排序模式;如果 字段的总长度大于max_length_for_sort_data ,那么使用 双路排序模∙式。
我们先看单路排序的详细过程 ...
MySQL两阶段提交.md
两阶段提交的过程是怎样的?
从图中可看出,事务的提交过程有两个阶段,就是将redoLog的写入拆成了两个步骤:prepare和commit,中
间再穿插写入binlog,具体如下:
1:prepare阶段:将XID(内部XA事务的ID)写入到redo log buffer,同时将redo log对应的事务状态设置为prepare,然后将redo log持久化到磁盘(innodb_flush_log_at_trx_commit=1的作用);
2:commit阶段:把XID写入到binlog cache,然后将binlog持久化到磁盘(sync_binlog=1的作用),接着调用引擎的提交事务接口,将redo log状态设置为commit,此时该状态并不需要持久化到磁盘,只需要write到文件系统的page cache中就够了,因为只要binlog写磁盘成功,就算redo log的状态还是prepare也没有关系,一样会被认为事务已经执行成功;
为什么需要两阶段提交?如果只写一次的话,那到底先写bin-log还是redo-log呢?
先写bin-log,再写redo-l ...
大厂学苑之JUC并发编程与源码分析(下)
11. Java对象内存布局和对象头11.1 先从阿里及其它大厂面试题说起
你觉得目前面试,你还有那些方面理解的比较好,我没问到的,我说了juc和 jym以及同步锁机制
那先说juc吧,说下aqs的大致流程
CAS自旋锁,是获取不到锁就一直自旋吗? cas和synchronized区别在哪里,为什么cas好,具体优势在哪里,我说cas避免cpu切换线程的开销,又问我在自旋的这个线程能保证一直占用cpu吗?假如cpu放弃了这个线程,不是还要带来线程再次抢占cpu的开销?
synchronized底层如何实现的,实现向步的时候用到cas了吗?具体哪里用到了
我说上个问题的时候说到了对象头,问我对象头存储哪些信息,长度是多少位存储
Object object = new Object()谈谈你对这句话的理解?一般而言JDK8按照默认情况下,new一个对象占多少内存空间
位置所在 JVM里堆→新生区→伊甸园区
构成布局 头体?想想我们的HTML报文
Object object = new Object() 谈谈你对这句话的理解?
一般而言JDK8按照默认情况下,ne ...
大厂学苑之JUC并发编程与源码分析(中)
8. CAS8.1 没有CAS之前
多线程环境不使用原子类保证线程安全(基本数据类型)
1234567891011121314151617181920212223 package com.atguigu.juc.prepare;import java.util.concurrent.atomic.AtomicInteger;/** * @auther zzyy * @create 2020-04-15 10:41 */public class T3{ volatile int number = 0; //读取 public int getNumber() { return number; } //写入加锁保证原子性 public synchronized void setNumber() { number++; }}
多线程环境 使用原子类保证线程安全(基本数据类型)
12345678910111213141516171819202 ...
大厂学苑之JUC并发编程与源码分析(上)
JUC并发编程与源码分析1. 本课程前置要求说明JUC四大口诀
高内聚低耦合前提下,封装思想,线程操作资源类
判断、干活、通知
防止虚假唤醒,wait方法要注意
注意标志位flag,可能是volatile的
JUC要求的知识内容
ReentrantLock
ReentrantReadWriteLock
Condition
工具类
CountDownLatch
CyclicBarrier
Semaphore
线程池与阻塞队列
ForkJoinPool与ForkJoinTask
Java8新特性函数式编程、方法引用、lambda Express
原子操作类Atomic
volatile
Callable和FutureTask
本课程的难度对标
阿里P6—P7
阿里P6、P7对高级Java开发工程师的要求明细
技术栈
阿里手册规范
大厂面试题
1、闲聊,自我介绍,负责业务,技术栈
【JUC】
2、synchronized作用、底层实现
3、说下什么是偏向锁,什么时候触发锁升级
4、jmm内存模型,说一下理解、这种内存模型会导致什么问题
5、把你 ...
MESI原理
由于 CPU 的运算速度远远的超过了内存的 IO 速度,因此在它和内存间又加了一层高速缓存,引入了缓存就必然带来一致性的问题。来看看这样的语句执行起来会是什么样的效果。 CPU b 先加载了 n=1,然后cpuA也加载了n,还进行了n+1的操作,这时候 CPU b 再去获取 n 的值。由于高速缓存中已经有值了,所以他拿到的还是n=1,产生了不一致的情况。 CPU 厂商为了解决这样的情况,引入了缓存一致性的协议。常见的比如说MESI,它有四个状态对应着修改、独占、共享、失效,而这四种状态又能量转换形成 16 种情况,这其实就是一个状态机。这个状态机看得我都头大,其实我们没有必要去了解得很透彻,继续用刚刚的例子走一遍流程,看看它是如何保证一致性的。
CPU b 先获取 n 的值,这时候它是独占状态,然后 CPU a 在获取 n 的时候,通过总线地址冲突检测到 b 有这个值,于是向 b 请求这个值,这时候 n 变成了共享状态。当 CPU a 要修改 n 的时候,会通过总线发出失效命令,让 b 的高速缓存对应的 n 的状态变为失效。收到 ACK 后让本地的 n 变为独占状态 ...
一些面试笔记
解释下Java线程池的各个参数的含义?在JDK当中,创建线程值的API为ThreadPoolExector类,这个类的构成方法当中就包含了创建线程值的几个核心参数。第一个corePoolSize用于设置线程池里面的核心线程数量maxPoolSize用于设置线程池里面允许的最大线程数量keepAliveTime用于设置当线程数量大于corePoolSize多出来空闲的线程将会在keepAliveTime之后就会被释放掉。unit用于设置keepAliveTime时间单位,比如秒钟、分钟等。workQueen用于设置等待队列,ThreadFactory用于设置每当创建新的线程放入线程值的时候,就会是就是通过这个线程工厂来创建的。handler用于设置就是说当线程等待队列都满了之后采取的策略,比如抛出异常等策略。那我们假设一组参数值来说明一下这些参数的含义。假设我们设置corePoolSize为1,maxPoolSize为3,keepAliveTime为60秒,workQueen为ArrayBrokingQueen有界阻塞队列大小为4,handler了默认的策略抛出一个所的threadRej ...
使用kubeadm快速部署一个K8s集群
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
这个工具能通过两条指令完成一个kubernetes集群的部署:
12345# 创建一个 Master 节点$ kubeadm init# 将一个 Node 节点加入到当前集群中$ kubeadm join <Master节点的IP和端口 >
1. 安装要求在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
一台或多台机器,操作系统 CentOS7.x-86_x64
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
禁止swap分区
2. 准备环境
角色
IP
master
192.168.1.11
node1
192.168.1.12
node2
192.168.1.13
使用kubeadm方式搭建K8s集群主要分为以下几步
准备三台虚拟机,同时安装操作系统CentOS 7.x
对三个安装之后的操作系统进行初始化操作
在三个节点安装 docker ku ...





