架构师技术栈
2019-04-03 16:19:01 0 举报
AI智能生成
大型网站技术架构
作者其他创作
大纲/内容
高可用
高可用应用
负载均衡进行故障转移
集群的session管理
同IP会话黏滞
session服务器
redis共享session
高可用服务
分级管理
核心服务优先使用更好的硬件
不同级别的服务需要隔离,避免故障连锁反应
超时设置
超时后,通信框架抛出异常,程序选择继续重试或失效转移
异步调用
消息队列
防止关联的服务互相影响
服务降级
拒绝服务
拒绝低优先级应用的调用,减少服务调用并发数
随机拒绝
关闭功能
关闭部分不重要的服务
关闭服务内部部分不重要的功能
实施方式
基于Java的信号量机制:Semaphore
调用超时次数超过阈值,自动降级,后续来的流量直接拒绝,等超过休眠时间点,再次对服务进行重试
幂等性设计
重复调用和调用一次必须保证结果相同
异地多活机房
保证核心业务异地多活
例:注册、登录、用户信息,只有登录才是核心业务
核心数据最终一致性
尽量减少数据同步,只同步核心业务数据
保证最终一致性,不保证实时一致性
采用多种手段同步数据
消息队列
二次读取
第一次读取本地失败后,根据路由规则去另外一个机房读取
存储系统同步方式
Mysql同步
回源读取
session id不同步,本地机房没有该id的情况下,根据路由去另外一个机房获取
重新生成数据
session id在另外一个机房未获取到,则让用户重新登录
保证大部分用户的异地多活
高可用数据
数据失效转移机制
失效确认
访问转移
数据恢复
CAP
一个提供数据服务的存储系统无法同时满足数据一致性、数据可用性、分区容忍性,
通常会牺牲数据一致性
通常会牺牲数据一致性
一致性(Consistency)
对指定的某个客户端来说,读操作保证能够返回最新的写操作结果
可用性(Availability)
非故障的节点在合理的时间内返回合理的响应(非错误和超时的响应)
分区容忍性(Partition Tolerance)
当出现网络分区(网络故障)后,系统能够继续“履行职责”
ACID
数据库约束
Atomicity原则性
Consistency一致性
Isolation隔离性
Durability持久性
BASE
Basically Available基本可用
分布式系统在出现故障时,允许损失部分可用性,即保证核心可用
Soft State软状态
Eventual Consistency最终一致性
是CAP理论中AP方案的延伸,即使无法做到强一致性,但应用可以采取适合的方式达到最终一致性
高可用存储
数据备份
冷备
热备
异步热备
同步热备
主备复制
主从复制
主机负责读写,从机只负责读
主主复制
对数据的设计有严格的要求,一般适合临时、可丢失、可覆盖的数据场景
数据集群
数据集中集群
一主多备
一主多从
数据分散集群
Hadoop的HDFS存储系统
独立的服务器负责数据分区的分配(Namenode)
Elasticsearch
选举一台服务器做数据分区的分配(master node)
分布式事务算法
2PC,强一致性算法
Commit请求阶段
Commit提交阶段
3PC
提交判断阶段
准备提交阶段
提交执行阶段
分布式一致性算法
Paxos
纯理论算法,特别复杂,是其他算法的鼻祖
Raft
为工程实践而设计,Paxos算法的不完整版
ZAB
自动化测试
工具:selenium
接口性能工具:Jmeter,loadrunner
监控
数据采集
用户行为
服务器性能
系统load
内存占用
磁盘IO
网络IO
运行数据
缓存命中率
平均响应延迟时间
每分钟发送邮件数目
待处理任务总数
监控管理
系统报警
失效转移
自动优雅降级
Linux命令
日志查看
cat
cat -n access.log 显示行数
more
Enter:下一行,空格:下一页,F:下一屏,B:上一屏
less
sort
对内容进行排序
-n
数字从小到大排列
-r
数字从大到小排列
-k
指定排序的列
-t
指定分隔符
wc
统计指定文件的字符数、字数、行数
-l
统计行数
uniq
查看重复出现的行
sort uniqfile | uniq -c
-c:每一行前面加上该行出现的次数
常用脚本
页面访问量前十的f1列
cat access.log | cut -f1 -d " " | sort |uniq -c | sort -k 1 -n -r |head -10
查看最耗时的页面
cat access.log | sort -k 2 -n -r | head -10
系统监控
uptime
查看系统的load
一般来说,load不大于3,表示负载正常,load大于5,负载压力过高
top | grep Cpu
st
us
表示CPU执行用户进程所占的时间,越高越好
sy
在内核态所花费的时间,越低越好
ni
系统在调整进程优先级花费的时间
id
系统空闲时间
wa
CPU在等待IO操作所花费的时间,越低越好
hi
系统处理硬件中断所占用的时间
si
系统处理软件中断所占用的时间
top -p 进程号
查看指定进程
du-d 1 -h
查看磁盘剩余空间,-d 1表示递归深度
sar -n DEV 1 1
查看系统的网络状况
iostat -d -k
查看系统的IO
free -m
查看内存使用情况
swap过高,表示物理内存不够用
vmstat
查看当前swap的IO情况
扩展性
核心思想:模块化
降低模块间的耦合性
提高模块的复用性
分层和分割,以消息传递和依赖调用聚合成完整系统
分布式队列
分布式服务
伸缩性
网站架构伸缩
不同功能物理分离
相同功能集群伸缩
负载均衡器
DNS域名解析负载均衡,缺点是失效转移存在一定的时效性
反向代理(应用层负载均衡)
NGINX,七层负载,5万/每秒
数据链路层负载均衡
LVS,四层负载,80万/每秒
负载均衡算法
轮询
加权轮询
负载最低优先
LVS可以以连接数来判断
Nginx可以以HTTP请求数来判断
性能最优
响应最快,性能最优
原地址散列(哈希)
分布式缓存集群
一致性性Hash算法
数据存储服务器集群
关系型数据库集群
读写分离
分库
不同业务部署在不同的集群
分片
单表拆分,存在多个库中
支持数据分片的中间件:Cobar,缺点是只能在单一数据库
实例上处理查询请求,无法执行跨库的Join操作
实例上处理查询请求,无法执行跨库的Join操作
NoSql
HBase
以HRegion为单位进行管理
HDFS分布式文件系统
高性能
WEB前端
浏览器访问优化
浏览器缓存
设置http头中的Cache-Control
设置http头中的Expires
页面压缩
合理布局
CSS放在页面最上面
js放在最下边
减少cookie传输
减少数据量
静态资源独立域名
减少Http请求
合并css
合并js
合并图片
CDN加速
缓存静态资源,如图片、文件等
反向代理
动静分离
js、css等文件独立部署,使用专门的域名
图片服务
用户上传,独立部署
反向代理
提供页面缓存
DNS
DNS负载均衡
应用服务器
异步操作
削峰
加快响应速度
使用集群
代码优化
多线程
资源服用
单例模式
对象池
JVM垃圾回收
新生代
Eden Space
新建对象总是在该区创建,当空间满,触发Young GC,将还未使用的独享复制到From区,Eden区则清空
From
当Eden区再次用完,再触发Young GC,将Eden和From区未使用的对象复制到To区
To
当Eden区再次用完,触发Young GC,将Eden和To区未使用的对象复制到From区,如此反复
老年代
经过多次Young GC,某些对象会在From和To多次复制,如果超过某个阈值对象还未释放,则将该对象复制到老年区。如果老年区空间用完,就会触发Full GC
JVM
堆heap
存储对象的内存空间,对象的创建和释放、垃圾回收都在这里进行
栈stack
存储线程上下文信息,如方法参数、局部变量等
存储性能优化
RAID
RAID0
将磁盘数量分成N份,数据同时并发写入N块磁盘,速度快,缺点是没有备份
RAID1
一份数据同时写入两块磁盘,有备份
RAID10
RAID0与RAID1的结合,缺点是磁盘利用率低
RAID3
数据分成N-1份,并发写入N-1块磁盘,在第N块磁盘记录校验数据,缺点是第N块磁盘在频繁修改情况下容易损坏,实践中很少使用
RAID5
与RAID3不同的是,将第N块磁盘记录校验的数据写入所有的磁盘,避免同时写坏一个磁盘
RAID6
类似RAID5,但是数据只写入到N-1块磁盘,螺旋式的将校验数据写入在两块磁盘中
存储算法
B+树(传统关系型数据库)
LSM树(NOSQL)
HDFS分布式文件系统
NameNode,只有一个实例,负责数据分区的分配
DataNode,真正存储数据的存储节点
关系型数据库
读写分离
分库
问题
join操作问题
事物问题
成本问题
单台数据库服务器一般来说能支撑10万用户量级的业务
分表
垂直分表
将表中某些不常用且占了大量空间的列拆分出去
水平分表
参考:单表超过五千万条建议分表
路由算法
范围路由
选取有序的数据列作为路由条件,不同分段分散到不同的数据库表中
复杂点在于分段大小的选取上,建议分段大小在100万到2000万之间
优点:可随数据的增加平滑地扩充新的表
缺点:分布不均匀。新扩充的表数据量一开始很少
Hash路由
复杂点在于初始表数量的选取上
优点:表分布比较均匀
缺点:扩充新表很麻烦,数据需要重新分布
配置路由
新建一张单独的表记录路由信息
优点:设计简单,扩充表时只需要迁移指定数据,修改路由表
缺点:必须多查询一次路由表,影响整体性能
问题
join操作
进行多个表的join查询,将结果合并
count()操作
count相加
对每个表进行count,最后结果相加
缺点:性能低
记录数表
新建表,包含table_name,row_count两个字段
每次插入或删除成功后,更新记录数表,缺点是增加性能开销
不要求精确的业务,可通过定时任务更新
order by操作
分别查询每个子表中的数据,然后汇总进行排序
实现方式
程序代码封装
TDDL(淘宝)
ShardingJDBC(当当)
中间件
mycat
mysql router
atlas(奇虎360)
NoSQL
Redis(K-V存储)
两种持久化方式
RDB
只备份当前内存中的数据集,事物执行完毕并不立即写入磁盘
AOF
先执行命令,成功后立即将命令追加到日志文件,也可能丢失命令数据
MongoDB(文档数据库)
特点:no-schema
优点:
新增字段简单,存储json格式的复杂数据
缺点:
不支持事物
无法实现join
HBase(列式数据库)
优点:
节省IO,因为每次只查一列,数据量小
比行式数据库更高的存储压缩比
缺点:
存储不连续,遇到修改操作性能很差
更新时需要将数据解压后更新,然后再压缩,写入磁盘
场景:
离线的大数据分析和统计
Elasticsearch(全文搜索引擎)
原理:
倒排索引(反向索引),建立单词到文档的索引
Elasticsearch是分布式的文档存储方式,它能够存储和检索复杂的数据结构。
为了让搜索引擎支持关系型数据库的全文搜索,需要将关系型数据转换为文档数据
分布式缓存
场景
需要经过复杂运算得到的数据
读多写少,很少变化
不适合缓存
频繁修改的数据
没有热点的数据
设置失效时间
缓存雪崩
更新锁
分布式环境下,对缓存更新操作进行加锁保护,保证只有一个线程能够进行操作
后台更新
缓存有效期设置为永久,后台定时更新
通过定时读取缓存,判断缓存是否存在
业务线程发现缓存丢失后,通过消息队列通知后台
缓存预热
系统上线时将热点数据加载好
缓存穿透
存储数据不存在:造成数据库压力,应对策略是将不存在的数据缓存起来
数据生成耗费大量时间和资源
缓存热点
很多业务请求都命中同一份缓存
解决方案是复制多份缓存,将请求分散到多台服务器
文件存储
小文件
HBase
Hadoop
Hypertable
FastDFS
未开源:TFS(淘宝)、JFS(京东)、Haystack(Facebook)
大文件
Hadoop
HBase
Storm
Hive
安全性
XSS跨站脚本攻击
防御
消毒:特殊字符进行转译
HttpOnly:对于存放敏感信息的cookie,可通过对该Cookie添加HttpOnly属性
分类
反射型:发布带攻击的链接
持久型:将攻击信息存到服务器数据库中
注入攻击
分类
SQL注入
OS注入
防御
消毒:特殊字符转译
参数绑定:sql预编译和参数绑定
CSRF跨站点请求伪造
核心:利用了浏览器的Cookie或服务器Session策略
防御
表单Token
验证码
Referer check
将cookie设置为HttpOnly
DDoS
SYN Flood
基于TCP的三次握手,攻击者伪造大量IP地址给服务器发送SYN报文,导致服务器接收不到客户端的ACK,服务器需要分配资源来维护本次握手,并不断重试。当等待队列占满后,服务器不再接收新的SYN请求。
DNS Query Flood
向被攻击的服务器发送海量的域名解析请求。
CC
基于HTTP协议发起,通过控制大量肉鸡和互联网上大量的代理,模拟正常用户给网站发起请求,直到网站拒绝服务。
从应用层发起,与网站的业务紧密相连,使防守方进行过滤的时候进行大量的误杀,真正业务无法处理。
其他攻击手段
Error Code
程序内部错误,浏览器打印堆栈信息
防御:配置Web服务器参数,跳转到500的专用错误页面
Html注释
注释显示在客户端,给黑客攻击造成便利
防御:代码Review,删除注释
文件上传
利用文件上传功能上传可执行程序,进而控制服务器
防御:设置上传文件白名单,只允许上传可靠文件类型,判断文件上传类型,使用“魔数”
文件单独存储
路径遍历
在请求的URL中使用相对路径,遍历未开放的目录及文件
防御:静态资源独立部署,其他资源不使用静态URL访问,动态参数不包含文件路径信息
防火墙
ModSecurity,开源
SiteShell
深信服
加解密
单向散列加密(摘要算法)
MD5
SHA-1
对称加密
加密与解密使用同一个密匙,远程通信的密匙交换是难题
DES
56位
3DES
AES
AES-128
AES-192
AES-256
RC
非对称加密
算法RSA
位数越大,加解密速度越慢
信息安全传输:公钥加密,私钥解密
数字签名(不可抵赖):私钥加密,公钥解密
发送发:将内容生成摘要,再用私钥将摘要进行加密生成数字签名,最后将数字签名和原文内容传输给接收方。
接收方:将原文内容采用相同的摘要算法生成摘要,再用公钥将数字签名解密成发送方的摘要,最后将两个摘要对比即可确认真伪。
算法
MD5withRSA
SHA1withRSA
数字证书
证书管理
keytool
Java的数字证书管理工具
OpenSSL
进行证书的签发与证书链的管理
0 条评论
下一页