大型网站技术架构学习

17 篇文章 0 订阅
4 篇文章 0 订阅


大型网站软件系统的特点
高并发,大流量
高可用
海量数据
用户分布广泛,网络情况复杂
安全环境恶劣
需求快速变更,发布频繁
渐进式发展

1,大型网站架构的演化
    1,初始阶段的网站架构
        一台服务器 应用程序,数据库,文件服务放到一台服务器上(php/java/mysql)


    2,应用服务和数据服务分离
        三台服务器 更高的应用服务器一台,更快的硬盘和更大的内存的数据库服务器一台,更大的磁盘

文件服务器一台
    3,使用缓存改善网站性能
        分为本地缓存(更快但是争用内存)和远程分布式缓存
        六台服务器 更高的应用服务器一台,三台远程分布式缓存,更快的硬盘和更大的内存的数据库服务器一台,更大的磁盘文件服务器一台


        缓存问题:
            缓存穿透--->查询缓存没有的数据 //返回空数据,给空数据设置失效时间
            缓存击穿--->数据失效 // 设置热点数据永远不过期
            缓存雪崩--->缓存宕机或同一时间失效 // 缓存集群+设置不同(随机)失效时间
    4,使用应用服务器集群改善网站的并发处理能力
        增加应用服务器,使用负载均衡调度服务器(nginx)/此时只连接了一台数据库


    5,数据库读写分离(虽然用了缓存,但是业务数据最终还是要落到关系型数据库/由业务决定)
        主从热备,配置两台数据库的主从关系(怎么配置?读写访问数据库,多数据源配置)
        写主读从


    6,使用反向代理和CDN加速网站响应
        cdn(离用户最近的机房)和反向代理服务器(网站中心机房)都缓存着用户请求的资源(前端服务资源)


    7,使用分布式文件系统和分布式数据库系统(网站数据库拆分的最后手段,表单规模非常庞大的时候才使用)
        业务分库,将不同业务的数据库部署在不同的物理服务器上


    8,使用NOSQL和搜索引擎(数据存储的检索的需求越来越复杂)
        对可伸缩的分布式特性具有更好的支持


    9,业务拆分
        拆分产品线
        技术上将网站拆分成不同的应用,每个应用独立部署
        1,页面链接访问不同应用地址
        2,数据交互,通过接口调用(同步)或者消息队列(异步)分发
        3,通过访问同一个数据存储系统来构成一个关联的完整系统


    10,分布式服务
        服务拆分后服务的连接变大,会出现数据库(连接数不够)服务拒绝
        抽离公共服务,提供给业务服务


    11,其他
        跨数据中心的实时数据同步 

    云计算平台
        将计算/存储/网络作为一种基础资源出售
    云服务
        提供线上服务,方便业务使用

    网站架构设计误区
        一味追随大公司的解决方案
        为了技术而技术
        企图用技术解决所有问题
            有时候要修改的是业务架构而不是技术架构
            控制并发访问的量

2,大型网站架构模式(目标:高性能/高可用/易伸缩/可扩展/安全)
    1,分层(无论网站规模大小)(横向)
        应用层(终端)/服务层/数据层
            禁止跨层次调用和逆向调用
            三层结构分别部署到不同的服务器上
            单服务多端口
    2,分割(纵向)
        将不同功能和服务分割开
        购物->酒店/小商品/->首页/导航
    3,分布式(服务器变多)
        问题:
            跨服务调用(io)
            宕机概率增加
            数据一致性问题
            依赖复杂,开发管理困难
        常用的解决方案:
            分布式应用和服务
            分布式静态资源
                动静分离
            分布式数据和存储
                nosal几乎都是分布式的
            分布式计算
                hadoop/mapreduce,将计算程序发布到数据所在位置以加速计算和分布式计算
            分布式配置
            分布式锁
            分布式文件系统
    集群(至少两台,高可用至少三台)
    缓存
        CDN 缓存静态资源
        反向代理 返回前端资源
        本地缓存
        分布式缓存(专门的分布式缓存集群)
    异步(典型的生产者消费者模式)
        单机使用多线程共享内存队列
        多个服务器集群通过分布式消息队列实现异步
        特性
            提高系统可用性
            加快网站响应速度
            消除并发访问高峰
    冗余
        服务器冗余(集群)
        数据库冗余(冷备存档)
        主从实时同步热备
    自动化(目前主要集中在发布运维方面)
        自动化发布过程(Jenkins)
        自动化代码管理,代码版本管理,代码分支创建合并自动化
        自动化测试
        自动化安全检测
        自动化部署
        自动化监控
        自动化报警
        自动化失效转移
        自动化失效恢复
        自动化降级
        自动化分配资源
    安全
        网络通信加密
        数据加密
        xss攻击
        sql注入
        编码转换
        垃圾数据/敏感信息进行过滤
        交易类对交易模式和交易信息进行风控

    模式受其使用场景限制,用好在于对问题和需求是否真正理解与把握

