安全稳定
本周是跟随李智慧老师学习架构师训练营的第十一周,现将本周主要内容总结如下:
常见网络攻击手段:
XSS 攻击:跨站脚本攻击。消毒,即转义 HTML 危险字符,某些需要匹配上下文转义,如 3<5
SQL 注入攻击:特殊字符过滤、预编译
CSRF 攻击:伪造用户请求。随机 token、验证码、Referer check
其他:错误回显,不能将程序异常堆栈信息直接显示在前端。
不能使用 HTML 注释
文件上传:文件类型白名单限制;修改文件名,专门存储等
路径遍历:JS、CSS 等静态资源独立部署,独立域名。访问 URL 不包含文件真实路径
常见预防措施:
开源 web 应用防火墙:ModSecurity
安全漏洞扫描
加密:单项散列(加 salt)、对称、非对称。建议使用专门的加密服务器
反垃圾邮件:贝叶斯分类算法
贝叶斯公式:P(B|A) = P(A|B) * P(B) / P(A)
P(B|A):在事件 A 发生的前提下,事件 B 发生的概率
P(A|B):在事件 B 发生的前提下,事件 A 发生的概率
P(B):事件 B 发生的概率
P(A):事件 A 发生的概率
布隆过滤器黑名单控制
电子商务网站风控:自动、人工
可用性指标:
99 基本可用,年度停机时间小于 88 小时
99.9 较高可用,年度停机时间小于 9 小时
99.99 具有自动恢复的高可用,年度停机时间小于 53 分钟
99.999 极高可用,年度停机时间小于 5 分钟
高可用常见解决方案:
解耦
备份:集群,数据库复制
重试
失效转移
幂等性
补偿事务
异步
降级:关闭一些非核心功能,例如确认收货、评价等
限流:计数器(固定窗口、滑动窗口)、令牌桶算法、漏桶算法
自适应限流:
熔断
异地多活:难点是数据一致
发布:要保证服务 7*24 小时可用,发布相当于一次服务器宕机
自动化测试:web 自动化测试工具:selenium
持续集成、持续交付、持续部署
预发布验证:预发布服务器是生产环境的特殊服务器,没有配置在生产服务的负载均衡上
版本控制:
主干开发,分支发布
分支开发,主干发布:较常使用
自动化发布
灰度发布:分几天,每次发布一部分服务器
网站监控:
用户日志行为收集
服务器性能指标监控:Ganglia
业务运行数据报告:缓存命中率,平均响应延迟等
监控管理:根据监控数据进行失效转移,自动负载、报警、自动扩容、自动限流等
故障分析:
日志管理:
设置合理的日志输出级别
关闭第三方的不必要日志输出
应用日志与第三方日志输出分别配置
首页:
首页尽量不访问数据库,首页需要的数据从缓存服务器或搜索引擎服务器获取
首页尽量是静态的
锁:
慎用锁,尤其是在长时间 IO 场景
根据不同场景使用不同种类的锁,不要统一使用 synchronized
缓存:
缓存服务器升级维护,一台一台来,不能同时停机,造成缓存失效
服务启动依赖:
先启动后端服务,再启动前端服务
文件存储:
根据不同文件类型和用途进行管理
大文件和小文件分开存储,批处理大文件可以使用分布式文件系统
生产数据规范:
生产数据维护,压测等必须遵循相应规范
代码规范:
加强 code review
代码合并前进行比较
代码健壮性,测试覆盖点:例如新增用户逻辑,老用户逻辑
作业一:
(至少完成一个)
导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。
请用你熟悉的编程语言写一个用户密码验证函数,Boolean checkPW(String 用户 ID,String 密码明文,String 密码密文),返回密码是否正确 boolean 值,密码加密算法使用你认为合适的加密算法。
导致系统不可用的原因:
1.部分服务器宕机导致系统并发压力增大,最终导致服务崩溃。解决方案:限流、熔断、降级、自动扩容,服务自动恢复,异地多活等
2.缓存服务失效,导致数据库压力变大,最终导致服务不可用。解决方案:合理设置缓存淘汰策略,缓存服务高可用配置
3.负载均衡不合理,导致部分服务器压力过大,最终导致服务不可用。解决方案:设置合理的负载均衡策略,根据服务器状态动态调整负载均衡策略
4.磁盘空间占满。设置合理的日志级别,自动化清理日志文件
5.不合理的锁使用,导致线程阻塞。根据不同的场景,使用不同的锁类型
6.数据丢失。做好数据同步、备份
7.后端服务未启动完成,有请求进来,导致系统崩溃。先启动后端服务,再启动前端服务,做好服务启动依赖控制
8.CDN 服务故障,导致静态资源请求到达后端。CDN 预热,限流
9.首页加载,频繁访问数据库。首页加载尽量静态化,或从缓存服务器、搜索服务器获取
评论