《大型分布式网站架构设计与实践》读书笔记

1 面向服务的体系架构(SOA)

1.1基于TCP协议的RPC

序列化的方式:Protocal Buffers、java自带、Hessian、JSON、XML

1.2基于HTTP协议的RPC

基于Http协议屏蔽了很多底层繁琐的细节,比较便捷和简单。但是发送请求占用的字节数比TCP协议多,效率低,可以通过gzip压缩缩小差距。总体来说使用HTTP实现RPC更好。

1.3服务的路由和负载均衡

通过注册中心来动态增删服务实例,在服务调用时负载均衡到具体某一个实例。如Eureka、Zookeeper

常用负载均衡算法有:轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接法。最小连接法是动态地选取服务器中当前积压连接数最少的一台服务器来处理当前请求。

ZooKeeper是分布式系统协调工具,提供的功能包括配置维护、名字服务、分布式同步、组服务等。通过Zab协议保持数据一致性。

1.4Http服务网关

gateway接收各种APP的HTTP请求,完成相应的权限与安全校验,通过后根据传入服务名称,到配置中心找到服务名称节点,并加载服务提供者地址列表,通过负载均衡算法选取机器发起远程调用,将客户端参数传给服务端,gateway收到响应后输出给客户端APP。

2 分布式系统基础设施

2.1 分布式缓存

使用一致性哈希算法把数据缓存到memcache集群。

分布式session,根据sessionid使用一致性哈希算法把session数据缓存到memcache集群。

2.2持久化存储

读写分离->分库分表。在数据量和并发量很大的时候往往是分库分表同时用:

(1)中间变量=user_id%(库数量*每个库的表数量)

(2)库=取整(中间变量/每个库的表数量)

(3)表=中间变量%每个库的表数量

Hbase适合海量数据的存储和处理,能够多个节点同时写入,显著提高写入性能,并且可扩展。缺点是难以支持复杂查询。

Redis跟数据库相比读写吞吐量更大,并发数更高。跟其他key-value数据库相比数据类型更丰富,更高效实现队列、topN、去重、访问计数。

2.3消息系统

ActiveMQ两种工作模式P2P(点对点)、Pub/Sub(发布订阅)

2.4垂直化搜索引擎,基于倒排索引这种数据结构

全文搜索模糊匹配,解决分布式场景下无法多表联结查询和like查询效率不高的问题

lucene

solr基于lucene,使用http请求调用相关接口

2.5其他基础设施

CDN、负载均衡、消息推送、自动化运维系统等

3 互联网安全架构

3.1常见的web攻击手段

XSS跨站脚本攻击、CSRF跨站请求伪造、SQL注入攻击、文件上传漏洞、DDos攻击(分布式拒绝服务攻击)

3.2常用安全算法:数字摘要、对称加密算法、非对称加密算法、数字签名、数字证书

3.3摘要认证

3.4签名认证

3.5HTTPS协议

3.6OAuth协议

4 系统稳定性

4.1在线日志分析

工具:cat、less、more、tail、head、sort、wc字符统计、uniq去重、whereis查找可执行文件、expr表达式求值、sed、awk流编辑器

4.2集群监控

监控指标:

(1)load特定时间间隔内运行队列中的平均线程数,表征系统负载。uptime命令查询系统load

(2)CPU利用率

         top | grep Cpu 查看各种状态下CPU所消耗的时间占比。

         top -p pid查看指定进程的cpu利用情况

(3)磁盘剩余空间 

        df -h查看挂载磁盘利用率

        du -d 1 -h /path 查看具体目录占用的空间(指定深度为1)

(4)网络traffic,sar -n DEV 1 1命令查看系统网络状况,每个网卡每秒收发的字节数和压缩包数

(5)磁盘IO,iostat -d -k查看各个磁盘的流量、tps(每秒处理的I/O请求数)

(6)内存使用,free查看内存使用情况。vmstat命令查案swap虚拟机内存的I/O情况

(7)qps每秒查询数

每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。

原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间 
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS) 
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器 

每天300w PV 的在单台机器上,这台机器需要多少QPS? 
( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS) 

如果一台机器的QPS是58,需要几台机器来支持? 
139 / 58 = 3 

