1、RPC:远程过程调用
2、OutputStream中直接写入一个int类型,会截取其低8位,丢弃其高24位
3、HTTP请求与响应过程:
1)浏览器根据所使用的http协议,解析出url对应的域名
2)通过DNS域名解析,查询出该域名对应的IP地址
3)通过url解析出对应的端口号
4)浏览器发起并建立到目的ip和端口的连接
5)浏览器向服务器发送请求
6)服务器响应浏览器的请求,浏览器读取响应,渲染网页
7)浏览器关闭与服务器的连接
4、
1)RPC风格:直接在HTTP请求的参数中标明需要远程调用的服务接口名称、服务需要的参数
2)RESTful风格:符合REST原则的设计
注:a、REST架构原则:表现层状态转换;b、HTTP协议是一种无状态协议。
5、服务配置中心:一个能够动态注册和获取服务信息的地方,来统一管理服务名称和其对应的服务器列表信息
6、常见的负载均衡算法包括:轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法等
1)轮询法:将请求按顺序轮流地分配到后端服务器上
注:a、服务消费者的实现端需要考虑服务器新增、下线、宕机的情况
b、轮询策略使用悲观锁synchronized,性能代价大,并发吞吐量下降
2)随机法:通过系统随机函数,根据后端服务器列表的大小值来随机选取其中一台进行访问
3)源地址哈希法:获取客户端访问的IP地址值,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是要访问的服务器的序号
4)加权轮询法:将请求顺序且按照权重分配到后端
5)加权随机法:按照权重来随机选取服务器
6)最小连接数法:根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前请求。
7、Groovy脚本语言能够直接编译成java的class字节码,运行在java虚拟机上,且能够很好的跟java进行交互
8、ZooKeeper:是Hadoop下的一个子项目,是一个针对大型分布式系统的可靠的协调系统,提供的功能包括配置维护、名字服务、分布式同步、组服务等,可以集群复制。通过Zab协议来保持数据的一致性。包括:leader election阶段和Atomic broadcas阶段。
1)leader election阶段:集群中将选举出一个leader,其他的机器则称为follower,所有的写操作都被传送给leader,并通过broadcas将所有的更新告诉follower。当leader崩溃或者leader失去大多数的follower时,需要重新选举出一个新的leader,让所有的服务器都恢复到一个正确的状态。
2)Atomic broadcas阶段:同步leader和follow之间的信息,保证leader和follower具有相同的系统状态。
注:ZooKeeper的核心其实类似一个精简的文件系统
9、ZooKeeper API:1)创建节点;2)删除节点;3)设置和获取节点内容;4)添加子节点;5)判断节点是否存在;6)watcher的实现
注:常见两种异常:a、ConnectionLossException:客户端与其中的一台服务器socket连接出现异常、连接丢失;b、SessionExpiredException:客户端的session已经超过sessionTimeout,未进行任何操作
10、第三方客户端工具包zkClient:将znode的事件重新定义为子节点的变化、数据的变化、连接及状态的变化三类。
GitHub源码:https://github.com/sgroschupf/zkclient.git
11、对于单点故障问题,采用双机高可用的部署方案,能部分解决问题,但负载均衡设备的昂贵成本,导致难以全面推广。
1、分布式系统的基础设施:1)分布式协作及配置管理系统;2)分布式缓存系统;3)持久化存储;4)分布式消息系统;5)搜索引擎;6)CDN系统;7)负载均衡系统;8)运维自动化系统;9)实时计算系统;10)离线计算系统;11)分布式文件系统;12)日志收集系统;13)监控系统;14)数据仓库
2、memcache是一款开源的高性能的分布式内存对象缓存系统,使用key-value形式存储和访问数据,在内存中维护一张巨大的HashTable,将高层抽象的对象转化成二进制数据存储。
1)其通过构建在TCP协议之上的memcache协议来进行通信
2)支持文本行和非结构化数据
注:非结构化数据采用字节流的形式在客户端和服务端之间进行传输和存储
3)API:a、set;b、add;c、replace;d、append;e、prepend;f、cas:提供对变量的原子操作;g、get;h、incr:对计数器进行增量操作;i:decr:对计数器进行减量操作;j:delete
4)memcache本身并不是一种分布式的缓存系统,它的分布式是由访问它的客户端来实现的。
5)consistent Hash:将Hash函数的值域空间组织成一个圆环,整个空间按照顺时针方向进行组织,然后对相应的服务器节点进行Hash,将它们映射到Hash环上,即将该key映射在该位置的下一个节点服务器。
注:节点的分布可能不均匀,为了避免这种情况,引入虚拟节点机制,对每一个服务器节点都计算多个Hash值,即多了一步从虚拟节点再映射到真实节点的过程。
3、解决分布式session的方法
1)通过将一部分数据存储在cookie中,来规避分布式环境下session的操作
2)将session统一存储在缓存集群上
4、IOE解决方案:IBM、oracle、EMC高端存储
5、一种分库分表的路由策略:
1)中间变量=user_id%(库数量*每个库的表数量)
2)库=取整(中间变量/每个库的表数量)
3)表=取余(中间变量%每个库的表数量)
注:要考虑分布式事务问题
6、HBase是ApacheHadoop项目下的一个子项目,设计实现了高可靠性、高可扩展性、实时读/写的列存储数据库。其本质上是一张稀疏的大表,用来存储粗粒度的结构化数据,并且能够通过简单的增加节点来实现系统的线性扩展。
1)HBase运行在分布式文件系统HDFS之上
2)HBase的数据以表的形式进行组织,每个表由行列组成;每个列属于一个特定的列族,通过行和列来确定一个存储单元,而每个存储单元又可以有多个版本,通过时间戳来标识。
3)HBase集群包含两种角色:HMaster和HRegionServer。一个HRegionServer可以管理多个Region,并由HMaster来负责HRegionServer的调度及集群状态的监管
注:当表随着记录条数的增加而不断变大后,将会分裂成一个个Region,每个Region可以由(startkey,endkey)来表示
4)HBase shell 命令:
a、status:查看HBase集群状态
b、create ‘表名’、’列族名称1’、’列族名称2’…:创建一个表,并制定列族的名称
c、list:列出已有的表,并查看表的描述
d、alter ‘表名’ ,NAME=>’列族名称’:给表新增一个列族
e、alert ‘表名’,NAME=>’列族名称’, METHOD=>’delete’:删除表的一个列族
f、disable ‘表名’ drop ’表名’ :删除一个表
注:在使用drop删除一个表之前,必须先将该表disable
g、put ‘表名’,‘rowkey’, ‘列族名称:列名称’, ‘值’:给表添加记录
h、get ‘表名称’,‘rowkey’:根据rowkey查看数据
i:get ‘表名称’, ‘rowkey’,‘列族名称:列名称’:根据rowkey查看对应列的数据
j:count ‘表名称’:查看表中的记录总数
k:scan ‘表名’ :查看表中所有记录
l:scan ‘表名’, {COLUMNS=> ‘列族’} :查看表中指定列族的所有记录
m:scan ‘表名’, {COLUMNS=> ‘列族’, LIMIT => 记录数, STARTROW => ‘开始rowkey’, STOPROW => ’结束rowkey’}
n:delete ‘表名’, ‘rowkey’,‘列族名称’:根据rowkey删除列数据
o:deleteall ‘表名’ ,‘rowkey’:根据rowkey删除一行数据
5)访问HBase三种方式:
a、通过指定rowkey进行访问
b、指定rowkey的range进行scan
c、全表扫描
注:HBase的行是按照rowkey来排序的
7、缓存操作,可通过批量操作,避免多次请求带来的网络开销,提高性能
1)lpush和rpush分别在list的首部和尾部添加元素
2)lpop和rpop分别在list的首部和尾部删除元素
3)lrange,获取list指定区间的元素
8、消息的异步接收降低了系统集成的耦合度,提升了分布式系统协作的效率,使得系统能够更快地响应用户,提供更高的吞吐。作为缓冲,削峰填谷,缓解集群的压力,避免整个系统被压垮。
9、JMS(Java MessageService)java消息服务:支持两种消息发送和接收模型
1)P2P:点对点,基于队列(queue)
2)Pub/Sub:发布/订阅模型,基于主题(topic)
注:订阅模式设置为持久订阅:断开à保存à连接à重发
10、消息集群Master-Slave模式:包括基于共享文件系统的Master-Slave架构和基于共享数据库的Master-Slave架构。
Master启动时,获得排他锁,其他Slave则stand-by,不对外提供服务,同时等待获取排他锁。Master连接中断或异常,排他锁会立即释放,另一个Slave能够争夺到Master的排他锁,成为Master对外提供服务。
注:1)真正提供服务的只有一台,其它节点只为保障高可用
2)对于ActiveMQ来说,可以采用broker拆分的方式,将不相关的queue和topic拆分到多个broker,来达到提升系统吞吐能力的目的
11、垂直化的搜索引擎主要针对企业内部的自有数据的检索;搜索引擎平台,采用网络爬虫对全网数据进行抓取,从而建立索引并提供给用户进行检索
12、Lucene相关概念
1)倒排索引:也称反向索引,将文档中的词作为关键字,建立词与文档的映射关系,通过倒排索引的检索,可以根据词快速获取包含这个词的文档列表
2)分词:又称切词,将句子或者段落进行切割,从中提取包含固定语义的词
3)停止词:需要被忽略掉
4)排序:需要将相关度更大的内容排在前面
5)文档:是一系列域的组合,相当于表
6)域:相当于列
7)词:搜索的基本单元
8)查询
9)分词器:提取关键的语义单元,常见有一元分词、二元分词、词库分词等
13、Lucene的使用:
1)对某个Field进行关键字查询
2)根据某个范围对Field的值进行区间查询
3)通过通配符来对Field进行查询
注:a、通配符:?表示0个或一个字母;*表示0个或多个字母
b、两个Field之间所允许的最大距离称为slop
4)结果排序:按照指定的Field
5)高亮:对匹配的内容进行突出展现
6)中文分词工具:Lucene自带的中日韩文分词器CJKAnalyzer,IK分词,MM分词,庖丁分词,imdict分词器
7)索引优化:Lucene的索引是由段组成的,每个段可能又包含多个索引文件,即每个段包含了一个或者多个Document。当索引段的数量达到设置上限时,Lucene会自动进行索引段的优化,将索引段合并成为一个,以提高查询的性能
14、Solr:是一个基于Lucene的搜索引擎工具,提供了一系列功能强大的HTTP操作接口,支持通过Data Schema来定义字段、类型和设置文本分析,使得用户可以通过HTTP POST请求,向服务器提交Document,生成索引,以及进行索引的更新和删除操作。对于复杂的查询条件,Solr提供了一整套表达式查询语言
1、常见的Web攻击手段:xss攻击、CRSF攻击、SQL注入攻击、文件上传攻击、DDoS攻击等。
2、XSS攻击:跨站脚本攻击
1)定义:指的是攻击者在网页中嵌入恶意脚本程序,当用户打开该网页时,脚本程序便开始在客户端的浏览器上执行,以盗取客户端cookie、用户名密码,下载执行病毒木马程序,甚至是获取客户端admin权限等。
2)原理:用户输入的数据变成了代码
3)措施:需要对用户输入的数据进行HTML转义处理,将其中的“尖括号”、“单引号”、“引号”之类的特殊字符串进行转义编码
3、CRSF攻击:跨站请求伪造
1)原理:用户访问A站点后未登出,访问攻击站点B,B站点要求使用用户在A的cookie访问A站点
2)措施:a、将cookie设置为HttpOnly,这样通过程序就无法读取到cookie信息,避免了攻击者伪造cookie的情况出现
b、增加token:在请求中放入攻击者所不能伪造的信息,并且该信息不存在于cookie之中
c、通过Referer识别:在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的源地址
4、SQL注入攻击:通过把SQL命令伪装成正常的HTTP请求参数,传递到服务端,欺骗服务器最终执行恶意的SQL命令,达到入侵目的。措施:
1)使用预编译语句:即变量使用占位符替代
2)使用ORM框架:对一些关键字符进行转义
3)避免密码明文存放:对存储的密码进行单向hash,如md5
注:a、哈希加盐法:在生成hash时给予一个扰动,使hash值与标准的hash结果不同,这样就可以对抗彩虹表了
b、拖库:从数据库中导出数据
4)处理好相应的异常
5、文件上传攻击:利用一些站点没有对文件的类型做很好的校验,上传了可执行的文件或者脚本,并且通过脚本获得服务器上相应的权利,或者是通过诱导外部用户访问下载上传的病毒或木马文件,达到攻击的目的
1)魔数:根据文件起始的几个字节内容可以确定文件类型
2)imagemagick:是一套功能强大、稳定并且开源的针对图片处理的开发工具包,能够处理多种格式的图片文件,可以利用imagemagick来对图片进行缩放处理
6、DDoS攻击:分布式拒绝服务攻击,是目前最为强大、最难以防御的攻击方式之一,一般采用一对一的方式。
1)原理:攻击者借助公共网络,将数量庞大的计算机设备联合起来作为攻击平台,对一个或多个目标发动攻击,从而达到瘫痪目标主机的目的。
注:通常在攻击开始前,攻击者会提前控制大量的用户计算机,称之为“肉鸡”,并通过指令使大量的肉鸡在同一时刻对某个主机进行访问,从而达到瘫痪目标主机的目的。
2)常见的攻击手段
a、SYN Flood:利用TCP协议三次握手的过程来达成攻击的目的。攻击者伪造大量的IP地址给服务器发送SYN报文,由于伪造的IP几乎不可能存在,也就不可能从客户端得到任何回应,服务端维护一个非常大的半连接等待列表,并且不断对这个列表中的IP地址进行遍历和重试,占用了大量的系统资源
b、DNS QueryFlood:UDP Flood攻击的一种变形,向被攻击的服务器发送海量的域名解析请求,并且通过伪造端口和客户端IP,防止查询请求被ACL(访问控制列表)过滤
c、CC攻击:基于应用层HTTP协议发起的DDos攻击,也被称为HTTPFlood。攻击者通过控制大量的“肉鸡”或者从互联网上搜寻的大量匿名的HTTP代理,模拟正常用户给网站发起请求直到该网站拒绝服务为止。
注:其他攻击手段还有:DNS域名劫持、CDN回源攻击、服务器权限提升等
7、常用的安全算法有:摘要算法、对称加密算法、非对称加密算法、信息编码等
8、数字摘要:也称消息摘要,是一个唯一对应一个消息或文本的固定长度的值,由一个单向Hash函数对消息进行计算而产生
1)消息摘要的特点:
a、无论输入的消息有多长,计算出来的消息摘要的长度总是固定的
b、输入不同,消息摘要一般也不同;输入相同,则输出必相同
c、单向性
2)常见算法:
a、MD5:信息摘要算法5,用于确保信息传输完整性和一致性,摘要长度为128位
b、SHA:安全散列算法:SHA-1是基于MD4算法的,公认的最安全的散列算法之一,摘要信息的长度为160位
c、十六进制编码
d、Base64编码:一种基于64个可打印字符来表示二进制数据的方法,每6位为一个单元。
注:Base64算法仅仅只是一种编码算法而已,不是加密算法。
e、彩虹表破解Hash算法:彩虹表就是一张采用各种Hash算法生成的明文和密文的对照表,在彩虹表中,表内的每一条记录都是一串明文对应一种Hash算法生成的一串密文。通过对彩虹表进行查找、比较、运算,能够迅速得出此加密字符串对应的明文。
9、对称加密算法
1)特点:算法公开、计算量小、加密速度快、加密效率高、秘钥私有、使用算法的逆算法
2)常见算法:
a、DES:明文按64位进行分组,秘钥长64位,事实上只有56位参与DES运算,8的倍数位是校验位,分组后的明文和56位的秘钥按位替代或交换的方法形成密文
b、3DES算法:使用3条64位的密钥对数据进行3次加密,是DES的一个更安全的变形
c、AES:高级加密标准,有三个秘钥长度(128、192、256位)
10、非对称加密算法:公开秘钥加密算法,公钥对数据进行加密,只有私钥才能进行解密;私钥对数据进行加密,只有公钥才能进行解密
1)过程:甲方生成一对秘钥并将其中的一把作为公钥向其他人公开,得到该公钥的乙方使用该秘钥对机密信息进行加密后再发送给甲方,甲方在使用自己保存的另一把专用秘钥(即私钥)对加密后的信息进行解密
2)RSA算法:基于“将两个大素数相乘十分容易,但反过来想要对其乘积进行因式分解却极其困难,因此可以将乘积作为公钥”。其keysize位数越高,其产生秘钥对及加密、解密的速度越慢
11、数字签名:
1)原理:a、数字签名的生成:通信正文à摘要算法à摘要à发送者私钥à数字签名
b、数字签名的校验:通信正文通过摘要算法获得摘要1,数字签名通过发送者公钥解密得到摘要2,若摘要1和摘要2相同则表示内容没有被篡改过
2)常见的数字签名算法
a、MD5withRSA:采用MD5算法生成需要发送正文的数字摘要,并使用RSA算法来对正文进行加密和解密
b、SHA1withRSA:采用SHA-1算法生成正文的数字摘要,并且使用RSA算法来对摘要进行加密和解密
12、数字证书:也称电子证书,用于标识网络中的用户身份
1)数字证书包含内容:a、对象的名称(人、服务器、组织);b、证书的过期时间;c、证书的颁发机构(谁为证书担保);d、证书颁发机构对证书信息的数字签名;e、签名算法;f、对象的公钥
2)X.509:大多数的数字证书都以一种标准的格式(X.509)来存储它们的信息
3)证书签发:由数字证书认证机构CA来进行颁发
4)证书校验:用签发该证书的证书来验证,形成一条证书链,终结于根证书。
注:下载安装根证书就表明对该根证书及其所签发的证书都表示信任
5)证书的使用:Java提供了完善证书管理工具keytool
注:使用OpenSSL生成的数字证书和私钥,如需在Java环境下使用,需要先将其转换成PKCS#12编码格式的秘钥库,才能够使用keytool工具进行相应的管理
13、摘要认证的实现:1)客户端参数摘要生成;2)服务端参数摘要校验;3)服务端响应摘要生成;4)客户端响应摘要校验
注:使用HTTPS有性能上的成本,而且需要额外申请CA证书
14、签名认证的实现:1)客户端参数签名生成;2)服务端参数签名校验;3)服务端响应签名生成;4)客户端响应签名校验
15、HTTPS协议:基于SSL的HTTP协议,它能够确保整个通信过程都是经过加密的,秘钥随机产生,并且能够通过数字证书验证通信双方的身份,以此来保障信息安全。
注:1)通信的内容使用对称加密方式进行加密
2)HTTPS协议在HTTP协议与TCP协议增加了一层安全层,所有请求和响应数据在经过网络传输之前,都会先进行加密,然后在进行传输
3)HTTPS既支持单向认证,也支持双向认证。单向认证只校验服务端证书的有效性,双向认证既校验服务端证书也校验客户端证书的有效性
16、SSL全称安全套接层,保障网络通信的安全,校验通信双方的身份,加密传输数据,与应用层协议独立无关。
1)SSL的继任者是TLS,全称传输层安全协议,同样位于应用层与传输层之间
2)SSL/TLS可分为两层,一层为RecordProtocol(记录协议),另一层为Handshake Protocol(握手协议)。记录协议建立在可靠的传输协议(如TCP)之上,提供数据封装、加密解密、数据压缩、数据校验等基本功能。握手协议建立在记录协议之上,在实际的数据传输开始前,进行加密算法的协商,通信秘钥的交换,通信双方身份的认证等工作
17、JSSE是Sun公司为了解决互联网信息安全传输提出的一个解决方案,它实现了SSL和TSL协议,包含了数据加密、服务器验证、消息完整性和客户端验证等技术
18、OAuth协议旨在为用户资源的授权访问提供一个安全、开放的标准。平台商通过OAuth协议,提示用户对第三方软件厂商(ISV)进行授权,使得第三方软件厂商能够使用平台商的部分数据,对用户提供服务
注:一次OAuth授权涵盖了三个角色:普通用户、第三方应用、平台商
1、日志分析常用命令
1)cat:查看文件的内容
2)more:分页显示文件
3)tail:显示文件尾
4)head:显示文件头
5)sort:内容排序,默认是按字符排列的,-n 指定按数字顺序排序,-r 指定逆序排列,-k 指定排序的列
6)wc:用来统计指定文件中的字符数、字数、行数,并输出统计结果
7)uniq:用来显示文件中行重复的次数,或者显示仅出现一次的行,以及仅仅显示重复出现的行,uniq的去重针对的知识连续的两行
8)grep:字符串查找
9)find:文件查找
注:whereis命令,能够方便地定位到文件系统中可执行文件的位置
10)expr:能够对运算表达式或者字符串进行运算求值
11)tar:生成归档文件或将归档文件展开
12)curl:在命令行下通过HTTP协议访问网页文档
2、sed编辑器:也称流编辑器,在编辑数据之前,预先指定数据的编辑规则,然后按照规则将数据输出到标准输出
3、awk程序:提供一种编程语言而不仅仅是一组文本编辑的命令,再编程语言的内部,可以定义保存数据的变量,使用算术和字符串操作函数对数据进行运算,支持结构化编程概念,能够使用if和循环语句等
awk [option] ‘pattern {action}’ file
其中:option为命令的选项,pattern为行匹配规则,action为执行的具体操作,file为输入的文件
注:如果没有pattern,则对所有执行action;如果没有action,则打印所有匹配的行
4、监控指标
1)load:特定时间间隔内运行队列中的平均线程数,可通过top和uptime来查看
注:每个CPU的核都维护了一个运行队列
2)CPU利用率:top |grep Cpu
用户时间us、系统时间sy(内核态所花费的时间)、Nice时间ni(调整进程优先级的时候所花费的时间)、空闲时间id、等待时间wa、硬件中断处理时间hi、软件中断处理时间si、丢失时间st(被强制等待虚拟CPU的时间)
3)磁盘剩余空间 df –h 或 df –l
4)网络traffic :sar –n DEV 11
5)磁盘I/O:iostat –d –k
6)内存使用:free –m 注:Linux的内存包括物理内存Mem和虚拟内存swap
7)qps:每秒查询数
8)rt:请求的响应时间
9)select/ps:每秒处理的select语句的数量
10)update/ps、delete/ps
11)GC
5、心跳检测
1)ping
2)应用层检测
3)业务检测:a、通过页面的大小来判断页面是否出现了异常;b、检测页面的返回值;c、可在response的header中约定一个值,来标识返回的结果是否正常
6、流量控制,对于超载的流量:1)将这部分流量丢弃;2)通过单击内存队列来进行有限的等待;3)通过分布式消息队列来将用户的请求异步化
7、服务稳定性:
1)依赖管理
2)优雅降级:暂时不可用,后期恢复
3)服务分级:非常时期,只为优先级高的消费者提供服务
4)开关
5)应急预案
8、高并发系统设计
1)操作原子性
2)多线程同步:指的是线程之间执行的顺序,多个线程并发地访问和操作同一数据,并且执行的结果与访问或者操作的次序有关
注:公平锁指的是多个线程在等待同一个锁时,必须按照申请锁的先后顺序来依次获得锁
3)数据一致性
a、强一致性:无论数据的更新操作是在哪个副本上执行,之后所有的读操作都要能够获取到更新的最新数据
b、弱一致性:系统的某个数据被更新后,后续对该数据的读取操作取到的可能是更新前的值,也可能是更新后的值
c、最终一致性:是若一致性的一种特殊形式,用户最终能够读取到某个操作对系统的更新
注:分布式系统中采用最终一致性的例子很多
4)系统可扩展性,也称可伸缩性
注:CAP理论指出:系统的一致性、可用性和可扩展性这三个要素对于分布式系统来说,很难同时满足
5)并发减库存
9、如何寻找性能瓶颈:前端优化工具——YSlow、页面响应时间、方法响应时间、GC日志分析、数据库查询(慢查询日志)、系统资源使用
10、性能测试:通过一些自动化的测试工具模拟多种正常、峰值,以及异常负载的条件来对系统的各项性能指标进行测试
1)ab全称ApacheBench
2)Apache JMeter:纯java实现,支持多种协议(HTTP、SOAP、FTP、TCP、SMTP、POP3等)
3)HP LoadRunner:商业付费性能测试工具,几乎是应用性能测试领域的行业标准
4)反向代理引流
5)TCPCopy:请求复制工具
11、性能优化措施:
1)前端性能优化:a、页面的HTTP请求数量;b、是否使用CDN网络;c、是否使用压缩
2)Java程序优化
a、单例
b、Future模式:异步处理,主线程使用处理结果时若未完成则阻塞
c、线程池:避免因过多线程导致的内存溢出,减少了线程创建和销毁本身的消耗
d、选择就绪:使用NIO代替阻塞I/O
e、减少上下文切换
f、降低锁竞争:一种有效的方式是尽可能地缩短锁持有的时间;另一种方式是减小锁的粒度;第三种是放弃使用独占锁,而使用其他更友好的并发方式来保障数据的同步
3)压缩
4)结果缓存
5)数据库查询性能优化:
a、合理使用索引
b、反范式设计:适当冗余,减少联表
c、使用查询缓存
d、使用搜索引擎
e、使用key-value数据库
f、GC优化
g、硬件提升性能:针对需求进行适当配置
12、Java应用故障排查
1)jps:输出JVM虚拟机进程的一些信息
2)jstat:是一个可以用来对虚拟机各种运行状态进行监控的工具,通过它可以查看到虚拟机的类加载与卸载情况,管理内存使用和垃圾收集等信息,监视JIT即时编译器的运行情况等
3)jinfo:用于查看应用程序的配置参数
4)jstack:用来生成虚拟机当前的线程快照信息
5)jmap:可以用来查看等待回收对象的队列,查看堆的概要信息,包括采用的是哪种GC收集器,堆空间的使用情况,以及通过JVM参数指定的各个内存空间的大小等
6)BTrace:是一个开源的Java程序动态跟踪工具
7)JConsole:是一款JDK内置的图形化性能分析工具,可以用来连接本地或者远程正在运行的JVM,对运行的Java应用程序的性能及资源消耗情况进行分析和监控,并提供可视化的图表对相关数据进行展现
8)Memory Analyzer(MAT):是一款功能强大的Java堆分析工具
9)VisualVM:涵盖了JVM内存消耗监视、性能分析、线程,以及堆转储分析、垃圾回收监视等几乎所有能包含进来的功能
1、inotify机制:对文件系统的变化进行监控
注:1)观察者模式:响应式地对文件写入进行监控,读取文件每一次更改
2)inotify解决了日志收集的效率问题,ActiveMQ解决了日志数据分发的问题
3)削峰填谷的思想
2、Storm是一个实时的分布式流处理系统,要处理的对象是没有终点的数据流。Storm使得数据消费的工作能够以topology的形式提交到集群,集群来进行任务的调度、数据流的切割、容错处理等一系列操作,而这一切对用户透明,用户只需定义好他的topology、spout、bolt即可,其他的逻辑则交由集群来处理
3、Chukwa:是基于Hadoop开发的数据采集与分析的框架,用来支持大型分布式系统的海量日志的收集与分析工作,它具有良好的适应性和可扩展性,天生支持与MapReduce协同进行数据处理,能提供完整的数据收集与分析的解决方案,五个关键部分:
1)Agent:负责采集每个节点上的原始数据,并发送数据给Collector
2)Collector:负责接收Agent所发送的数据,并且写入到稳定的存储当中
3)ETL数据处理任务,负责数据解析和归档
4)数据分析脚本任务:负责对收集的数据进行分析
5)HICC:Hadoop基础管理平台,提供数据展现的Web页面
4、Hadoop项目的核心是分布式文件系统HDFS和编程模型MapReduce。HDFS用来对海量的数据提供高可靠性、高容错性、高可扩展性、高吞吐的存储解决方案,而MapReduce则是一种用来处理海量数据的并行编程模型和计算框架,用于对大规模的数据集进行并行计算。
注:高性能分布式协作服务ZooKeeper,可伸缩的支持大表结构化存储的分布式数据库Hbase,提供类SQL查询功能的数据仓库平台Hive,大规模分布式系统的数据收集系统Chukwa,海量数据并行计算的编程语言和执行框架Pig,可扩展的机器学习和数据挖掘库Mahout
1)HDFS:主从结构,集群拥有一个NameNode和一些DataNode,NameNode负责管理文件系统的命名空间,维护着每个文件名称到对应的文件分块的映射,以及每个文件分块对应的机器列表;DataNode则负责它们所在的物理节点上的存储管理。
注:副本的数量默认为3
2)MapReduce可以分为map和reduce两个阶段。在map阶段:a、将任务的输入数据切割为固定大小的片段(split);b、将这些片段进一步分解为键值对;c、为每一个split创建一个map任务,执行用户定义的map处理逻辑,并将split中的键值对作为输入传递给map进行处理;d、map处理后得到的中间结果输出也是键值对形式,结果会被排序,并将键值相同的值合并到一个列表;e、根据键值的排序结果,将中间结果分配到不同的reduce任务。
在reduce阶段:会对中间结果数据进行相应的加工处理,得到最终结果的键值对,并以键值对的形式输出到HDFS文件系统上。
5、HDFS基本操作命令:HDFSShell命令使用hadoop fs
1)touchz:hadoop fs –touchzURI[URI …] 创建一个文件
2)text:hadoop fs –text
3)rmr:hadoop fs –rmr[-skipTrash] URI[URI …] 递归删除,该命令将会递归删除目录和目录下的文件
4)mkdir:hadoop fs –mkdir
5)ls:hadoop fs –ls
6)cp:hadoop fs –cpURI [URI …]
7)mv:hadoop fs –mvURI[URI …]
6、MapReduce:map方法中value值存储的是HDFS文件中的一行,而key值为该行的首字符相对于文件首地址的偏移量;reduce方法输入的key为map中输出的key值,values则对应了map过程中该key输出的value集合
7、Hive是基于Hadoop的一个数据仓库工具,可以将HDFS存储的结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能。支持数据类型:
1)基本数据类型:数值型、布尔型、字符型;
2)复杂类型:ARRAY、MAP、STRUCT
8、Storm是一个开源的分布式实时计算系统。MapReduce执行的是批处理任务,Storm所提出的Topology原语执行的是实时处理任务。
注:Toplogy任务会永远地运行,直到用户手动kill掉
1)Storm特点:a、编程模型简单;b、高容错性和高可靠性;c、高效,ZeroMQ作为底层的消息队列;d、多语言支持;e、可扩展性
2)集群架构:Storm集群包含了两种类型的节点,管理节点和工作节点。管理节点上运行着一个称为Nimbus的后台进程,负责在集群中分发代码,分配任务给其他机器,并且监控集群的异常状态。每一个工作节点上运行着一个叫做Supervisor的后台进程,负责接收Nimbus分配给当前的节点任务,启动或者是关闭相应的工作进程。
注:a、每一个工作进程负责执行Topogy的一个子集,而一个运行着的Topology由运行在多个节点上的工作进程所组成。
b、Nimbus和Supervisor间的所有协调工作都是由ZooKeeper来完成的,Nimbus和Supervisor进程都是快速失败且无状态的,所有状态都存储在ZooKeeper或者本地磁盘上。
9、Storm的一个核心抽象便是stream(流),stream是一个没有边界的tuple(元组)序列,而Storm则提供了在分布式环境中进行可靠的流转换的原语。Storm提供的最基本的处理stream的原语是spout和blot。
注:消息源spout是一个Topology里边的消息产生者
10、流分组将告诉Topology如何在两个组件之间发送tuple序列,Storm里有7种类型的流分组:1)随机分组;2)按照字段进行分组;3)广播发送;4)全局分组;5)不分组;6)直接分组;7)Local orShuffle Grouping
11、Sqoop是Apache下的一个开源同步工具,支持关系型数据到Hadoop的数据导入和导出功能,既能够通过Sqoop将关系型数据库(如MySQL、Orcale)中的数据导入到HDFS,也能通过Sqoop从HDFS中将数据同步回关系型数据库。
12、Highcarts是一个非常流行、界面美观、功能丰富的Javascript图表库,它包含两个部分:Highcharts和Highstock。前者主要是为web站点提供直观的、交互式的图表体验,目前支持线图、条形图、曲面图、条形曲面图、柱状图、饼图、散布图等图表样式;后者能方便快捷地用Javascript建立时间轴图表,提供复杂精致的导航选项,支持预设日期范围、日期选择器、滚动和平移等功能。