架构一词,比较飘渺,隐藏在代码的背后,似有似无。大家对于架构师这个职位也褒贬不一。大型网站不是设计出来的,而是逐步发展演化过来的。
什么是架构?
最高层次的规划,难以改变的决定,这些规划和决定奠定了事物未来发展的方向和最终的蓝图。
什么是软件系统架构?
有关软件系统整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。
关于架构师?(发现问题à寻找突破à提出问题à寻求支持à解决问题à达成绩效)
关注人而不是产品,需找一个值得共同奋斗的目标,营造一个让大家都能最大限度发挥自我价值的工作氛围;
发掘人的优秀;
当大家不再讨论架构的时候,表明架构已经融入到项目、系统和开发者中了;
成就他人,做成一个项目不但要给客户创造价值,为公司盈利,还要让项目成员获得成长;
架构师最大的价值不在于掌握了多少先进的技术,而在于将一个大系统切分为N个低耦合的子模块的能力,这些子模块包含横向的业务模块,也包含纵向的基础技术模块,这种能力一部分源自于专业的技术和经验,还有一部分源自架构师对于业务场景的理解,对人性的把握,甚至对世界的认知。
大型网站软件系统的特点
1. 高并发、大流量(这个不用说,要不也不叫大型网站了)
2. 高可用(用户多,所以基本是要求7*24不间断服务了)
3. 海量数据(用户行为中产生的数据会更多)
4. 用户分布广泛,网络情况复杂(这个全国各地的网络情况确实比较复杂)
5. 安全环境恶劣(由于面向的是公众的网络,所以各种安全问题应该都会有)
6. 需要快速变更,发布频繁(互联网公司的节奏一直比较快)
7. 渐进式发展(在做的过程中可能需要多次试错和迭代)
大型网站架构演化过程
1. 初始阶段,这个阶段可能应用服务器、文件服务器、数据库所有的资源都在同一台服务器上
2. 应用服务器和数据库服务器拆分
3. 使用缓存改善网站的性能(貌似互联网架构中,缓存是离不开的话题了)
4. 使用应用服务器的集群来改善网站的并发处理能力(不过一般是同构的集群,伪集群了)
5. 数据库读写分离(由专门的机器提供写服务,专门的机器提供读服务,如果读写比例很大,可以多态读服务器)
6. 使用反向代理和CDN加速网站响应(这两个原理都是缓存,CDN部署在网络提供商的机房,使用户在请求网站服务时,可以在距离自己最近的机房获得数据,反向代理则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器是反向代理服务器,如果反向代理服务器缓存用户的请求资源,可以直接返回给用户)
7. 使用分布式文件系统和分布式数据库系统
8. 使用NOSQL和搜索引擎
9. 业务拆分(这个更多的是业务层面的规划了)
10. 分布式服务(从早起的COM+和CORBA,到后来的SOP架构,目前比较热门的是微服务架构)
大型网站架构演变的价值观
架构的模式
架构的要素
网站的高性能架构
性能测试指标
性能测试的方法
Web前端性能优化
应用服务器性能优化
1) 多线程(线程安全问题:使用无状态的对象、使用局部对象、并发访问资源添加锁)
2) 资源复用(单例模式和对象池<对象创建比较耗时的情况下使用对象池能够提升性能>)
3) 合理使用数据结构
4) JVM中GC的优化
合理使用缓存
服务器集群的Session管理
如何构建高可用服务
高可用网站的软件质量保证
网站运行监控(不允许没有监控的系统上线)
应用服务器集群的伸缩性设计(伸缩性设计几乎是稍微有点规模的网站的必须要求)
负载均衡的算法
分布式缓存的伸缩性设计(上线下线机器,对于整个缓存集群的影响最小)
一致性Hash算法,先构造一个长度为0到2的32次方的整数环,根据节点名称的hash值,将缓存服务器节点放置在Hash环上。
然后根据缓存数据的数据KEY的值计算得到hash值,然后在hash环上顺时针查找距离这个key的hash值最近的缓存服务器节点,从而完成key到服务器的hash映射查找。
在具体应用中,长度为2的32次方的Hash环通常使用二叉树查找来实现,二叉树查找是查找小于查找数的最小数值,树的最右边和最左边节点相连,构成环。
有个小问题,就是新加入节点3(原来有0、1、2三个节点),只影响到节点1,也就是说一部分原来需求访问1的缓存数据现在需要访问节点3,原来的0和2不受影响,这样的话0和2的缓存数据量和压力是1和3的两倍,这种问题咋解决呢?
使用虚拟层的手段,将每台物流缓存服务器虚拟为一组虚拟缓存服务器,将虚拟服务器的hash值放置在hash环上,key在环上先找到虚拟服务器的节点,再得到物流服务器的信息,最终的结果是,新加入一台缓存服务器,将会较为均匀的影响集群中已经存在的所有服务器。例如刚才讨论的问题,新加入的节点3,对应虚拟节点为V30、V31、V32,加入到一致性Hash环中,将影响V01、V12、V13,这三个虚拟节点对应0、1、2三体物理机,这样压力就会均摊。
扩展性和伸缩性的区别
扩展性是针对系统影响最小的情况下,系统功能可持续扩展或提升的能力。
伸缩性,系统通过增加或者减少自身资源规模的方式增强或者减少计算处理事务的能力。
利用消息队列降低系统的耦合性
利用分布式服务来打造可复用的业务平台
1) 臃肿的注册和发现机制
2) 低效的xml序列化手段
3) 开销相对比较高的http远程通信
1) 负载均衡(如何是TCP层面,可以做到软负载)
2) 失效转移
3) 高效的远程通信
4) 整合异构系统
5) 对应用最小侵入
6) 服务版本管理
7) 实时监控
8) 服务降级
9) 服务分组处理
10) 服务流控处理(SLA)
11) 按照机房等机型权重分发请求
网站的安全架构
信息加密技术
1) 例如常见的MD5
2) 输入的任何微小变化可能导致结果完全不同
1) 特点是算法简单,加密解密效率高,系统开销小
2) 缺点是使用同一个密钥,有安全隐患
3) 例如DES算法和RC算法
1) 信息安全传输
a) 发送者A通过公开途径获得信息接受者B的公钥,对信息进行加密,然后通过非安全的通道把密文发送给B
b) B得到密文之后,用自己的私钥解密,获得明文信息
2) 数字签名 (和信息安全传输相反)
a) 签名者用自己的私钥对信息进行加密,然后发送给对方
b) 接收方用签名者的公钥对信息进行解密,获得明文信息,
c) 由于私钥只有签名者拥有,信息具有不可抵赖性,具有签名的性质
3) 常用的算法有RSA,HTTPS中传输的浏览器使用的数字证书实质上是经过权威机构认证的非对称加密的公钥
一些常见的大型网站的故障案例
1) 注意日志的级别
2) 应用程序自己的日志输出配置和第三方组件的日志输出分别配置
1) 数据库做好监控
2) 如果并发特别高的页面,使用缓存,切记不要使用数据库
1) 例如一个单例对象中多处使用了synchronized,这样所有的并发请求都要排队获得唯一的一把锁
2) 在使用锁的时候一定要慎重啊
1) 缓存在提升性能的同时,在数据的一致性和系统的可运维性方面带来了很大的挑战