(8)rt请求响应时间,可以通过部署CDN边缘节点、内容压缩、使用缓存来优化

(9)select/ps,数据库每秒处理select的数量,如果读请求数量过多可以适当增加读库,降低读压力。

(10)update/ps、delete/ps如果写请求过多,需要对相应的库进行拆分,将请求分散到其他集群。

(11)GC,实时获取JVM GC情况来观测JVM的运行情况。

4.3流量控制

(1)限制单位时间内的请求数

(2)使用消息中间件削峰填谷,但是要考虑消息去重和事务

(3)服务降级、服务分级

(4)高并发设计:并发编程(i ++不是原子操作,是由几条jvm指令组成的)、数据库事务、线程同步

Reentrantlock和Synchronized区别:公平性、响应中断、多条件细粒度(阻塞队列的实现)

数据一致性:一般采用最终一致性,如mysql的主从延迟、zookeeper的atomic broadcast

数据库并发优化:将并发量比较大的一行拆分成多行

4.4性能优化

性能分析:

(1)前端优化工具YSlow

(2)使用BTrace来记录方法响应时间,用来定位线上问题,解决线上问题不好打debug的问题

(3)GC日志分析,查看GC过程的耗时、频率和空间清理情况

(4)数据库查询:开启mysql慢查询日志

(5)系统资源使用

性能测试用具:Apache Bench(简称ab)、Jmeter。在进行压力测试过程中使用jconsole、VisualVM监控测试机负载、内存使用、GC。

使用负载均衡引流,比如说通过改变nginx中各服务器权重的方法来把大流量集中到某一个服务器,达到测试在线服务器性能的目的。

TCPCopy,将在线请求复制到测试机器。

性能优化:

(1)前端性能优化:合并http请求、cdn缓存、gzip压缩

(2)java程序优化:单例模式、future模式、线程池、NIO、减小锁的粒度、读写锁分离、CAS

(3)数据库查询性能优化:

#合理使用索引:使用explain命令分析查询语句,查看是否命中索引。建立多列索引而不是多个单列索引。使用全文检索系统来支持模糊查询,而不是使用mysql的模糊查询。order by 和group by语句也遵循最左前缀原则。
#反范式设计:避免关联查询,将需要关联查询的列进行冗余存储以减少随机IO和全表扫描。

#使用查询缓存:在读多写少的场景下启用查询缓存,提高查询速度。

#使用搜索引擎:分布式环境下提供复杂的跨表查询和分组操作

#使用key-value数据库

(4)GC优化,如果频繁Full GC,适当增大Xmx。CMS回收调整oldGen使用量阈值,oldGen使用68%会激活垃圾回收

(5)硬件提升性能:SSD硬盘

4.5 JAVA应用故障排查

1、工具:

jps输出JVM进程信息

jstat监控虚拟机状态、查看垃圾回收统计信息、各个代的空间等。

jinfo查看应用程序的配置参数,可以查看未显式指定的JVM参数

jstack生成虚拟机线程快照

jmap生成堆转储快照,查看堆概要信息

BTrace:Java程序动态跟踪工具,原理是应用Hotspot的hotswap技术将跟踪代码替换到java程序内。

JConsole:图形化性能分析

MemoryAnalyzer(MAT)用来分析dump文件

VirsualVM:功能强大,可安装插件

5 数据分析

5.1日志收集

通过linux自带的inotify机制监控日志文件的修改,通过read系统将追加的日志读出到消息中间件,被各个日志订阅方收集、处理。

架构:inotify client -> ActiveMQ->Stom实时处理->mysql、Hbase、Memcache、HDFS存储->实时展现或者离线深度分析

Hadoop:海量数据持久化存储及分析

HDFS:分布式文件系统

Mapreduce、Hive SQL数据分析与挖掘

Hbase:高可靠高性能可伸缩的列存储系统

Chukwa:基于Hadoop的数据采集与分析框架

5.2离线数据分析

HDFS Mapreduce Hive Hadoop

5.3流式数据分析

Stome

5.4数据同步

Sqoop:mysql和Hive、HDFS之间的数据同步

5.5数据报表

Highcharts

你可能感兴趣的:(分布式)