3,大型网站核心架构要素
    性能
        浏览器
            浏览器缓存
            页面压缩
            合理布局页面
            减少cookie传输
            cdn
        应用端
            本地缓存/分布式缓存
            异步请求
            集群
        代码层
            多线程
            改善内存管理
        数据库服务器端
            索引
            缓存
            sql优化
        nosql
            优化数据模型
            存储结构
            伸缩特性
    可用性
        应用服务器
            不可以将用户的请求会话信息保存到某一台服务器
        存储服务器
            实时备份
        开发过程
            预发布验证
            自动化测试
            自动化发布
            灰度发布
    伸缩性
        集群
        数据库集群
    扩展性
        快速响应需求变化
        异步(生产者消费者模式)
        第三方开发者/提供开发者平台
    安全性
        应对各种现存和潜在的各种攻击手段,需要有可靠的应对策略

4,瞬间响应:网站的高性能架构
    网站性能测试
        前端架构优化手段
            优化html样式/利用浏览器的并发和异步特性/调整浏览器缓存策略/使用cdn/反向代理
    性能测试指标


        响应时间
            请求一万次,响应时间之和除以一万
        并发数
            同时提交请求的用户数目
            测试并发用户,两次请求之间加入一个随机时间(思考时间)
        吞吐量
            单位时间内系统处理的请求数量
            tps 每秒事务数 
            hps 每秒http请求数
            qps 每秒查询数
        性能计数器
            系统负载 正在被cpu执行和等待被cpu执行
            对象与线程数
            内存使用
            cpu使用
            磁盘
            网络I/O
    性能测试方法
        性能测试
        负载测试
        压力测试
        稳定性测试
    性能测试报告
    性能优化策略
        性能分析
            检查请求处理的各个环节的日志
            分析原因:内存/磁盘/网络/cpu/代码问题/架构设计/系统资源不足
        性能优化
            web前端性能优化
                浏览器访问优化
                    1,减少http请求,同个页面相同服务请求尽量少
                    2,使用浏览器缓存
                        设置http请求头Cache-Control和Expires
                        更新文件名,更新html引用
                        浏览器缓存策略的网站更新静态资源时,应该一个文件一个文件更新
                    3,启用压缩
                    4,css放在页面最上面,js放在页面最下面
                    5,减少Cookie传输
                CDN加速
                    缓存静态资源 图片/文件/css/脚本/静态页面
                反向代理(nginx)
                    缓存静态资源或动态内容
            应用服务器性能优化
                优化手段:
                    缓存
                        缓存基本原理
                         hashcode
                        合理使用缓存
                            不缓存频繁修改的数据
                            缓存热点数据
                            产生数据不一致和脏读(读写一致性问题)
                            缓存可用性
                                缓存雪崩 ---> 分布式缓存集群
                            缓存预热
                                启动时加载数据库中全部数据到缓存
                            缓存穿透
                                不存在的value值也缓存起来
                            分布式缓存架构
                                memcached 集群服务器之间不通信/高性能网络基于libevent/内存管理
                    异步
                        不能立即成功(中间状态)
                    使用集群
                        反向代理
                    代码优化
                        多线程
                            启动线程数 执行时间 / (任务执行时间-IO等待时间) * CPU内核数
                            计算型任务线程数不超过CPU内核数
                            多线程问题
                                将对象设计为无状态对象 贫血模型对象无状态 不良设计
                                使用局部对象 方法内部创建对象 不要将对象传递给其他线程
                                并发访问资源时使用锁
                            资源复用
                                单例 声明bean,获取bean
                                对象池 对象创建后放到连接池,用完归还
                            数据结构
                                Hash散列算法Time33
                                    hash(i) = hash(i-1) * 33 + str[i]
                                    str ---> md5 ---> hash ---> hashcode
                            垃圾回收
                                堆控件存储对象信息
                                    yong(eden(满了复制到from触发young gc)/from(eden满了复制到eden和to)/to(eden满了复制到eden和from))
                                    超过设置的阈值复制到old
                                    old(满了触发full gc)

 

            存储服务器性能优化
                关系型数据库 b+树
                nosql lsm树
                raid
                hdfs
                    namenode 管理服务节点(名称服务)
                    datanode 存储数据节点 写入是集群复制 保证高可用

    需要业务的支撑和驱动

