JAVA是一个面向对象的编程语言,由SUN公司的程序员所开发、它不只吸取了C++的各类优势,并且还撇弃了C++中难以理解的概念,如多继承、指针等;所以JAVA语言具备功能强大且简单易用两个特征, JAVA做为静态面向对象语言的表明,是全世界最受欢迎的计算机语言php
Java包含四个独立却又彼此相关的技术css
1. JVM,Java的虚拟机,在JVM上运行Java的bytecode(字节码)html
2. Java的程序编程语言前端
3. Java Class,Java的类文件格式;其决定Java程序编译出的字节码应该遵循那些规范等html5
4. JAVA的应用程序接口(Java API);为了能让Java的应用程序获得更快更高效的开发,Java官方提供了Java APIjava
Java展现的文件一般都是Java类的文件格式,而Java的源程序要转换成字节码才能在JVM上运行node
通常Java的程序代码从写到运行要通过如下几个步骤:mysql
1. Java程序语言+Java APIreact
2. X.java源程序通过编译器编译为Java的类文件如X.class(Java的类文件就是Java的字节码)linux
3. 在JVM中,class loader(类加载器)加载X.class类文件,而后由解释器将X.calss文件由字节码格式解释成对应的OS平台二进制程序,这样Java程序就能够再JVM上运行了
注:.class文件就是字节码,但字节码不能直接运行,仍需在JVM中由解释器解释成对应的OS二进制程序,才能运行(机器只能理解二进制)
JVM进行解释的实现方式:
1. 一次性解释器,解释字节码并执行,但第二次执行须要从新解释字节码
2. 即时编译器,解释完的类(字节码)会缓存再内存中,让下次执行时直接使用,不用再次执行,但这样对全部解释产生的二进制程序都缓存会很是占用内存
3. 自适应解释器,只将执行频率高的代码进行解释而后将解释后的二进制程序进行缓存,下次执行无需解释,通常只缓存20%的代码解释(认为这20%的代码完成了80%的操做)
下面是JAVA的执行过程
JVM(Java Virtual Machine)即Java虚拟机,是一种用于计算设备的规范,也是Java的核心和基础,是Java解释器和OS平台之间的虚拟处理器,它是一种基于下层的操做系统和硬件平台利用软件方法抽象出的计算机。能够在 上面执行Java的字节码程序,正是由于JVM的存在Java才实现了一次编译处处运行,可实现彻底跨平台的运行。
Java的编译器只需面向JVM,生成JVM能理解的字节码文件,而后由JVM将每一条指令翻译成为不一样平台的机器代码(二进制程序),而后既能够在对应的平台执行。
Java平台由Java虚拟机(Java Virtual Machine,简称JVM)和Java 应用编程接口(Application Programming Interface,简称API)构成。Java应用编程接口为此提供了一个独立于操做系统的标准接口,可分为基本部分和扩展部分。在硬件或操做系统平台上安装一个Java平台以后,Java应用程序就可运行。Java平台已经嵌入了几乎全部的操做系统。这样Java程序能够只编译一次,就能够在各类系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。经常使用的Java平台基于Java1.5,最近版本为Java7.0。
JRE (Java running Environment)Java的运行环境:JRE可让编译好的类(字节码)运行起来,是让Java运行起来的最小环境。简单来讲JRE=JVM+API(不包括与开发有关的API)
JDK (Java Development Kit)是Java语言的软件开发工具包,是实现Java语言开发并让其运行的最小环境。简单来讲JDK=Java语言+API+编译器+JVM
依据Java应用领域的不一样,JDK有如下几种分类:
• Java SE(J2SE),standard edition,标准版,是咱们一般用的一个版本,从JDK 5.0开始,更名为Java SE。
• Java EE(J2EE),enterprise edition,企业版,使用这种JDK开发J2EE应用程序,从JDK 5.0开始,更名为Java EE。
• Java ME(J2ME),micro edition,主要用于移动设备、嵌入式设备上的java应用程序,从JDK 5.0开始,更名为Java ME。
没有JDK的话,没法编译Java程序,若是想只运行Java程序,要确保已安装相应的JRE。
下面来说Java两个特殊的类Applet和Servlet
Applet是采用Java编程语言编写的,通过编译后Applet小程序能够嵌入到HTML中去(含有Applet的网页的HTML文件代码中部带有<applet> 和</applet>这样一对标记),而后client端的浏览器中只要安装JRE插件就能够在client端运行这个Apple应用小程序,并将结果显示在client上,这即是客户端动态网站
可是客户端动态网站有一很危险的地方,那就是若是有人给你往HTML网页中嵌入的是一个有害的applet程序,你在client一执行会对你的电脑形成破坏,并且applet的执行必须在client端安装有JRE,因此applet如今已经不多见了
HTML文件中关于Applet的信息至少应包含如下三点:
1)字节码文件名(编译后的Java文件,以.class为后缀)
2)字节码文件的地址
3)在网页上显示Applet的方式。
Servlet(Server Applplet)是用Java编写的服务器端程序,其主要功能为交互式的浏览和修改数据,生成动态的Web资源;Servlet可让Java语言依据相似的CGI(common gateway interface)技术开发运行在服务器端的动态web资源,但在通讯量大的服务器上,Java Servlet 的优势在于它们的执行速度更快于 CGI 程序。各个用户请求被激活成单个程序中的一个线程,而无需建立单独的进程,这意味着服务器端处理请求的系统开销将明显下降。
Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:
1.客户端发送请求至服务器端;
2.服务器将请求信息发送至 Servlet;
3.Servlet 生成响应内容并将其传给服务器。响应内容动态生成,一般取决于客户端的请求;
4.服务器将响应返回给客户端。
JSP(Java Server Page)Java的服务器页面,它是Servlet的一个特殊的类,在根本上是一个简化的Servlet设计,JSP是在传统的网页HTML文件(*.html或*.htm)中插入Java的程序段,从而造成了JSP文件(一般为*.jsp);用JSP开发的web应用是支持跨平台的,既能在Linux上运行,也能在其余的操做系统上运行,开发JSP程序的一个著名框架是SSH(Structs、Spring、Hebernate)
JSP实现了Html语法中的java扩展(以 <%, %>形式)。JSP与Servlet同样,是在服务器端执行的。一般返回给客户端的就是一个HTML文本,所以客户端只要有浏览器就能浏览(Applet要在client上装JRE)。
注:Applet只是将一个编译后的Applet小程序嵌入到HTML中而后发送到client,在client端依据JRE运行。
Servlet主要是实现了用Java语言开发运行在server端的Web动态资源;而这些依据Java语言开发的web动态资源大多数都是.jsp资源。
JSP是一种脚本语言,主要实现了将JAVA代码嵌入到HTML中(这也是JSP和Servlet的最主要区别),从而生成了.jsp类的web动态资源,从而实现了基于Java技术的动态网站开发。
JSP的运行性能要比PHP好,因此一些大型站点都用JSP开发,.jsp程序执行流程以下
1. .jsp由Jasper处理未.java源程序
2. .java由编译器编译为.class
3. .class类在jvm上进行加载解释并运行
JSP 的运程过程
一个JSP页面有多个客户访问,下面是第一个客户访问JSP页面时候,JSP页面的执行流程:
客户经过浏览器向服务器端的JSP页面发送请求
• JSP引擎检查JSP文件对应的Servlet源代码是否存在,若不存在转向第4步,不然执行下一步
• JSP引擎检查JSP页面是否须要修改,若没修改,转向第5步,不然执行下一步
• JSP引擎将JSP页面文件转译为Servlet源代码(相应的 .java 代码)
• JSP引擎将Servlet源代码编译为相应字节码( .class代码 )
• JSP引擎加载字节码到内存
• 字节码处理客户请求,并将结果返回给客户
在不修改JSP页面的状况下,除了第一个客户访问JSP页面须要通过以上几个步骤外,之后访问该JSP页面的客户请求,直接发送给JSP对应的字节码程序处理,并将处理结果返回给客户,这种状况下,JSP页面既不须要启动服务器,以便从新加载修改后的JSP页面。
CGI(Common Gateway Interface)通用网关接口,CGI是外部应用程序(CGI程序)和Web服务器之间的接口标准(也能够理解为一种协议或机制),是在CGI程序和Web服务器之间传递信息的过程;CGI可让一个客户端,从网页浏览器向执行在网络服务器上的程序传输数据CGI描述了客户端和服务器之间传输的一种标准
下面列子能够理解CGI的做用
客户端请求服务器,web服务器响应一个HTML静态的表单,而用户填写完表单后又将此表单交给了web服务器(至关于又一次http请求),web服务器收到client端填写的表单后会以CGI协议的方式提交给后端的应用程序让其处理
不少应用程序均可以传递参数,CGI可让用户经过表单提供一些数据,而后把这些数据当作参数传递给相应的后端应用程序(如PHP)让程序对其加工处理(不事后端应用程序是PHP、C、C++甚至是一个脚本CGI均可以与其交互)让后端程序或脚原本处理数据,处理完后,后端程序再次经过CGI机制返回给前段的web服务器(httpd/Nginx)再由web服务器将结果封装响应给客户端
在LAMP和LNMP架构中PHP与前段Apache/Nginx之间就是经过CGI机制结合的,用于将客户端的动态请求(主要为php的动态资源请求)从前端web_server传递到后端的PHP,让PHP处理。
Servlet Container(Servlet容器):包含JDK及JDK所不具有的功能,可让一个Servlet运行起来,有相应的Servlet进程,Servlet进程负责接收前端CGI传递来的请求,并在本地的JVM上运行处理,而且负责监控本地的.java程序是否发生了修改,一旦发生修改则从新让编译器(由JDK提供)编译成.class类
Web Container (Web容器)是一个包含Jasper和Servlet相关的技术的框架,其中Jasper负责监控本地的.jsp程序是否发生修改,一旦修改就根据需求将其装换为.java源代码,而.java就交给Servlet处理
注:Web Container比Servlet Container多了一个Jasper
而如今不少的Web容器均可以直接和用户的请求直接进行交互(即前端没有web server解码http请求和封装http响应)web容器能够彻底依靠本身的组件(对Tomcat来讲为web container的链接器)实现直接与client进行交互。可是让链接器直接面对用户的请求,可能会形成压力过大处理不过来的状况(若是链接器的性能不是很好),因此通常会在前端加一个web代理(如Nginx),让Nginx创建、维持、释放用户的请求和链接,而当用户的请求资源在前端web server(Nginx)上没有缓存时,再由Nginx将请求转发到后端web Container(如Tomcat)处理。而对应的这种架构叫:
Nginx + Java的Web Container(有时也成为应用程序服务器)
但不管是Web Container仍是Servlet Container或者是JDK都是在JVM中运行的,Web Container|Servlet Container|JDK真正启动后再OS中表现的都是一个JVM进程(JVM实例),即在JVM中若是你是一个Web Containter它就有Web Container的功能,是JDK就有JDK的功能,负责只有JVM自身的功能
JVM实例能够在同一个JVM实例中启动多个线程,从而完成并发响应,JVM中还包括:
线程私有内存区
1. 程序计数器
2. Java虚拟机栈(主要用来保存本地变量)
线程共享内存区
1. 方法区
2. 堆(堆占用的内存最大)主要用来存储对象,当计数器为0时就认为对象已死,而后由GC(Garbage Collector)进行清除,避免堆溢出
而GC对对象的清理要依据必定的算法,有如下几种
1. 标记清除算法(哪一个对象死了先进行标记,而后统一清除),但这种机制有个弊端就是在GC进行垃圾清除时会让CPU飙升,形成服务器性能突然降低,且会产生大量的内存碎片
2. 复制算法,每一个对象存两份,不会产生内存碎片可是内存使用率只有1/2
GC的种类
1. serial 一次只能回收一个对象,串行
2. parNew 一次能够回收读个,并行回收
3. CMS(Concurrent Mark Sweet)并行标记清除,多线程,尽量下降清除对JVM中程序的停顿,但缺点是没法收集浮动垃圾(只要线程在运行,就不能收集)
4. G 1 特色是不会产生内存碎片、能够定义停顿的时间
数据库技术相关,这一部分主要讲解sql,毕竟现有的关系型数据库都支持sql,而且生产环境大部分仍是使用关系型数据库。再者总结下mysql与oracle的优缺点,使用场景,注意事项。
总结完这一部分,而后在概括写javaweb经常使用的技术,包括:
上述内容只是基础,并且仍是术的方面。我以为要写出优雅,健壮,可扩展的代码。除了基础扎实外,还须要了解,体会,感悟道的方面,好比说编程思想,规范,设计模式,软件工程等相关的内容。所以下一个部分就是:
1、基础篇
1.1 JVM
1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 1.1.2. 了解JVM各类参数及调优 1.1.3. 学习使用Java工具 jps, jstack, jmap, jconsole, jinfo, jhat, javap, … http://kenai.com/projects/btrace http://www.crashub.org/ https://github.com/taobao/TProfiler https://github.com/CSUG/HouseMD http://wiki.cyclopsgroup.org/jmxterm https://github.com/jlusdy/TBJMap 1.1.4. 学习Java诊断工具 http://www.eclipse.org/mat/ http://visualvm.java.net/oqlhelp.html 1.1.5. 本身编写各类outofmemory,stackoverflow程序 HeapOutOfMemory Young OutOfMemory MethodArea OutOfMemory ConstantPool OutOfMemory DirectMemory OutOfMemory Stack OutOfMemory Stack OverFlow 1.1.6. 使用工具尝试解决如下问题,并写下总结 当一个Java程序响应很慢时如何查找问题 当一个Java程序频繁FullGC时如何解决问题,如何查看垃圾回收日志 当一个Java应用发生OutOfMemory时该如何解决,年轻代、年老代、永久代解决办法不一样,致使缘由也不一样 1.1.7. 参考资料 http://docs.oracle.com/javase/specs/jvms/se7/html/ http://www.cs.umd.edu/~pugh/java/memoryModel/ http://gee.cs.oswego.edu/dl/jmm/cookbook.html
1.2. Java基础知识
1.2.1. 阅读源代码 java.lang.String java.lang.Integer java.lang.Long java.lang.Enum java.math.BigDecimal java.lang.ThreadLocal java.lang.ClassLoader & java.net.URLClassLoader java.util.ArrayList & java.util.LinkedList java.util.HashMap & java.util.LinkedHashMap & java.util.TreeMap java.util.HashSet & java.util.LinkedHashSet & java.util.TreeSet 1.2.2. 熟悉Java中各类变量类型 1.2.3. 熟悉Java String的使用,熟悉String的各类函数 1.2.4. 熟悉Java中各类关键字 1.2.5. 学会使用List,Map,Stack,Queue,Set 上述数据结构的遍历 上述数据结构的使用场景 Java实现对Array/List排序 java.uti.Arrays.sort() java.util.Collections.sort() Java实现对List去重 Java实现对List去重,而且须要保留数据原始的出现顺序 Java实现最近最少使用cache,用LinkedHashMap 1.2.6. Java IO&Java NIO,并学会使用 java.io.* java.nio.* nio和reactor设计模式 文件编码,字符集 1.2.7. Java反射与javassist 反射与工厂模式 java.lang.reflect.* 1.2.8. Java序列化 java.io. Serializable 什么是序列化,为何序列化 序列化与单例模式 google序列化protobuf 1.2.9. 虚引用,弱引用,软引用 java.lang.ref.* 实验这些引用的回收 1.2.10. 熟悉Java系统属性 java.util.Properties 1.2.11. 熟悉Annotation用法 java.lang.annotation.* 1.2.12. JMS javax.jms.* 1.2.13. JMX java.lang.management.* javax.management.* 1.2.14. 泛型和继承,泛型和擦除 1.2.15. 自动拆箱装箱与字节码 1.2.16. 实现Callback 1.2.17. java.lang.Void类使用 1.2.18. Java Agent,premain函数 java.lang.instrument 1.2.19. 单元测试 Junit, http://junit.org/ Jmockit, https://code.google.com/p/jmockit/ djUnit, http://works.dgic.co.jp/djunit/ 1.2.20. Java实现经过正则表达式提取一段文本中的电子邮件,并将@替换为#输出 java.lang.util.regex.* 1.2.21. 学习使用经常使用的Java工具库 commons.lang, commons.*… guava-libraries netty 1.2.22. 什么是API&SPI http://en.wikipedia.org/wiki/Application_programming_interface http://en.wikipedia.org/wiki/Service_provider_interface 1.2.23. 参考资料 JDK src.zip 源代码 http://openjdk.java.net/ http://commons.apache.org/ https://code.google.com/p/guava-libraries/ http://netty.io/ http://stackoverflow.com/questions/2954372/difference-between-spi-and-api http://stackoverflow.com/questions/11404230/how-to-implement-the-api-spi-pattern-in-java
1.3. Java并发编程
1.3.1. 阅读源代码,并学会使用 java.lang.Thread java.lang.Runnable java.util.concurrent.Callable java.util.concurrent.locks.ReentrantLock java.util.concurrent.locks.ReentrantReadWriteLock java.util.concurrent.atomic.Atomic* java.util.concurrent.Semaphore java.util.concurrent.CountDownLatch java.util.concurrent.CyclicBarrier java.util.concurrent.ConcurrentHashMap java.util.concurrent.Executors 1.3.2. 学习使用线程池,本身设计线程池须要注意什么 1.3.3. 锁 什么是锁,锁的种类有哪些,每种锁有什么特色,适用场景是什么 在并发编程中锁的意义是什么 1.3.4. synchronized的做用是什么,synchronized和lock 1.3.5. sleep和wait 1.3.6. wait和notify 1.3.7. 写一个死锁的程序 1.3.8. 什么是守护线程,守护线程和非守护线程的区别以及用法 1.3.9. volatile关键字的理解 C++ volatile关键字和Java volatile关键字 happens-before语义 编译器指令重排和CPU指令重排 http://en.wikipedia.org/wiki/Memory_ordering http://en.wikipedia.org/wiki/Volatile_variable http://preshing.com/20130702/the-happens-before-relation/ 1.3.10. 如下代码是否是线程安全?为何?若是为count加上volatile修饰是否可以作到线程安全?你以为该怎么作是线程安全的? public class Sample{ private static int count =0; public static void increment(){ count++; } } 1.3.11. 解释一下下面两段代码的差异 // 代码1 public class Sample { private static int count = 0; synchronized public static void increment() { count++; } } // 代码2 public class Sample { private static AtomicInteger count = new AtomicInteger(0); public static void increment() { count.getAndIncrement(); } } 1.3.12. 参考资料 http://book.douban.com/subject/10484692/ http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
2、 进阶篇
2.1. Java底层知识
2.1.1. 学习了解字节码、class文件格式 http://en.wikipedia.org/wiki/Java_class_file http://en.wikipedia.org/wiki/Java_bytecode http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/ http://asm.ow2.org/ 2.1.2. 写一个程序要求实现javap的功能(手工完成,不借助ASM等工具) 如Java源代码: public static void main(String[] args) { int i = 0; i += 1; i *= 1; System.out.println(i); } 编译后读取class文件输出如下代码: public static void main(java.lang.String[]); Code: Stack=2, Locals=2, Args_size=1 0: iconst_0 1: istore_1 2: iinc 1, 1 5: iload_1 6: iconst_1 7: imul 8: istore_1 9: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 12: iload_1 13: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 16: return LineNumberTable: line 4: 0 line 5: 2 line 6: 5 line 7: 9 line 8: 16 2.1.3. CPU缓存,L1,L2,L3和伪共享 http://duartes.org/gustavo/blog/post/intel-cpu-caches/ http://mechanical-sympathy.blogspot.com/2011/07/false-sharing.html 2.1.4. 什么是尾递归 2.1.5. 熟悉位运算 用位运算实现加、减、乘、除、取余 2.1.6. 参考资料 http://book.douban.com/subject/1138768/ http://book.douban.com/subject/6522893/ http://en.wikipedia.org/wiki/Java_class_file http://en.wikipedia.org/wiki/Java_bytecode http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings
2.2. 设计模式
2.2.1. 实现AOP CGLIB和InvocationHandler的区别,http://cglib.sourceforge.net/ 动态代理模式 Javassist实现AOP,http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/ ASM实现AOP,http://asm.ow2.org/ 2.2.2. 使用模板方法设计模式和策略设计模式实现IOC 2.2.3. 不用synchronized和lock,实现线程安全的单例模式 2.2.4. nio和reactor设计模式 2.2.5. 参考资料 http://asm.ow2.org/ http://cglib.sourceforge.net/
2.3. 网络编程知识
2.3.1. Java RMI,Socket,HttpClient 2.3.2. 用Java写一个简单的静态文件的HTTP服务器 实现客户端缓存功能,支持返回304 实现可并发下载一个文件 使用线程池处理客户端请求 使用nio处理客户端请求 支持简单的rewrite规则 上述功能在实现的时候须要知足“开闭原则” 2.3.3. 了解nginx和apache服务器的特性并搭建一个对应的服务器 http://nginx.org/ http://httpd.apache.org/ 2.3.4. 用Java实现FTP、SMTP协议 2.3.5. 什么是CDN?若是实现?DNS起到什么做用? 搭建一个DNS服务器 搭建一个 Squid 或 Apache Traffic Server 服务器 http://www.squid-cache.org/ http://trafficserver.apache.org/ http://en.wikipedia.org/wiki/Domain_Name_System 2.3.6. 参考资料 http://www.ietf.org/rfc/rfc2616.txt http://tools.ietf.org/rfc/rfc5321.txt http://en.wikipedia.org/wiki/Open/closed_principle
2.4. 框架知识
spring,spring mvc,阅读主要源码 ibatis,阅读主要源码 用spring和ibatis搭建java server
2.5. 应用服务器知识
熟悉使用jboss, https://www.jboss.org/overview/ 熟悉使用tomcat, http://tomcat.apache.org/ 熟悉使用jetty, http://www.eclipse.org/jetty/
3、 高级篇
3.1. 编译原理知识
3.1.1. 用Java实现如下表达式解析并返回结果(语法和Oracle中的select sysdate-1 from dual相似) sysdate sysdate -1 sysdate -1/24 sysdate -1/(12*2) 3.1.2. 实现对一个List经过DSL筛选 QList<Map<String, Object>> mapList = new QList<Map<String, Object>>; mapList.add({"name": "hatter test"}); mapList.add({"id": -1,"name": "hatter test"}); mapList.add({"id": 0, "name": "hatter test"}); mapList.add({"id": 1, "name": "test test"}); mapList.add({"id": 2, "name": "hatter test"}); mapList.add({"id": 3, "name": "test hatter"}); mapList.query("id is not null and id > 0 and name like '%hatter%'"); 要求返回列表中匹配的对象,即最后两个对象; 3.1.3. 用Java实现如下程序(语法和变量做用域处理都和JavaScript相似): 代码: var a = 1; var b = 2; var c = function() { var a = 3; println(a); println(b); }; c(); println(a); println(b); 输出: 3212 3.1.4. 参考资料 http://en.wikipedia.org/wiki/Abstract_syntax_tree https://javacc.java.net/ http://www.antlr.org/
3.2. 操做系统知识
Ubuntu Centos 使用linux,熟悉shell脚本
3.3. 数据存储知识
3.3.1. 关系型数据库 MySQL 如何看执行计划 如何搭建MySQL主备 binlog是什么 Derby,H2,PostgreSQL SQLite 3.3.2. NoSQL Cache Redis Memcached Leveldb Bigtable HBase Cassandra Mongodb 图数据库 neo4j 3.3.3. 参考资料 http://db-engines.com/en/ranking http://redis.io/ https://code.google.com/p/leveldb/ http://hbase.apache.org/ http://cassandra.apache.org/ http://www.mongodb.org/ http://www.neo4j.org/
3.4. 大数据知识
3.4.1. Zookeeper,在linux上部署zk 3.4.2. Solr,Lucene,ElasticSearch 在linux上部署solr,solrcloud,新增、删除、查询索引 3.4.3. Storm,流式计算,了解Spark,S4 在linux上部署storm,用zookeeper作协调,运行storm hello world,local和remote模式运行调试storm topology。 3.4.4. Hadoop,离线计算 Hdfs:部署NameNode,SecondaryNameNode,DataNode,上传文件、打开文件、更改文件、删除文件 MapReduce:部署JobTracker,TaskTracker,编写mr job Hive:部署hive,书写hive sql,获得结果 Presto:类hive,不过比hive快,很是值得学习 3.4.5. 分布式日志收集flume,kafka,logstash 3.4.6. 数据挖掘,mahout 3.4.7. 参考资料 http://zookeeper.apache.org/ https://lucene.apache.org/solr/ https://github.com/nathanmarz/storm/wiki http://hadoop.apache.org/ http://prestodb.io/ http://flume.apache.org/ http://logstash.net/ http://kafka.apache.org/ http://mahout.apache.org/
3.5. 网络安全知识
3.5.1. 什么是DES、AES 3.5.2. 什么是RSA、DSA 3.5.3. 什么是MD5,SHA1 3.5.4. 什么是SSL、TLS,为何HTTPS相对比较安全 3.5.5. 什么是中间人攻击、若是避免中间人攻击 3.5.6. 什么是DOS、DDOS、CC攻击 3.5.7. 什么是CSRF攻击 3.5.8. 什么是CSS攻击 3.5.9. 什么是SQL注入攻击 3.5.10. 什么是Hash碰撞拒绝服务攻击 3.5.11. 了解并学习下面几种加强安全的技术 http://www.openauthentication.org/ HOTP http://www.ietf.org/rfc/rfc4226.txt TOTP http://tools.ietf.org/rfc/rfc6238.txt OCRA http://tools.ietf.org/rfc/rfc6287.txt http://en.wikipedia.org/wiki/Salt_(cryptography) 3.5.12. 用openssl签一个证书部署到apache或nginx 3.5.13. 参考资料 http://en.wikipedia.org/wiki/Cryptographic_hash_function http://en.wikipedia.org/wiki/Block_cipher http://en.wikipedia.org/wiki/Public-key_cryptography http://en.wikipedia.org/wiki/Transport_Layer_Security http://www.openssl.org/ https://code.google.com/p/google-authenticator/
4、 扩展篇
4.1. 相关知识
4.1.1. 云计算,分布式,高可用,可扩展 4.1.2. 虚拟化 https://linuxcontainers.org/ http://www.linux-kvm.org/page/Main_Page http://www.xenproject.org/ https://www.docker.io/ 4.1.3. 监控 http://www.nagios.org/ http://ganglia.info/ 4.1.4. 负载均衡 http://www.linuxvirtualserver.org/ 4.1.5. 学习使用git https://github.com/ https://git.oschina.net/ 4.1.6. 学习使用maven http://maven.apache.org/ 4.1.7. 学习使用gradle http://www.gradle.org/ 4.1.8. 学习一个小语种语言 Groovy Scala LISP, Common LISP, Schema, Clojure R Julia Lua Ruby 4.1.9. 尝试了解编码的本质 了解如下概念 ASCII, ISO-8859-1 GB2312, GBK, GB18030 Unicode, UTF-8 不使用 String.getBytes() 等其余工具类/函数完成下面功能 public static void main(String[] args) throws IOException { String str = "Hello, 咱们是中国人。"; byte[] utf8Bytes = toUTF8Bytes(str); FileOutputStream fos = new FileOutputStream("f.txt"); fos.write(utf8Bytes); fos.close(); } public static byte[] toUTF8Bytes(String str) { return null; // TODO } 想一下上面的程序能不能写一个转GBK的? 写个程序自动判断一个文件是哪一种编码 4.1.10. 尝试了解时间的本质 时区 & 冬令时、夏令时 http://en.wikipedia.org/wiki/Time_zone ftp://ftp.iana.org/tz/data/asia http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9C%8B%E6%99%82%E5%8D%80 闰年, http://en.wikipedia.org/wiki/Leap_year 闰秒, ftp://ftp.iana.org/tz/data/leapseconds System.currentTimeMillis() 返回的时间是什么 4.1.11. 参考资料 http://git-scm.com/ http://en.wikipedia.org/wiki/UTF-8 http://www.iana.org/time-zones
4.2. 扩展学习
4.2.1. JavaScript知识 4.2.1.1. 什么是prototype 修改代码,使程序输出“1 3 5”: http://jsfiddle.net/Ts7Fk/ 4.2.1.2. 什么是闭包 看一下这段代码,并解释一下为何按Button1时没有alert出“This is button: 1”,如何修改: http://jsfiddle.net/FDPj3/1/ 4.2.1.3. 了解并学习一个JS框架 jQuery ExtJS ArgularJS 4.2.1.4. 写一个Greasemonkey插件 http://en.wikipedia.org/wiki/Greasemonkey 4.2.1.5. 学习node.js http://nodejs.org/ 4.2.2. 学习html5 ArgularJS, https://docs.angularjs.org/api 4.2.3. 参考资料 http://www.ecmascript.org/ http://jsfiddle.net/ http://jsbin.com/ http://runjs.cn/ http://userscripts.org/
5、 推荐书籍
JAVA程序员技术栈、业务栈、工具栈 目录: 一、技术栈 二、业务栈 三、工具栈 今天是实习期以来将近100天了,感谢公司给予的指望与同事们提供的帮助。很久没更新博客了,一是懒于写,二是文章写得不够深入、自身的知识体系还较零乱、理解不够全面和精湛,甚至存在误差和误导,距离小目标的实现之路还很远很远,现总结一下我自身这三个月来做为一名研发部->项目组->实习JAVA开发工程师用到的一些技术栈、业务栈及工具栈。 三个月来,共参与项目四个: 架构管控项目一个; 开发维护项目一个; 新开发项目一个; 维保项目一个; 针对本身参与的项目,下面列出三个月来我涉及的一些技术栈、业务栈及工具栈概述: 一、技术栈: Java: SSM(Spring + Spring MVC + Mybatis): Spring: Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架; Spring MVC: Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制; Mybatis: MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎全部的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录; Java基础 多线程、Future、Callable 内部类、闭包和回调 并发、Executor Apache Commons CLI 开发命令行工具 JVM: 类加载机制; 线程安全; 垃圾回收机制——新生代、老年代、永久代,可以对须要执行的程序配置相关参数; JAVA堆; HaaS:统一Hadoop资源池平台,基于Hadoop等大数据技术,提供统一数据存储、计算能力 HDFS(Hadoop Distributed File System):海量数据存储 存储并管理PB级数据; 处理非结构化数据; 注重数据处理的吞吐量; 应用模式Write_Once_Read_Many; YARN(Yet Another Resource Negotiator):统一资源调度和分配 ResourceManager:负责集群资源管理和调度; ApplicationMaster:替代JobTracker负责计算任务的管理和调度; Nodemanager:替代TaskTracker负责每一个节点上计算Task的管理和调度; MapReduce:非结构化、半结构化数据的海量批处理 Map:映射,用来把一组键值对映射成一组新的键值对; Reduce:归约,用来保证全部映射的键值对中的每个共享相同的键组,并进行聚合计算; 核心思想: 利用成百上千个CPU并行处理海量数据; 移动计算比移动数据更划算; Spark:分布式内存计算框架 Spark是一种与Hadoop类似的开源集群计算环境,Spark使用了内存内运算技术,能在数据还没有写入硬盘时即在内存内分析运算,而相对于传统的大数据解决方案Hadoop的MapReduce会在运行完工做后将中介数据存放在磁盘中,Spark在内存内运行程序的运算速度能作到比Hadoop MapReduce的运算速度快上100倍; Spark Streaming:实时/准实时流的计算框架 Spark Streaming将数据划分为一个一个的数据块(batch),每一个数据块经过微批处理的方式对数据进行处理,在Spark Streaming中,数据处理的单位是一批而不是单条,而数据采集确是逐条进行的,所以Spark Streaming系统须要设置间隔使得数据汇总到必定的量后再一并操做,这个间隔就是批处理间隔。批处理间隔是Spark Streaming的核心概念和关键参数,它决定了Spark Streaming提交做业的频率和数据处理的延迟,同时也影响着数据处理的吞吐量和性能; HBase:Key/Value、半结构化数据的海量存储和检索 分布式的、面向列的开源数据库; Hadoop HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和故障转移机制。这使得HBase能够用于支撑亿级的海量数据存储和应用; Hive:结构化数据的查询和分析 Hive是基于Hadoop的一个数据仓库工具,能够将结构化的数据文件映射成一张数据库表,并提供完整的SQL查询功能,能够将SQL语句转换为MapReduce任务运行; Hive擅长的是非实时的、离线的、对响应实时性要求不高的海量数据即席查询(SQL查询); Hive和传统关系型数据库有很大区别,Hive将外部的任务解析成一个MapReduce可执行计划,每次提交任务和执行任务都须要消耗不少时间(能够换用Tez计算框架来提高性能),这也就决定Hive只能处理一些高延迟的应用。 Zookeeper:分布式协同工具 Zookeeper是利用Paxos算法解决消息传递一致性的分布式服务框架; Zookeeper经过部署多台机器,可以实现分布式的负载均衡的访问服务。不一样的Client向Zookeeper中不一样机器请求数据; 为了实现集群中配置数据的增删改查保证一致性问题,须要有主节点,由主节点来作出修改的动做,并同步到其它节点上面; 当主节点出现故障时,将在其余节点中自动经过必定的选举方法选举出新的主节点; Oozie:任务调度工具 Oozie是Hadoop平台的一种工做流调度引擎,Oozie是一种Java Web应用程序,它运行在Java Servlet容器(Tomcat),并使用数据库来存储如下内容: 工做流定义; 当前运行的工做流实例,包括实例的状态和变量; Oozie工做流是放置在控制依赖DAG中的一组动做,其中指定了动做执行的顺序; Ambari:可视化集群管理工具 部署、启动、监控、查看、关闭Hadoop集群,可视化监控、运维、告警; Ambari主要由两部分组成: Ambari Server; Ambari Client; 用户经过Ambari Server通知Ambari Agent安装对应的软件,Ambari Agent会定时地发送各个机器每一个软件模块的状态给Ambari Server,最终这些状态信息会呈如今Ambari的GUI,方便用户了解到集群的各类状态,并进行相应的维护; Kafka:分布式消息总线 Kafka是一个低延迟高吞吐的分布式消息队列,适用于离线和在线消息消费,用于低延迟地收集和发送大量的事件和日志数据; 消息队列(Message Queue)用于将消息生产的前端和后端服务架构解耦,它是一种pub-sub结构,前端消息生产者不须要知道后端消息消费者的状况,只须要将消息发布到消息队列中,且只用发布一次,便可认为消息已经被可靠存储了,不用再维护消息的一致性和持久化,同时消息只传输一次就能够给后端多个消费者,避免了每一个消费者都直接去前端获取形成的前端服务器计算资源和带宽的浪费,甚至影响生产环境; 消息队列分为如下几种角色: Producer:生产者,即消息生产者,好比实时信令数据; Consumer: 消费者,即消息的消费者,好比后端的实时统计程序和批量挖掘程序; Consumer Group:消费者组,即消费者的并发单位,在数据量比较大的时候,须要分布式集群来处理消息,针对同一种消息,一组消费者各自消费某一Topic(话题,表明一些消息,Topic 是一个逻辑单位,一个 Topic 被划分红 N 个 Partition,在数据量大的时候经过 Partition 来实现分布式传输)的一部分,来协做处理; Broker:存储节点,Kafka支持将消息进行短暂的持久化,好比存储最近一周的数据,以便下游集群故障时,从新订阅以前丢失的数据。 在Kafka中,Producer自动经过Zookeeper获取到Broker列表,经过Partition算法自动负载均衡将消息发送到Broker集群。Broker 收到消息后自动分发到副本 Broker 上保证消息的可靠性。下游消费者经过 Zookeeper获取Broker集群位置和Topic等信息,自动完成订阅消费等动做。 Kerberos & Ranger:安全加固 Kerberos: 经过密钥系统为客户机/服务器应用程序提供强大的认证服务; Apache Ranger: 集中式安全管理框架,并解决受权和审计; 身份验证(Authentication):基于Kerberos的用户、服务身份验证; 统一帐户(Account):使用统一应用帐号访问平台众多服务; 访问受权(Authorization):基于Ranger的精细粒度访问权限; 操做审计(Audit):基于Ranger的集中式审计日志; DBaaS:开箱即用的关系型数据库服务 MySQL高可用: 主从复制: 一主一从 + Keepalived + VRRP((Virtual Router Redundancy Protocol,虚拟路由冗余协议): Keepalived: Keepalived是一个基于VRRP协议来实现的LVS服务高可用方案,能够利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),可是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。 VRRP: 解决静态路由单点故障问题,VRRP经过一竞选(election)协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。 采用一主一从构建高可用MySQL服务,当主机宕机时,能够自动触发主从节点切换。经过使用VIP + Keepalived组件,实现主从切换时MySQL服务IP自动漂移,主从库自动切换。 MHA(一主一从一只读) + Keepalived + VRRP: MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager能够单独部署在一台独立的机器上管理多个master-slave集群,也能够部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它能够自动将最新数据的slave提高为新的master,而后将全部其余的slave从新指向新的master。整个故障转移过程对应用程序彻底透明。 CssS:提供标准化的容器技术和容器管理方案,支撑无状态应用的标准化打包和部署 Docker:开源应用容器引擎 Docker是Docker公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目 基于 Go 语言开发,并听从 Apache 2.0 协议; 当前,Docker能够在容器内部快速自动化部署应用,并能够经过内核虚拟化技术 (namespaces及cgroups等) 来提供容器的资源隔离与安全保障等; Docker经过操做系统层的虚拟化实现隔离,因此Docker容器在运行时,不须要相似 虚拟机(VM)额外的操做系统开销,提升资源利用率,而且提高诸如I/O等方面的性能; Docker完全释放了虚拟化的潜力和威力,极大下降了云计算资源供应的成本,同时让业务应用的开发、测试、部署都变得史无前例敏捷、高效和轻松; Kubernetes:容器集群管理系统 Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能以下: 使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run); 以集群的方式运行、管理跨机器的容器; 解决Docker跨机器容器之间的通信问题; Kubernetes的自我修复机制使得容器集群老是运行在用户指望的状态; DevOps:开发运维一体化 第一阶段:核心实践和试点; 第二阶段:持续集成和测试; 第三阶段:持续部署和交付; 第四阶段:持续运维; 第五阶段:持续评估改进; 统一日志服务:提供多租户安全的系统、应用海量日志分析、交互式查询和可视化 核心能力: 规划构建的统一日志平台核心能力包括: 多租户安全:支持多租户端到端业务日志的存储、分析、可视化能力,支持多租户数据安全; 分析挖掘能力:经过Elasticsearch的结构化查询,实现复杂的多维度联合查询及数据聚合,深度挖掘日志数据; 可视化能力:支持图表可视化呈现分析结果,支持Dashboard实时监控关键指标; Filebeat: 轻量级的日志采集器,部署于应用侧,负责实时采集日志; Logstash: 负责日志解析和转发,灵活的正则配置可同时处理不一样数据结构的日志,并写入Elasticsearch不一样索引; Kafka: 分布式消息队列,在Filebeat和Logstash中引入分布式消息队列Kafka,能够从容的应对峰值数据的高负载,而且在Logstash出现故障时,具有良好的恢复能力,可直接从Kafka作数据回放,避免回溯至若干上游应用; Elasticsearch: 负责日志(原始数据、分析数据)的存储、索引和搜索,是实时分析数据流程的核心组件; Kibana: 前端可视化工具,Elasticsearch的皮肤,结合Elasticsearch丰富的查询逻辑,可定制多种图表; Linux命令行: FTP、不一样服务器之间、服务器与本地上传/下载、进程监控、内存监控、JVM监控、打包部署、Vim编辑、文件受权、审阅日志文件等等; Bash脚本开发: 可以阅读并编写简单的脚本; Python: 可以阅读通常的Python脚本,深刻后可学习爬虫; 机器学习算法: 逻辑回归算法; 基于特征的推荐算法; 分类算法; 聚类算法; 二、工具栈: 版本管理工具:Git,SVN; JAVA开发IDE:Intellij IDEA; 项目构建工具:Maven; 文本编辑器:Subline、NotePad等; 数据库管理工具:Navicat、SQLite Free等; 终端仿真程序:SecureCRT、Xshell5等; 三、业务栈: Tower化记录: 作好任务的Tower化记录,包括: 需求由来; 任务的具体描述; 解决问题的过程当中关键细节记录; 抄送给相关的项目负责人,并给出制定出解决问题的时间; 任务结论及相关解决方案文件的上传; CPS工做清单: 对于维护过程当中出现的每个相关问题,应养成记录的良好习惯,方便将来进行整理和排查。所以创建DMP项目维护工做清单,对于维护项的类别、详细描述、维护时间、维护耗时、处理结果、维护相关人员及对应的Tower任务连接进行记录; 现有任务梳理: 梳理遗留任务清单并标注优先级; 评估还须要多少人天能够完成问题及Bug; 评估将来的运维(不含新需求)每周须要投入的人力; 每周工做明细: bug修复:总数 + 清单明细(包括分工、人天耗时); 新功能增长:总数 + 清单明细; 功能优化:总数 + 清单明细; 下周工做计划: 遇到的问题: 解决方案: XXX 求助: XXX
1 java基础: 1.1 算法 1.1 排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序 1.2 二叉查找树、红黑树、B树、B+树、LSM树(分别有对应的应用,数据库、HBase) 1.3 BitSet解决数据重复和是否存在等问题 1.2 基本 2.1 字符串常量池的迁移 2.2 字符串KMP算法 2.3 equals和hashcode 2.4 泛型、异常、反射 2.5 string的hash算法 2.6 hash冲突的解决办法:拉链法 2.7 foreach循环的原理 2.8 static、final、transient等关键字的做用 2.9 volatile关键字的底层实现原理 2.10 Collections.sort方法使用的是哪一种排序方法 2.11 Future接口,常见的线程池中的FutureTask实现等 2.12 string的intern方法的内部细节,jdk1.6和jdk1.7的变化以及内部cpp代码StringTable的实现 1.3 设计模式 单例模式 工厂模式 装饰者模式 观察者设计模式 ThreadLocal设计模式 。。。 1.4 正则表达式 4.1 捕获组和非捕获组 4.2 贪婪,勉强,独占模式 1.5 java内存模型以及垃圾回收算法 5.1 类加载机制,也就是双亲委派模型 5.2 Java内存分配模型(默认HotSpot) 线程共享的:堆区、永久区 线程独享的:虚拟机栈、本地方法栈、程序计数器 5.3 内存分配机制:年轻代(Eden区、两个Survivor区)、年老代、永久代以及他们的分配过程 5.4 强引用、软引用、弱引用、虚引用与GC 5.5 happens-before规则 5.6 指令重排序、内存栅栏 5.7 Java 8的内存分代改进 5.8 垃圾回收算法: 标记-清除(不足之处:效率不高、内存碎片) 复制算法(解决了上述问题,可是内存只能使用一半,针对大部分对象存活时间短的场景,引出了一个默认的8:1:1的改进,缺点是仍然须要借助外界来解决可能承载不下的问题) 标记整理 5.8 经常使用垃圾收集器: 新生代:Serial收集器、ParNew收集器、Parallel Scavenge 收集器 老年代:Serial Old收集器、Parallel Old收集器、CMS(Concurrent Mark Sweep)收集器、 G1 收集器(跨新生代和老年代) 5.9 经常使用gc的参数:-Xmn、-Xms、-Xmx、-XX:MaxPermSize、-XX:SurvivorRatio、-XX:-PrintGCDetails 5.10 经常使用工具: jps、jstat、jmap、jstack、图形工具jConsole、Visual VM、MAT 1.6 锁以及并发容器的源码 6.1 synchronized和volatile理解 6.2 Unsafe类的原理,使用它来实现CAS。所以诞生了AtomicInteger系列等 6.3 CAS可能产生的ABA问题的解决,如加入修改次数、版本号 6.4 同步器AQS的实现原理 6.5 独占锁、共享锁;可重入的独占锁ReentrantLock、共享锁 实现原理 6.6 公平锁和非公平锁 6.7 读写锁 ReentrantReadWriteLock的实现原理 6.8 LockSupport工具 6.9 Condition接口及其实现原理 6.10 HashMap、HashSet、ArrayList、LinkedList、HashTable、ConcurrentHashMap、TreeMap的实现原理 6.11 HashMap的并发问题 6.12 ConcurrentLinkedQueue的实现原理 6.13 Fork/Join框架 6.14 CountDownLatch和CyclicBarrier 1.7 线程池源码 7.1 内部执行原理 7.2 各类线程池的区别 2 web方面: 2.1 SpringMVC的架构设计 1.1 servlet开发存在的问题:映射问题、参数获取问题、格式化转换问题、返回值处理问题、视图渲染问题 1.2 SpringMVC为解决上述问题开发的几大组件及接口:HandlerMapping、HandlerAdapter、HandlerMethodArgumentResolver、HttpMessageConverter、Converter、GenericConverter、HandlerMethodReturnValueHandler、ViewResolver、MultipartResolver 1.3 DispatcherServlet、容器、组件三者之间的关系 1.4 叙述SpringMVC对请求的总体处理流程 1.5 SpringBoot 2.2 SpringAOP源码 2.1 AOP的实现分类:编译期、字节码加载前、字节码加载后三种时机来实现AOP 2.2 深入理解其中的角色:AOP联盟、aspectj、jboss AOP、spring自身实现的AOP、Spring嵌入aspectj。特别是能用代码区分后二者 2.3 接口设计: AOP联盟定义的概念或接口:Pointcut(概念,没有定义对应的接口)、Joinpoint、Advice、MethodInterceptor、MethodInvocation SpringAOP针对上述Advice接口定义的接口及其实现类:BeforeAdvice、AfterAdvice、MethodBeforeAdvice、AfterReturningAdvice;针对aspectj对上述接口的实现AspectJMethodBeforeAdvice、AspectJAfterReturningAdvice、AspectJAfterThrowingAdvice、AspectJAfterAdvice。 SpringAOP定义的定义的AdvisorAdapter接口:将上述Advise转化为MethodInterceptor SpringAOP定义的Pointcut接口:含有两个属性ClassFilter(过滤类)、MethodMatcher(过滤方法) SpringAOP定义的ExpressionPointcut接口:实现中会引入aspectj的pointcut表达式 SpringAOP定义的PointcutAdvisor接口(将上述Advice接口和Pointcut接口结合起来) 2.4 SpringAOP的调用流程 2.5 SpringAOP本身的实现方式(表明人物ProxyFactoryBean)和借助aspectj实现方式区分 2.3 Spring事务体系源码以及分布式事务Jotm Atomikos源码实现 3.1 jdbc事务存在的问题 3.2 Hibernate对事务的改进 3.3 针对各类各样的事务,Spring如何定义事务体系的接口,以及如何融合jdbc事务和Hibernate事务的 3.4 三种事务模型包含的角色以及各自的职责 3.5 事务代码也业务代码分离的实现(AOP+ThreadLocal来实现) 3.6 Spring事务拦截器TransactionInterceptor全景 3.7 X/Open DTP模型,两阶段提交,JTA接口定义 3.8 Jotm、Atomikos的实现原理 3.9 事务的传播属性 3.10 PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED的实现原理以及区别 3.11 事物的挂起和恢复的原理 2.4 数据库隔离级别 4.1 Read uncommitted:读未提交 4.2 Read committed : 读已提交 4.3 Repeatable read:可重复读 4.4 Serializable :串行化 2.5 数据库 5.1 数据库性能的优化 5.2 深刻理解MySQL的Record Locks、Gap Locks、Next-Key Locks 例以下面的在什么状况下会出现死锁: start transaction; DELETE FROM t WHERE id =6; INSERT INTO t VALUES(6); commit; 5.3 insert into select语句的加锁状况 5.4 事务的ACID特性概念 5.5 innodb的MVCC理解 5.6 undo redo binlog 1 undo redo 均可以实现持久化,他们的流程是什么?为何选用redo来作持久化? 2 undo、redo结合起来实现原子性和持久化,为何undo log要先于redo log持久化? 3 undo为何要依赖redo? 4 日志内容能够是物理日志,也能够是逻辑日志?他们各自的优势和缺点是? 5 redo log最终采用的是物理日志加逻辑日志,物理到page,page内逻辑。还存在什么问题?怎么解决?Double Write 6 undo log为何不采用物理日志而采用逻辑日志? 7 为何要引入Checkpoint? 8 引入Checkpoint后为了保证一致性须要阻塞用户操做一段时间,怎么解决这个问题?(这个问题仍是颇有广泛性的,redis、ZooKeeper都有相似的状况以及不一样的应对策略)又有了同步Checkpoint和异步Checkpoint 9 开启binlog的状况下,事务内部2PC的通常过程(含有2次持久化,redo log和binlog的持久化) 10 解释上述过程,为何binlog的持久化要在redo log以后,在存储引擎commit以前? 11 为何要保持事务之间写入binlog和执行存储引擎commit操做的顺序性?(即先写入binlog日志的事务必定先commit) 12 为了保证上述顺序性,以前的办法是加锁prepare_commit_mutex,可是这极大的下降了事务的效率,怎么来实现binlog的group commit? 13 怎么将redo log的持久化也实现group commit?至此事务内部2PC的过程,2次持久化的操做均可以group commit了,极大提升了效率 2.6 ORM框架: mybatis、Hibernate 6.1 最原始的jdbc->Spring的JdbcTemplate->hibernate->JPA->SpringDataJPA的演进之路 2.7 SpringSecurity、shiro、SSO(单点登陆) 7.1 Session和Cookie的区别和联系以及Session的实现原理 7.2 SpringSecurity的认证过程以及与Session的关系 7.3 CAS实现SSO(详见Cas(01)——简介) 2.8 日志 8.1 jdk自带的logging、log4j、log4j二、logback 8.2 门面commons-logging、slf4j 8.3 上述6种混战时的日志转换 2.9 datasource 9.1 c3p0 9.2 druid 9.3 JdbcTemplate执行sql语句的过程当中对Connection的使用和管理 2.10 HTTPS的实现原理 3 分布式、java中间件、web服务器等方面: 3.1 ZooKeeper源码 1.1 客户端架构 1.2 服务器端单机版和集群版,对应的请求处理器 1.3 集群版session的创建和激活过程 1.4 Leader选举过程 1.5 事务日志和快照文件的详细解析 1.6 实现分布式锁、分布式ID分发器 1.7 实现Leader选举 1.8 ZAB协议实现一致性原理 3.2 序列化和反序列化框架 2.1 Avro研究 2.2 Thrift研究 2.3 Protobuf研究 2.4 Protostuff研究 2.5 Hessian 3.3 RPC框架dubbo源码 3.1 dubbo扩展机制的实现,对比SPI机制 3.2 服务的发布过程 3.3 服务的订阅过程 3.4 RPC通讯的设计 3.4 NIO模块以及对应的Netty和Mina、thrift源码 4.1 TCP握手和断开及有限状态机 4.2 backlog 4.3 BIO NIO 4.4 阻塞/非阻塞的区别、同步/异步的区别 4.5 阻塞IO、非阻塞IO、多路复用IO、异步IO 4.6 Reactor线程模型 4.7 jdk的poll、epoll与底层poll、epoll的对接实现 4.8 Netty本身的epoll实现 4.9 内核层poll、epoll的大体实现 4.10 epoll的边缘触发和水平触发 4.11 Netty的EventLoopGroup设计 4.12 Netty的ByteBuf设计 4.13 Netty的ChannelHandler 4.13 Netty的零拷贝 4.14 Netty的线程模型,特别是与业务线程以及资源释放方面的理解 3.5 消息队列kafka、RocketMQ、Notify、Hermes 5.1 kafka的文件存储设计 5.2 kafka的副本复制过程 5.3 kafka副本的leader选举过程 5.4 kafka的消息丢失问题 5.5 kafka的消息顺序性问题 5.6 kafka的isr设计和过半对比 5.7 kafka自己作的很轻量级来保持高效,不少高级特性没有:事务、优先级的消息、消息的过滤,更重要的是服务治理不健全,一旦出问题,不能直观反应出来,不太适合对数据要求十分严苛的企业级系统,而适合日志之类并发量大可是容许少许的丢失或重复等场景 5.8 Notify、RocketMQ的事务设计 5.9 基于文件的kafka、RocketMQ和基于数据库的Notify和Hermes 5.10 设计一个消息系统要考虑哪些方面 5.11 丢失消息、消息重复、高可用等话题 3.6 数据库的分库分表mycat 3.7 NoSql数据库mongodb 3.8 KV键值系统memcached redis 8.1 redis对客户端的维护和管理,读写缓冲区 8.2 redis事务的实现 8.3 Jedis客户端的实现 8.4 JedisPool以及ShardedJedisPool的实现 8.5 redis epoll实现,循环中的文件事件和时间事件 8.6 redis的RDB持久化,save和bgsave 8.7 redis AOF命令追加、文件写入、文件同步到磁盘 8.8 redis AOF重写,为了减小阻塞时间采起的措施 8.9 redis的LRU内存回收算法 8.10 redis的master slave复制 8.11 redis的sentinel高可用方案 8.12 redis的cluster分片方案 3.9 web服务器tomcat、ngnix的设计原理 9.1 tomcat的总体架构设计 9.2 tomcat对通讯的并发控制 9.3 http请求到达tomcat的整个处理流程 3.10 ELK日志实时处理查询系统 10.1 Elasticsearch、Logstash、Kibana 3.11 服务方面 11.1 SOA与微服务 11.2 服务的合并部署、多版本自动快速切换和回滚 详见基于Java容器的多应用部署技术实践 11.3 服务的治理:限流、降级 具体见 张开涛大神的架构系列 服务限流:令牌桶、漏桶 服务降级、服务的熔断、服务的隔离:netflix的hystrix组件 11.4 服务的线性扩展 无状态的服务如何作线性扩展: 如通常的web应用,直接使用硬件或者软件作负载均衡,简单的轮训机制 有状态服务如何作线性扩展: 如Redis的扩展:一致性hash,迁移工具 11.5 服务链路监控和报警:CAT、Dapper、Pinpoint 3.12 Spring Cloud 12.1 Spring Cloud Zookeeper:用于服务注册和发现 12.2 Spring Cloud Config:分布式配置 12.2 Spring Cloud Netflix Eureka:用于rest服务的注册和发现 12.3 Spring Cloud Netflix Hystrix:服务的隔离、熔断和降级 12.4 Spring Cloud Netflix Zuul:动态路由,API Gateway 3.13 分布式事务 13.1 JTA分布式事务接口定义,对此与Spring事务体系的整合 13.2 TCC分布式事务概念 13.3 TCC分布式事务实现框架案例1:tcc-transaction 13.3.1 TccCompensableAspect切面拦截建立ROOT事务 13.3.2 TccTransactionContextAspect切面使远程RPC调用资源加入到上述事务中,做为一个参与者 13.3.3 TccCompensableAspect切面根据远程RPC传递的TransactionContext的标记建立出分支事务 13.3.4 所有RPC调用完毕,ROOT事务开始提交或者回滚,执行全部参与者的提交或回滚 13.3.5 全部参与者的提交或者回滚,仍是经过远程RPC调用,provider端开始执行对应分支事务的confirm或者cancel方法 13.3.6 事务的存储,集群共享问题13.3.7 事务的恢复,避免集群重复恢复 13.4 TCC分布式事务实现框架案例2:ByteTCC 13.4.1 JTA事务管理实现,类比Jotm、Atomikos等JTA实现 13.4.2 事务的存储和恢复,集群是否共享问题调用方建立CompensableTransaction事务,并加入资源 13.4.3 CompensableMethodInterceptor拦截器向spring事务注入CompensableInvocation资源 13.4.4 Spring的分布式事务管理器建立做为协调者CompensableTransaction类型事务,和当前线程进行绑定,同时建立一个jta事务 13.4.5 在执行sql等操做的时候,所使用的jdbc等XAResource资源加入上述jta事务 13.4.6 dubbo RPC远程调用前,CompensableDubboServiceFilter建立出一个代理XAResource,加入上述 CompensableTransaction类型事务,并在RPC调用过程传递TransactionContext参与方建立分支的CompensableTransaction事务,并加入资源,而后提交jta事务 13.4.7 RPC远程调用来到provider端,CompensableDubboServiceFilter根据传递过来的TransactionContext建立出对应的CompensableTransaction类型事务 13.4.8 provider端,执行时碰见@Transactional和@Compensable,做为一个参与者开启try阶段的事务,即建立了一个jta事务 13.4.9 provider端try执行完毕开始准备try的提交,仅仅是提交上述jta事务,返回结果到RPC调用端调用方决定回滚仍是提交 13.4.10 所有执行完毕后开始事务的提交或者回滚,若是是提交则先对jta事务进行提交(包含jdbc等XAResource资源的提交),提交成功后再对CompensableTransaction类型事务进行提交,若是jta事务提交失败,则须要回滚CompensableTransaction类型事务。 13.4.11 CompensableTransaction类型事务的提交就是对CompensableInvocation资源和RPC资源的提交,分别调用每个CompensableInvocation资源的confirm,以及每个RPC资源的提交CompensableInvocation资源的提交 13.4.12 此时每个CompensableInvocation资源的confirm又会准备开启一个新的事务,当前线程的CompensableTransaction类型事务已存在,因此这里开启事务仅仅是建立了一个新的jta事务而已 13.4.13 针对此,每个CompensableInvocation资源的confirm开启的事务,又开始重复上述过程,对于jdbc等资源都加入新建立的jta事务中,而RPC资源和CompensableInvocation资源仍然加入到当前线程绑定的CompensableTransaction类型事务 13.4.14 当前CompensableInvocation资源的confirm开启的事务执行完毕后,开始执行commit,此时仍然是执行jta事务的提交,提交完毕,一个CompensableInvocation资源的confirm完成,继续执行下一个CompensableInvocation资源的confirm,即又要从新开启一个新的jta事务RPC资源的提交(参与方CompensableTransaction事务的提交) 13.4.15 当全部CompensableInvocation资源的confirm执行完毕,开始执行RPC资源的commit,会进行远程调用,执行远程provider分支事务的提交,远程调用过程会传递事务id 13.4.16 provider端,根据传递过来的事务id找到对应的CompensableTransaction事务,开始执行提交操做,提交操做完成后返回响应结束 13.4.17 协调者收到响应后继续执行下一个RPC资源的提交,当全部RPC资源也完成相应的提交,则协调者算是完全完成该事务 3.14 一致性算法 14.1 raft(详见Raft算法赏析) 14.1.1 leader选举过程,leader选举约束,要包含全部commited entries,实现上log比过半的log都最新便可 14.1.2 log复制过程,leader给全部的follower发送AppendEntries RPC请求,过半follower回复ok,则可提交该entry,而后向客户端响应OK 14.1.3 在上述leader收到过半复制以后,挂了,则后续leader不能直接对这些以前term的过半entry进行提交(这一部分有详细的案例来证实,并能说出根本缘由),目前作法是在当前term中建立空的entry,而后若是这些新建立的entry被大部分复制了,则此时就能够对以前term的过半entry进行提交了 14.1.4 leader一旦认为某个term能够提交了,则更新本身的commitIndex,同时应用entry到状态机中,而后在下一次与follower的heartbeat通讯中,将leader的commitIndex带给follower,让他们进行更新,同时应用entry到他们的状态机中 14.1.5 从上述流程能够看到,做为client来讲,可能会出现这样的状况:leader认为某次client的请求能够提交了(对应的entry已经被过半复制了),此时leader挂了,还没来得及给client回复,也就是说对client来讲,请求虽然失败了,可是请求对应的entry却被持久化保存了,可是有的时候倒是请求失败了(过半都没复制成功)没有持久化成功,也就是说请求失败了,服务器端可能成功了也可能失败了。因此这时候须要在client端下功夫,即cleint端重试的时候仍然使用以前的请求数据进行重试,而不是采用新的数据进行重试,服务器端也必需要实现幂等。 14.1.6 Cluster membership changes 14.2 ZooKeeper使用的ZAB协议(详见ZooKeeper的一致性算法赏析) 14.2.1 leader选举过程。要点:对于不一样状态下的server的投票的收集,投票是须要选举出一个包含全部日志的server来做为leader 14.2.2 leader和follower数据同步过程,全量同步、差别同步、日志之间的纠正和截断,来保证和leader之间的一致性。以及follower加入已经完成选举的系统,此时的同步的要点:阻塞leader处理写请求,完成日志之间的差别同步,还要处理现有进行中的请求的同步,完成同步后,解除阻塞。 14.2.3 广播阶段,即正常处理客户端的请求,过半响应便可回复客户端。 14.2.4 日志的恢复和持久化。持久化:每隔必定数量的事务日志持久化一次,leader选举前持久化一次。恢复:简单的认为已写入日志的的事务请求都算做已提交的请求(无论以前是否已过半复制),所有执行commit提交。具体的恢复是:先恢复快照日志,而后再应用相应的事务日志 14.3 paxos(详见paxos算法证实过程) 14.3.1 paxos的运做过程: Phase 1: (a) 一个proposer选择一个编号为n的议案,向全部的acceptor发送prepare请求 Phase 1: (b) 若是acceptor已经响应的prepare请求中议案编号都比n小,则它承诺再也不响应prepare请求或者accept请求中议案编号小于n的, 而且找出已经accept的最大议案的value返回给该proposer。若是已响应的编号比n大,则直接忽略该prepare请求。 Phase 2:(a) 若是proposer收到了过半的acceptors响应,那么将提出一个议案(n,v),v就是上述全部acceptor响应中最大accept议案的value,或者是proposer本身的value。而后将该议案发送给全部的acceptor。这个请求叫作accept请求,这一步才是所谓发送议案请求,而前面的prepare请求更多的是一个构建出最终议案(n,v)的过程。 Phase 2:(b) acceptor接收到编号为n的议案,若是acceptor尚未对大于n的议案的prepare请求响应过,则acceptor就accept该议案,不然拒绝 14.3.2 paxos的证实过程: 1 足够多的问题 2 acceptor的初始accept 3 P2-对结果要求 4 P2a-对acceptor的accept要求 5 P2b-对proposer提出议案的要求(结果上要求) 6 P2c-对proposer提出议案的要求(作法上要求) 7 引出prepare过程和P1a 8 8 优化prepare 14.3.3 base paxos和multi-paxos 4 大数据方向 4.1 Hadoop 1.1 UserGroupInformation源码解读:JAAS认证、user和group关系的维护 1.2 RPC通讯的实现 1.3 代理用户的过程 1.4 kerberos认证 4.2 MapReduce 2.1 MapReduce理论及其对应的接口定义 4.3 HDFS 3.1 MapFile、SequenceFile 3.2 ACL 4.4 YARN、Mesos 资源调度 4.5 oozie 5.1 oozie XCommand设计 5.2 DagEngine的实现原理 4.6 Hive 6.1 HiveServer二、metatore的thrift RPC通讯设计 6.2 Hive的优化过程 6.3 HiveServer2的认证和受权 6.4 metastore的认证和受权 6.5 HiveServer2向metatore的用户传递过程 4.7 Hbase 7.1 Hbase的总体架构图 7.2 Hbase的WAL和MVCC设计 7.3 client端的异步批量flush寻找RegionServer的过程 7.4 Zookeeper上HBase节点解释 7.5 Hbase中的mini、major合并 7.6 Region的高可用问题对比kafka分区的高可用实现 7.7 RegionServer RPC调用的隔离问题 7.8 数据从内存刷写到HDFS的粒度问题 7.9 rowKey的设计 7.10 MemStore与LSM《深刻Java虚拟机》 《深刻理解Java虚拟机》 《Effective Java》 《七周七语言》 《七周七数据》 《Hadoop技术内幕》 《Hbase In Action》 《Mahout In Action》 《这就是搜索引擎》 《Solr In Action》 《深刻分析Java Web技术内幕》 《大型网站技术架构》 《高性能MySQL》 《算法导论》 《计算机程序设计艺术》 《代码大全》 《JavaScript权威指南》
架构管控项目一个;开发维护项目一个;新开发项目一个;维保项目一个;
针对本身参与的项目,下面列出三个月来我涉及的一些技术栈、业务栈及工具栈概述:
一、技术栈:
Java:
SSM(Spring + Spring MVC + Mybatis):
Spring:
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架;
Spring MVC:
Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制;
Mybatis:
MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎全部的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录;
Java基础
多线程、Future、Callable
内部类、闭包和回调
并发、Executor
Apache Commons CLI 开发命令行工具
JVM:
类加载机制;
线程安全;
垃圾回收机制——新生代、老年代、永久代,可以对须要执行的程序配置相关参数;
JAVA堆;
HaaS:统一Hadoop资源池平台,基于Hadoop等大数据技术,提供统一数据存储、计算能力
HDFS(Hadoop Distributed File System):海量数据存储
存储并管理PB级数据;
处理非结构化数据;
注重数据处理的吞吐量;
应用模式Write_Once_Read_Many;
YARN(Yet Another Resource Negotiator):统一资源调度和分配
ResourceManager:负责集群资源管理和调度;
ApplicationMaster:替代JobTracker负责计算任务的管理和调度;
Nodemanager:替代TaskTracker负责每一个节点上计算Task的管理和调度;
MapReduce:非结构化、半结构化数据的海量批处理
Map:映射,用来把一组键值对映射成一组新的键值对;
Reduce:归约,用来保证全部映射的键值对中的每个共享相同的键组,并进行聚合计算;
核心思想:
利用成百上千个CPU并行处理海量数据;
移动计算比移动数据更划算;
Spark:分布式内存计算框架
Spark是一种与Hadoop类似的开源集群计算环境,Spark使用了内存内运算技术,能在数据还没有写入硬盘时即在内存内分析运算,而相对于传统的大数据解决方案Hadoop的MapReduce会在运行完工做后将中介数据存放在磁盘中,Spark在内存内运行程序的运算速度能作到比Hadoop MapReduce的运算速度快上100倍;
Spark Streaming:实时/准实时流的计算框架
Spark Streaming将数据划分为一个一个的数据块(batch),每一个数据块经过微批处理的方式对数据进行处理,在Spark Streaming中,数据处理的单位是一批而不是单条,而数据采集确是逐条进行的,所以Spark Streaming系统须要设置间隔使得数据汇总到必定的量后再一并操做,这个间隔就是批处理间隔。批处理间隔是Spark Streaming的核心概念和关键参数,它决定了Spark Streaming提交做业的频率和数据处理的延迟,同时也影响着数据处理的吞吐量和性能;
HBase:Key/Value、半结构化数据的海量存储和检索
分布式的、面向列的开源数据库;
Hadoop HDFS为HBase提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定服务和故障转移机制。这使得HBase能够用于支撑亿级的海量数据存储和应用;
Hive:结构化数据的查询和分析
Hive是基于Hadoop的一个数据仓库工具,能够将结构化的数据文件映射成一张数据库表,并提供完整的SQL查询功能,能够将SQL语句转换为MapReduce任务运行;
Hive擅长的是非实时的、离线的、对响应实时性要求不高的海量数据即席查询(SQL查询);
Hive和传统关系型数据库有很大区别,Hive将外部的任务解析成一个MapReduce可执行计划,每次提交任务和执行任务都须要消耗不少时间(能够换用Tez计算框架来提高性能),这也就决定Hive只能处理一些高延迟的应用。
Zookeeper:分布式协同工具
Zookeeper是利用Paxos算法解决消息传递一致性的分布式服务框架;
Zookeeper经过部署多台机器,可以实现分布式的负载均衡的访问服务。不一样的Client向Zookeeper中不一样机器请求数据;
为了实现集群中配置数据的增删改查保证一致性问题,须要有主节点,由主节点来作出修改的动做,并同步到其它节点上面;
当主节点出现故障时,将在其余节点中自动经过必定的选举方法选举出新的主节点;
Oozie:任务调度工具
Oozie是Hadoop平台的一种工做流调度引擎,Oozie是一种Java Web应用程序,它运行在Java Servlet容器(Tomcat),并使用数据库来存储如下内容:
工做流定义;
当前运行的工做流实例,包括实例的状态和变量;
Oozie工做流是放置在控制依赖DAG中的一组动做,其中指定了动做执行的顺序;
Ambari:可视化集群管理工具
部署、启动、监控、查看、关闭Hadoop集群,可视化监控、运维、告警;
Ambari主要由两部分组成:
Ambari Server;
Ambari Client;
用户经过Ambari Server通知Ambari Agent安装对应的软件,Ambari Agent会定时地发送各个机器每一个软件模块的状态给Ambari Server,最终这些状态信息会呈如今Ambari的GUI,方便用户了解到集群的各类状态,并进行相应的维护;
Kafka:分布式消息总线
Kafka是一个低延迟高吞吐的分布式消息队列,适用于离线和在线消息消费,用于低延迟地收集和发送大量的事件和日志数据;
消息队列(Message Queue)用于将消息生产的前端和后端服务架构解耦,它是一种pub-sub结构,前端消息生产者不须要知道后端消息消费者的状况,只须要将消息发布到消息队列中,且只用发布一次,便可认为消息已经被可靠存储了,不用再维护消息的一致性和持久化,同时消息只传输一次就能够给后端多个消费者,避免了每一个消费者都直接去前端获取形成的前端服务器计算资源和带宽的浪费,甚至影响生产环境;
消息队列分为如下几种角色:
Producer:生产者,即消息生产者,好比实时信令数据;
Consumer: 消费者,即消息的消费者,好比后端的实时统计程序和批量挖掘程序;
Consumer Group:消费者组,即消费者的并发单位,在数据量比较大的时候,须要分布式集群来处理消息,针对同一种消息,一组消费者各自消费某一Topic(话题,表明一些消息,Topic 是一个逻辑单位,一个 Topic 被划分红 N 个 Partition,在数据量大的时候经过 Partition 来实现分布式传输)的一部分,来协做处理;
Broker:存储节点,Kafka支持将消息进行短暂的持久化,好比存储最近一周的数据,以便下游集群故障时,从新订阅以前丢失的数据。
在Kafka中,Producer自动经过Zookeeper获取到Broker列表,经过Partition算法自动负载均衡将消息发送到Broker集群。Broker 收到消息后自动分发到副本 Broker 上保证消息的可靠性。下游消费者经过 Zookeeper获取Broker集群位置和Topic等信息,自动完成订阅消费等动做。
Kerberos & Ranger:安全加固
Kerberos:
经过密钥系统为客户机/服务器应用程序提供强大的认证服务;
Apache Ranger:
集中式安全管理框架,并解决受权和审计;
身份验证(Authentication):基于Kerberos的用户、服务身份验证;
统一帐户(Account):使用统一应用帐号访问平台众多服务;
访问受权(Authorization):基于Ranger的精细粒度访问权限;
操做审计(Audit):基于Ranger的集中式审计日志;
DBaaS:开箱即用的关系型数据库服务
MySQL高可用:
主从复制:
一主一从 + Keepalived + VRRP((Virtual Router Redundancy Protocol,虚拟路由冗余协议):
Keepalived:
Keepalived是一个基于VRRP协议来实现的LVS服务高可用方案,能够利用其来避免单点故障。一个LVS服务会有2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),可是对外表现为一个虚拟IP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
VRRP:
解决静态路由单点故障问题,VRRP经过一竞选(election)协议来动态的将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。
采用一主一从构建高可用MySQL服务,当主机宕机时,能够自动触发主从节点切换。经过使用VIP + Keepalived组件,实现主从切换时MySQL服务IP自动漂移,主从库自动切换。
MHA(一主一从一只读) + Keepalived + VRRP:
MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager能够单独部署在一台独立的机器上管理多个master-slave集群,也能够部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它能够自动将最新数据的slave提高为新的master,而后将全部其余的slave从新指向新的master。整个故障转移过程对应用程序彻底透明。
CssS:提供标准化的容器技术和容器管理方案,支撑无状态应用的标准化打包和部署
Docker:开源应用容器引擎
Docker是Docker公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目 基于 Go 语言开发,并听从 Apache 2.0 协议;
当前,Docker能够在容器内部快速自动化部署应用,并能够经过内核虚拟化技术 (namespaces及cgroups等) 来提供容器的资源隔离与安全保障等;
Docker经过操做系统层的虚拟化实现隔离,因此Docker容器在运行时,不须要相似 虚拟机(VM)额外的操做系统开销,提升资源利用率,而且提高诸如I/O等方面的性能;
Docker完全释放了虚拟化的潜力和威力,极大下降了云计算资源供应的成本,同时让业务应用的开发、测试、部署都变得史无前例敏捷、高效和轻松;
Kubernetes:容器集群管理系统
Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能以下:
使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run);
以集群的方式运行、管理跨机器的容器;
解决Docker跨机器容器之间的通信问题;
Kubernetes的自我修复机制使得容器集群老是运行在用户指望的状态;
DevOps:开发运维一体化
第一阶段:核心实践和试点;
第二阶段:持续集成和测试;
第三阶段:持续部署和交付;
第四阶段:持续运维;
第五阶段:持续评估改进;统一日志服务:提供多租户安全的系统、应用海量日志分析、交互式查询和可视化
核心能力:
规划构建的统一日志平台核心能力包括:
多租户安全:支持多租户端到端业务日志的存储、分析、可视化能力,支持多租户数据安全;
分析挖掘能力:经过Elasticsearch的结构化查询,实现复杂的多维度联合查询及数据聚合,深度挖掘日志数据;
可视化能力:支持图表可视化呈现分析结果,支持Dashboard实时监控关键指标;
Filebeat:
轻量级的日志采集器,部署于应用侧,负责实时采集日志;
Logstash:
负责日志解析和转发,灵活的正则配置可同时处理不一样数据结构的日志,并写入Elasticsearch不一样索引;
Kafka:
分布式消息队列,在Filebeat和Logstash中引入分布式消息队列Kafka,能够从容的应对峰值数据的高负载,而且在Logstash出现故障时,具有良好的恢复能力,可直接从Kafka作数据回放,避免回溯至若干上游应用;
Elasticsearch:
负责日志(原始数据、分析数据)的存储、索引和搜索,是实时分析数据流程的核心组件;
Kibana:
前端可视化工具,Elasticsearch的皮肤,结合Elasticsearch丰富的查询逻辑,可定制多种图表;
Linux命令行:
FTP、不一样服务器之间、服务器与本地上传/下载、进程监控、内存监控、JVM监控、打包部署、Vim编辑、文件受权、审阅日志文件等等;
Bash脚本开发:
可以阅读并编写简单的脚本;
Python:
可以阅读通常的Python脚本,深刻后可学习爬虫;
机器学习算法:
逻辑回归算法;
基于特征的推荐算法;
分类算法;
聚类算法;
二、工具栈:
版本管理工具:Git,SVN;
JAVA开发IDE:Intellij IDEA;
项目构建工具:Maven;
文本编辑器:Subline、NotePad等;
数据库管理工具:Navicat、SQLite Free等;
终端仿真程序:SecureCRT、Xshell5等;
三、业务栈:
Tower化记录:
作好任务的Tower化记录,包括:
需求由来;
任务的具体描述;
解决问题的过程当中关键细节记录;
抄送给相关的项目负责人,并给出制定出解决问题的时间;
任务结论及相关解决方案文件的上传;
CPS工做清单:
对于维护过程当中出现的每个相关问题,应养成记录的良好习惯,方便将来进行整理和排查。所以创建DMP项目维护工做清单,对于维护项的类别、详细描述、维护时间、维护耗时、处理结果、维护相关人员及对应的Tower任务连接进行记录;
现有任务梳理:
梳理遗留任务清单并标注优先级;
评估还须要多少人天能够完成问题及Bug;
评估将来的运维(不含新需求)每周须要投入的人力;