5,网站的高可用架构
    网站可用性
        网站年度可用性指标 = (1-网站不可用时间/年度总时间) * 100%
    高可用的服务
        负载均衡
        session管理
            session复制 不推荐
            session绑定(ip指定) 不推荐
            cookie记录session 不推荐
            session服务器 推荐
        分级管理
            服务器优先部署高服务
            物理机部署地域分离(虚拟机/物理机/数据中心)
        超时设置
            超时重试3次或调用其他相同服务
        异步调用
            邮件异步发送
        服务降级
            拒绝服务和关闭服务
        幂等性设计
            使用版本号
    高可用的数据
        分布式缓存服务器集群
        应用服务器集群共用同一个分布式缓存服务器
        cap原理
            c:数据一致性,所有应用程序都得到相同的数据
            a:数据可用性,任何时候应用程序都可以读写访问
            p:分区耐受性,跨网络分区线性伸缩
        数据备份
            冷备
            异步热备
                写主存储服务器后(立即返回响应)异步写备存储服务器
            同步热备
                同时写多台存储服务器
            关系型数据库热备
                master-slave同步机制
                    读写分离
        失效转移
            失效确认
                心跳检测
                应用程序失败报告
            访问转移
            数据恢复
    高可用网站的软件质量保证
        网站发布
            关闭一小部分的负载均衡服务,替换完开启后替换其他的
        自动化测试
            selenium
        预发布验证(uat(预验证)/冒烟(内测))
            第三方服务
        代码控制
            主干开发/分支发布
            分支开发/主干发布(主要使用)
        自动化发布
            火车发布模型
        灰度发布
            部分服务器集群部署
            abtest
        网站监控
            监控数据采集
                用户行为日志收集
                    服务端日志收集
                    客户端浏览器的日志收集
                服务器性能监控
                    ganglia
                运行数据报告
                    缓存命中数/平均响应时间/待处理任务
            监控管理
                系统报警
                失效转移
                自动优雅降级

6,网站的伸缩性架构
    网站架构的伸缩性设计
        不同功能进行物理分离实现伸缩
            纵向分离部署,横向分离业务
        单一功能通过集群规模实现伸缩
    应用服务器集群的伸缩性设计
        http重定向负载均衡(不多见)
        dns域名解析负载均衡(dns解析到负载均衡服务器)
        反向代理负载均衡(性能问题)
        ip负载均衡(受限于负载均衡服务器)
        数据链路层负载均衡(三角模式(直接路由方式)/LVS)
        负载均衡算法
            轮询(round robin, RR)
            加权轮询(高性能服务器更多请求)
            随机
            最少连接
            源地址散列
    分布式缓存集群的伸缩性设计
        memecached分布式缓存集群
        余数hash在加入新服务器会无法命中缓存(预热)
        分布式缓存的一致性hash算法(负载不均衡)
        一致性hash算法加虚拟层(150个虚拟节点)
    数据存储服务器集群的伸缩设计
        关系型数据库集群的伸缩设计
            数据集主从模式(读写分离)
            分库分表(一个表拆分开存储到多个数据库中)
                Amoeba/Cobar(代理策略)
                (无法跨库join,不能跨库事务处理)
                避免事务/事务补偿机制/分解数据访问逻辑(避免join)
                GreenPlum(可以join,但是延时大,适合数据仓库非实时业务)
        nosql数据库的伸缩性设计
            关系数据库海量数据处理能力不足,设计约束
            放弃关系型结构化查询和事务一致性
            高可用和可伸缩性
            hbase(Hmaster->HRegionServer->HRegion->HFile/hdfs)

7,网站的可扩展架构
    扩展性(系统设计)/伸缩性(加机器)
    构建可扩展的网站架构
        拆分系统模块
    利用分布式消息队列降低系统耦合性
        事件驱动架构
            生产者消费者模式
            消息发布订阅(kafka)
        分布式消息队列
            伸缩性
            可用性
            mysql也能做(消费者要定时去取)
        利用分布式服务打造可复用的业务平台
            模块拆分独立部署
                纵拆
                    大应用拆分为多个小应用
                横拆
                    拆分复用业务,独立部署


            大型网站分布式服务的需求与特点
                负载均衡
                失效转移
                高效的远程通信
                整合异构系统
                对应用最少侵入
                版本管理
                实时监控
            分布式服务框架设计
                thrift
                dubbo
                    远程调用
            可扩展的数据结构
                nosql(先指定名字,无需指定字段,写入时再指定)
            利用开放平台建设网站生态圈
                只有用户得到了他们想要的价值,他们才愿意使用网站的服务,网站的存在才有意义
                开放平台架构原理
                    第三方应用 ---> open api/协议转换/安全/审计(日志/计费)/路由/流程(统一接口调用(外观模式)) ---> 网站内部服务

 

8,网站的安全架构
    xss攻击(跨站点脚本攻击)
        消毒(html危险字符转义)
    注入攻击
        消毒
        参数绑定
    csrf(跨站点请求伪造)
        表单token
        验证码
        referer域中记录着请求来源
    其他攻击和漏洞
        error code
        html注释
        文件上传(限制文件上传类型/修改文件名/使用专门存储)
        路径遍历(独立部署前端资源,使用独立域名/不使用静态url,动态参数不包含文件路径信息)
    web应用防火墙
        ModSecurity/SiteShell
    网站安全漏洞扫描
        安全漏洞扫描平台(模拟黑客攻击)
    信息加密技术及密钥安全管理
        单向散列加密(md5/sha)加密后入库,再次登录后加密对比数据库
        对称加密(des/rc)token加密
        非对称加密(rsa) 公钥加密只有私钥能解开/私钥加密的信息只有用公钥才能解开
        密钥安全管理(密钥和算法放到独立服务器(不推荐)/加解密算法放到应用心态,密钥放到独立服务器/密钥分开加密后保存到不同存储介质中)
    信息过滤与反垃圾
        文本匹配(敏感词/降噪) Trie树/双数组+trie树 hash浪费内存
        分类算法(贝叶斯分类算法)
        黑名单(hash表/布隆过滤器 通过一个二进制列表和一组随机数映射函数实现)
    电子商务风控
        风险(账户风险/买家风险/卖家风险/交易风险)
        风控(规则引擎和统计模型)

11,海量分布式存储系统Doris的高可用架构设计分析
    分布式存储系统的高可用架构
        应用程序服务器
        数据存储服务器
        管理中心服务器
    不同故障情况下的高可用解决方案
        分布式存储系统的故障分类
            瞬时故障(断网/内存垃圾回收/线程繁忙)
                重试机制
            临时故障(交换机宕机/网卡松动/系统升级/停机维护/内存损坏/cpu过热)
                写入临时存储服务器
            永久故障(硬盘损坏,数据丢失)
                集群复制

12,网站秒杀系统架构设计案例分析
    1,秒杀系统独立部署
    2,秒杀商品页面静态化
    3,租借秒杀活动网络带宽
    4,动态生成随机下单页面url
    秒杀系统架构设计
        控制秒杀商品页面购买按钮的点亮
            使用脚本控制,秒杀开始生产新的js文件并被用户加载
        如何只允许第一个提交的订单被发送到订单子系统
            只有少数用户能进入下单页面,检查全局提交订单数目

13,大型网站典型故障案例分析
    写日志也会引发故障
        应用程序和第三方日志配置要分别配置
        日志输出级别至少为warn
        需要关闭第三方组件不恰当日志
    高并发访问数据库引发的故障
        首页不应该访问数据库,从缓存或者搜索引擎服务器获取
    高并发情况下锁引发的故障
        使用锁操作要谨慎
    缓存引发的故障
        缓存不能随便关闭,否则会出现缓存雪崩,网站瘫痪
    应用启动不同步引发的故障
        应用准备好再启动前端请求
    大文件读写独占磁盘引发的故障
        存储的使用需要根据不同文件类型和用途进行管理
    滥用生产环境引发的故障
        访问线上生产环境要规范,不小心会导致重大事故
        线上数据库执行脚本要规范
    不规范的流程引发的故障
        代码提交前使用diff命令进行代码比较,确认没有提交不该提交的代码
        加强code review
    不好的编程习惯引发的故障
        输入的对象要判空
        调用方法时对象不能为null
        必要时构造空对象


                


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星月IWJ

曾梦想杖键走天涯,如今加班又挨

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值